💾 Archived View for gmi.osiux.com › linux-sysadmin.gmi captured on 2024-05-26 at 14:43:35. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2023-09-28)

-=-=-=-=-=-=-

Administrador de Sistemas GNU/Linux

Filosofía UNIX

Los objetivos con que se creó determinaron una *filosofía* de *UNIX* caracterizada por:

comandos cortos, simples, específicos y muy eficientes, que "hacen una sola cosa pero la hacen muy bien".

entrada y salida estandarizadas que permiten la interconexión de comandos. Esto se llama entubamiento (*pipelining*): la salida de un comando es tomada por el siguiente como entrada.

Algunas directivas son:

Escribe programas que hagan una sola cosa y la hagan bien: esto quiere decir que los programas deben de ser lo más atómicos posible y que se compruebe mucho su rendimiento y funcionamiento para hacerlo lo mejor posible.

Escribe programas que trabajen juntos: de nada sirve escribir programas que sirvan para una tarea específica y que, después, cuando esa tarea se modifique de cierta forma, haya que reescribir todo el programa.

Es mejor dividir el problema en varios programas y después desechar o reescribir solo uno de esos pequeños programas, cuando se necesite, o incluso hacer nuevos.

Escribe programas que manejen flujos de texto, pues esa es la interfaz universal: todo lo que se hace con entrada y salida en formato textual es más fácil de enlazar con otros programas, así como reutilizarla en el pasado, presente y futuro.

En estos conceptos se basa la mayoría del software libre existente, por lo que servidores como `sendmail` o `postfix`, están diseñados en pequeños servidores y/o programas que hacen partes de todo un proceso y, mediante sus ficheros de configuración, se pueden enlazar de una u otra forma, así como usar otros programas y/o servidores en lugar de los que vienen por defecto y, así, extender su funcionalidad.

Sobre *filosofía Unix*, de una forma más extensa, *Mike Gancarz*, escribe las siguientes líneas:

La *filosofía UNIX* supone crear programas rápidos, simples, con poca intervención por parte del usuario, o en caso de necesitarla, esta se produzca al principio o lo más mínima posible. Esta se acopla perfectamente a las necesidades de computación de los laboratorios científicos, puesto que *Unix* fue originalmente desarrollado en uno de estos.

A continuación algunas premisas:

En resumidas cuentas la *filosofía Unix* se puede describir como bien lo dice *Doug Mcllroy*:

"Escribe programas que hagan una cosa y la hagan bien, que trabajen en armonía con otros y que manejen flujos de texto, pues esta es una interfaz universal." - *Doug Mcllroy*

"Aquellos que no pueden entender UNIX, están condenados a reinventarlo, pobremente." - *Henry Spencer*, 1987

Linux por dentro, jerarquías de directorios

/
+-- bin         binarios
+-- boot        inicio del sistema, imágenes del kernel
+-- dev         dispositivos, presentes y futuros
+-- etc         configuraciones
+-- home        directorios personales de los usuarios
+-- lib         bibliotecas
+-- lost+found  archivos y/o cadenas perdidas
+-- media       dispositivos extraerles
+-- mnt         dispositivos montados
+-- opt         binarios fuera de la distro
+-- proc        procesos en ejecución
+-- root        directorio personal del /root/
+-- run         archivos de procesos en ejecución
+-- sbin        binarios del sistema
+-- selinux     secure linux
+-- srv         servicios ej: ftp
+-- sys         system
+-- tmp         temporales
+-- usr         archivos compartidos
+-- var         archivos que varían de tamaño, ej: logs

Todo es un archivo, conociendo `/proc` y `/dev`

`/proc`

Es un pseudo-sistema de ficheros que se usa como interfaz para las estructuras de datos del núcleo en lugar de leer e interpretar /dev/kmem. La mayor parte de este sistema de ficheros es de sólo lectura, pero algunos ficheros permiten cambiar variables del núcleo.

`/proc/partitions`

Podemos ver las particiones que leyó el *kernel*:

cat /proc/partitions

#+RESULTS:

major minor  #blocks  name

:

   8        0  488386584 sda
   8        1   52428800 sda1
   8        2   52428800 sda2
   8        3  383527960 sda3
  11        0    1048575 sr0
 254        0  383525912 dm-0

`/proc/uptime`

El `uptime` de nuestro equipo puede ser consultado directamente en `/proc/uptime`,

cat /proc/uptime

#+RESULTS:

1901728.32 3010323.20

Si utilizamos el comando `uptime`, éste lee el valor expresado en **epoc** (segundos que pasaron desde el 01/01/1970) y nos informa hace cuántos días y horas nuestro servidor está prendido, además de informar otros valores, como la cantidad de usuarios y el **average**:

uptime

#+RESULTS:

 10:53:05 up 22 days, 15 min,  6 users,  load average: 1,63, 1,70, 1,58

`/dev`

Aquí se encuentran todos los dispositivos del sistema, presentes y futuros.

`/dev/null`

Este dispositivo es muy especial y sumamente útil, es un agujero negro, todo lo que se envía a `/dev/null` desaparece

ls -lh /dev/null

#+RESULTS:

crw-rw-rw- 1 root root 1, 3 ene 20 10:37 /dev/null

Si enviamos algo y luego miramos con un `ls` no vemos que se incremente el tamaño del archivo:

echo "hola" >/dev/null
ls -lh /dev/null

#+RESULTS:

crw-rw-rw- 1 root root 1, 3 ene 20 10:37 /dev/null

`/dev/sdX`

Los discos están identificados con el prefijo `sd`, luego una letra `a`, `b`, `c`, etc y finalmente un número `1`, `2`, `3`, etc que identifica la partición:

Listamos el disco `sda`

ls /dev/sda*

#+RESULTS:

/dev/sda
/dev/sda1
/dev/sda2
/dev/sda3

Vemos si esta montado `sda`:

mount | grep sda

#+RESULTS:

/dev/sda1 on /mnt/sda1 type ext4 (rw,relatime,user_xattr,barrier=1,data=ordered)

Visualizamos el espacio disponible:

df -h | grep sda

#+RESULTS:

/dev/sda1                                                 50G    14G   34G  29% /mnt/sda1

Entrada estándar, Salida estándar y Tuberías

Descriptores de archivos

Existen 3 descriptores básicos de archivos:

┌─────┬──────────┬───────────────────┐
│     │          │                   │
╞═════╪══════════╪═══════════════════╡
│ `0` │ `stdin`  │ entrada estándar  │
├─────┼──────────┼───────────────────┤
│ `1` │ `stdout` │ salida estándar   │
├─────┼──────────┼───────────────────┤
│ `2` │ `stderr` │ salida de errores │
└─────┴──────────┴───────────────────┘

Es posible redireccionar cada uno de éstos descriptores mediante los operadores `>`, `<` y `|`

Enviar la salida estándar a un archivo

[IMG]

Enviar la salida de errores a un archivo

[IMG]

Enviar la salida estándar y la salida de errores a un mismo archivo

[IMG]

Enviar la salida de errores a la salida estándar

[IMG]

Enviar la salida de estándar a `/dev/null`

[IMG]

Enviar la salida de estándar y la salida de errores a `/dev/null`

[IMG]

Enviar un archivo a la entrada estándar

[IMG]

Enviar la salida estándar a un archivo y a la salida estándar

[IMG]

Enviar la salida estándar de un comando como la entrada estándar de otro comando

[IMG]

`stdout`

Buscar el texto **model** en el archivo `/proc/cpuinfo` y enviar el resultado a un nuevo archivo llamado `/tmp/cpu` que contendrá únicamente las líneas que coinciden con el texto **model**:

grep model /proc/cpuinfo > /tmp/cpu
cat /tmp/cpu

#+RESULTS:

model      : 28
model name : Intel(R) Atom(TM) CPU D425   @ 1.80GHz
model      : 28
model name : Intel(R) Atom(TM) CPU D425   @ 1.80GHz

Buscar el texto **cache** en el archivo `/proc/cpuinfo` y agregar el resultado al archivo `/tmp/cpu`

grep cache /proc/cpuinfo >> /tmp/cpu
cat /tmp/cpu

#+RESULTS:

model      : 28
model name : Intel(R) Atom(TM) CPU D425   @ 1.80GHz
model      : 28
model name : Intel(R) Atom(TM) CPU D425   @ 1.80GHz
cache size : 512 KB
cache_alignment    : 64
cache size : 512 KB
cache_alignment    : 64

`stderr`

Enviar la salida con errores a `/dev/null`:

xkcd 2>/dev/null

Redireccionar la salida con errores a la salida estandar:

echo "xkcd" | grep 2>&1

pipes

El símbolo `|` es usado para redireccionar la salida de un comando a la entrada de otro comando.

Ejemplo:

Lista el directorio `/var/log` ordenando los archivos más nuevos al principio y muestra sólo las primeras 10 líneas mediante el comando `head`

ls -lht /var/log | head

total 14M
-rw-rw-r-- 1 root              utmp       107K feb 10 20:46 wtmp
-rw-r----- 1 root              adm        769K feb 10 20:45 mail.info
-rw-r----- 1 root              adm        769K feb 10 20:45 mail.log
-rw-r----- 1 root              adm        356K feb 10 20:45 syslog
-rw-r----- 1 root              adm        337K feb 10 20:45 auth.log
-rw-r----- 1 root              adm        3,1K feb 10 19:49 messages
-rw-r----- 1 root              adm        2,9K feb 10 19:49 kern.log
-rw-r--r-- 1 root              root        29K feb 10 16:42 Xorg.0.log
-rw-r----- 1 root              adm        1,9K feb 10 16:42 daemon.log

lista el directorio `/var/log` mostrando el tamaño de cada archivo, se filtra el resultando por Megabytes (`M`), luego ordena de mayor a menor y finalmente limita la lista a los primeros 10 archivos que más espacio ocupan, incluyendo el total del directorio:

cd /var/log;du -ch *  | grep M | sort -nr | head

#+RESULTS:

496M total
468M atop
15M  installer
14M  installer/cdebconf
3,3M mail.log.1
3,3M mail.info.1
1,5M auth.log.1

Comandos básicos de terminal

Directorios:

El separador de archivos y directorios es la barra `/`

ejemplos:

/              directorio raíz (*root*)
/etc           directorio usr (sub-directorio de la raíz =/=)
/etc/apache2   apache2 subdirectorio de /etc

Moviéndose en el sistema de archivos:

1.

`pwd`

Muestra el directorio actual.

2.

`cd`

Cambia al directorio definido en `HOME`

3.

`cd /etc/php5`

Cambia el directorio actual a `/etc/php5`

4.

`cd apache2`

Cambia al subdirectorio `apache2` del directorio actual

5.

`cd ..`

Cambia al directorio inmediato superior

6.

`cd $HOME`

Cambia al directorio definido en la variable `HOME`

7.

`cd ~osiris`

Cambia al directorio del usuario osiris

Listar directorios:

1.

`ls -l`

Listar en formato ancho, de esta manera se visualizan gran parte de los atributos de cada archivo y/o directorio

$ ls -l

-rw-rw-r-- 1 osiris www-data      612 nov  1 19:29 redes.html
-rw-rw-r-- 1 osiris www-data    11457 nov  1 19:31 scrum.html
-rw-rw-r-- 1 osiris www-data     6556 abr 24  2013 ssh.gmi
-rw-rw-r-- 1 osiris www-data      609 abr 24  2013 graphviz.gmi
-rw-rw-r-- 1 osiris www-data    17326 abr 24  2013 gnuplot.gmi
-rw-rw-r-- 1 osiris www-data    11457 nov  1 19:31 tmp
^ ^  ^  ^  ^ ^           ^          ^ ^      ^     ^
| |  |  |  | |           |          | |      |     |
| |  |  |  | propietario grupo tamaño fecha  hora  nombre
| |  |  |  número de links al archivo o contenido del directorio
| |  |  permisos para todos
| |  permisos para miembros del grupo
| permisos para el propietario del archivo:
|   r     lectura
|   w     escritura
|   x     ejecutar
|   -     ninguno
tipo de archivo:
  -   archivo normal
  d   directorio
  l   enlace simbolico

2.

`ls`

Listar directorio actual

3.

`ls -a`

Listar directorio actual incluyendo archivos ocultos (comienzan con `.`)

Cambiando permisos y atributos

r = read        4
w = write       2
x = execute     1

propietario   7 = rwx lectura, escritura y ejecución
grupo         5 = rx- lectura y ejecución
todos         0 = --- ningún permiso

Es necesario ser el propietario del archivo/directorio (o *root*) para realizar el cambio de `usuario` o `grupo`.

`chmod 750 archivo`

Listamos los permisos del archivo `~/.bash_history`

ls -l ~/.bash_history

#+RESULTS:

-rwxr-x--- 1 osiris osiris 326316 feb 10 21:55 /home/osiris/.bash_history

Cambiamos el permiso a `750` y volvemos a listar:

chmod 750 ~/.bash_history
ls -l ~/.bash_history

#+RESULTS:

-rwxr-x--- 1 osiris osiris 326316 feb 10 21:55 /home/osiris/.bash_history

Finalmente cambiamos el permiso a `600` y volvemos a listar:

chmod 600 ~/.bash_history
ls -l ~/.bash_history

#+RESULTS:

-rw------- 1 osiris osiris 326316 feb 10 21:55 /home/osiris/.bash_history

`chgrp grupo archivo`

Establece el grupo al archivo

`chown usuario archivo`

Establece el usuario como propietario del archivo

`chown usuario archivo`

Establece el usuario como propietario del directorio y todo su contenido recursivamente.

Moviendo, renombrando y copiando archivos:o

Copiamos el archivo `~/.bash_history` a `~/.bash_history.bak` y verificamos que sea igual:

ls -lh ~/.bash_history
cp ~/.bash_history ~/.bash_history.bak
ls -lh ~/.bash_history.bak
md5sum ~/.bash_history ~/.bash_history.bak

#+RESULTS:

-rw------- 1 osiris osiris 310K feb 11 11:07 /home/osiris/.bash_history
-rw------- 1 osiris osiris 310K feb 11 11:07 /home/osiris/.bash_history
7b862a967fc7096882583f9a6f662230  /home/osiris/.bash_history
7b862a967fc7096882583f9a6f662230  /home/osiris/.bash_history.bak

#+END_SRC

Movemos el archivo `~/.bash_history.bak` a `~/historial.bak`:

mv -vi ~/.bash_history.bak ~/historial.bak
ls -l ~/.bash_history ~/historial.bak

#+RESULTS:

«/home/osiris/.bash_history.bak» -> «/home/osiris/historial.bak»
-rw------- 1 osiris osiris   316801 feb 11 11:07 /home/osiris/.bash_history
-rw------- 1 osiris www-data 316801 feb 11 11:13 /home/osiris/historial.bak

Renombramos el archivo `~/historial.bak` a `~/historial.log`

mv -vi ~/historial.bak ~/historial.log
ls -l ~/historial.log

#+RESULTS:

«/home/osiris/historial.bak» -> «/home/osiris/historial.log»
-rw------- 1 osiris www-data 316801 feb 11 11:13 /home/osiris/historial.log

Ver y editar arhivos:

`cat`

cat /etc/issue

#+RESULTS:

Debian GNU/Linux 7.0 \n \l

:

`head`

head /proc/meminfo | head

MemTotal:        2062464 kB
MemFree:          872100 kB
Buffers:           56052 kB
Cached:           642468 kB
SwapCached:        10928 kB
Active:           520204 kB
Inactive:         570096 kB
Active(anon):     366124 kB
Inactive(anon):   211844 kB
Active(file):     154080 kB

`head -2`

head /proc/meminfo | head -2

#+RESULTS:

MemTotal:        2062464 kB
MemFree:          871860 kB

`tail`

tail /etc/passwd

hplip:x:106:7:HPLIP system user,,,:/var/run/hplip:/bin/false
pulse:x:107:114:PulseAudio daemon,,,:/var/run/pulse:/bin/false
saned:x:108:118::/home/saned:/bin/false
Debian-gdm:x:109:119:Gnome Display Manager:/var/lib/gdm3:/bin/false
alumno:x:1001:1000:alumno,,,:/home/alumno:/bin/bash
osiris:x:2222:33:OSiRiS,,,:/home/osiris:/bin/bash
sshd:x:110:65534::/var/run/sshd:/usr/sbin/nologin
postfix:x:111:120::/var/spool/postfix:/bin/false
rodrigo:x:1002:1001:Rodrigo Fernandez,,,:/mnt/data/musica:/bin/bash
davfs2:x:112:122::/var/cache/davfs2:/bin/false

tail -2 /etc/passwd

#+RESULTS:

rodrigo:x:1002:1001:Rodrigo Fernandez,,,:/mnt/data/musica:/bin/bash
davfs2:x:112:122::/var/cache/davfs2:/bin/false

`sed`

cat /etc/issue
sed s/"7.0"/"8.0"/g /etc/issue
cat /etc/issue

#+RESULTS:

Debian GNU/Linux 7.0 \n \l

:

Debian GNU/Linux 8.0 \n \l

:

Debian GNU/Linux 7.0 \n \l

:

Expresiones regulares

Se utilizan para definir patrones para la búsqueda y filtrado:

`[a-z]` Minúsculas

Rango de la **a** a la **z**

`[A-Z]` Mayúsculas

Rango de la **A** a la **Z**

`[0-9]` Números

Rango de 0 a 9

`[^..]` Patrón distinto

Negación

`^` comienzo de línea

` gemini - kennedy.gemi.dev fin de línea

`.` cualquier carácter

`?` cero o una aparición

`*` ninguna o muchas repeticiones

`+` una o más repeticiones

Acceso remoto usando ssh

Entornos gráficos, ejecución remota de aplicaciones gráficas

`ssh -X`

Es posible ejecutar una aplicación gráfica de un servidor remoto visualizando en el equipo local por medio de `ssh`, solo es necesario incluir el parámetro `-X` y el servidor *X* se redireciona a nuestro *host*

ssh -X caipiroska 'gnome-calculator'

`DISPLAY\`:0=

Utilizando la aplicación `notify-send` se puede enviar un mensaje de notificación, normalmente es utilizado para visualizar eventos del sistema, y estoy lo podemos hacer en un equipo remoto mediante `ssh`:

ssh -X osiris@localhost "DISPLAY=:0 notify-send 'hola!'"

#+RESULTS:

`vnc4server`

Habitualmente se utiliza **VNC** para compartir la sesión actual, pero también se pueden levantar instancias nuevas, pudiendo tener entornos gráficos diferentes en cada sesión de usuario en el mismo servidor.

Es necesario ejecutar en el servidor:

vnc4server

Procesos

Automatizando tareas: `sleep`, `jobs`, `crontab`

Análisis de tráfico de red con `tcpdump` y `wireshark`

Introducción a las redes TCP/IP

Configuración de servicios básicos

Apache

PHP

MySQL

Postfix

`TODO`

DHCP

`dhcp3`

1.

configuración

Es muy simple la sintaxis del archivo `/etc/dhcp3/dhcpd.conf` donde podemos especificar los sevidores de dns (**domain-name-servers**) entre otros parámetros, lo importante es definir la subred, en el caso de tratarse de una LAN es muy común la siguiente configuración:

dns-update-style none;
option domain-name-servers 200.45.191.35,200.45.48.233;
default-lease-time 6000;
max-lease-time 7200;
log-facility local7;

subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.100 192.168.0.150;
  option routers 192.168.0.1;
}

* Se trata de una red `/24`, es decir que los primeros tres octetos están fijos, tal como indica la máscara de red `255.255.255.0`.

* Se entregarán IPs dinámicamente desde la `192.168.0.100` a la `192.168.0.150`, siendo `192.168.0.1` la IP del `gateway`.

En el mismo archivo se pueden asignar IPs fijas, ingresando la dirección física (**MAC Address**) y la IP elegida:

host syrah {
        hardware ethernet 00:AC:DC:00:CA:FE;
        fixed-address 192.168.0.4;
}

2.

iniciar y detener el servicio

/etc/init.d/dhcp start
/etc/init.d/dhcp stop

Metodologías ágiles de trabajo

Time Management for System Administrators

GTD

Scrum

`TODO`

[DONE]{.done .DONE} Sprint <2012-08-06 lun>--<2012-08-10 vie>

1.

disponibilidad horaria estimada

| | lun | mar | mie | jue | vie | tot | |--------|------|-----|-----|------|-----|------| | diego | 2.5 | 3 | 0 | 1.5 | 3 | 10. | | joac | 3 | 3 | 0 | 1.5 | 3 | 10.5 | | jose | 6 | 6 | 0 | 3 | 6 | 21 | | hugo | 4 | 0 | 0 | 3 | 6 | 13 | | osiris | 3 | 3 | 0 | 3 | 6 | 15 | | | 18.5 | 15 | 0 | 12. | 24 | 69.5 |

#+TBLFM: $7=vsum($2..$6)::@>=vsum(@I..@II)

2.

disponibilidad horaria real

| | lun | mar | mie | jue | vie | tot | |--------|------|-----|-----|------|-----|------| | diego | 2.5 | 3 | 0 | 1.5 | 3 | 10. | | joac | 3 | 3 | 0 | 1.5 | 3 | 10.5 | | jose | 6 | 6 | 0 | 3 | 6 | 21 | | hugo | 4 | 0 | 0 | 3 | 6 | 13 | | osiris | 3 | 3 | 0 | 3 | 6 | 15 | | | 18.5 | 15 | 0 | 12. | 24 | 69.5 |

#+TBLFM: $7=vsum($2..$6)::@>=vsum(@I..@II)

3.

estimado versus real

#+tblname: scrum-2012-08-06

| fecha | est | real | pend est | pend real | |------------|------|------|----------|-----------| | 2012-08-05 | 0 | 0 | 34.75 | 34.75 | | 2012-08-06 | 9.25 | 9 | 25.5 | 25.75 | | 2012-08-07 | 7.5 | 7.5 | 18. | 18.25 | | 2012-08-08 | 0 | 0 | 18. | 18.25 | | 2012-08-09 | 6 | 6 | 12. | 12.25 | | 2012-08-10 | 12 | 4 | 0. | 8.25 |

#+TBLFM: $4=@-1-$2::@2$4=vsum(@I$2..@II$2)-$2::@3$2=18.5/2::@3$5=@-1-$3::@4$2=15/2::@4$5=@-1-$3::@5$5=@-1-$3::@6$5=@-1-$3::@7$5=@-1-$3

4.

burndown

[IMG]

Pomodoro

`TODO`

Autofocus

`TODO`

Kanban

`TODO`

Aplicaciones de Consola

1: http://www.tomontime.com/