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:

pwd

Muestra el directorio actual.

cd

Cambia al directorio definido en HOME

cd /etc/php5

Cambia el directorio actual a /etc/php5

cd apache2

Cambia al subdirectorio apache2 del directorio actual

cd ..

Cambia al directorio inmediato superior

cd $HOME

Cambia al directorio definido en la variable HOME

cd ~osiris

Cambia al directorio del usuario osiris

Listar directorios:

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

ls

Listar directorio actual

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

$ 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

## 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

* http://www.tomontime.com/[1]

## GTD

## Scrum

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

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)

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)

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

burndown

=> [IMG]

Pomodoro

## Autofocus

Kanban

Proxy Information
Original URL
gemini://gmi.osiux.com/linux-sysadmin.gmi
Status Code
Success (20)
Meta
text/gemini;lang=es_AR
Capsule Response Time
1571.20105 milliseconds
Gemini-to-HTML Time
5.162329 milliseconds

This content has been proxied by September (3851b).