Administrador de Sistemas GNU/Linux
- AUTHOR: Osiris Alejandro Gómez
- EMAIL: osiris@gcoop.coop
- DATE: 2014-01-20 11:56
Filosofía UNIX
- UNIX* incorpora un conjunto de herramientas que guardan cierta analogía con una navaja multiusos. Son simples, pero hacen muy bien su trabajo. En lugar de construir programas muy complejos, *UNIX* proporcionaba muchas pequeñas herramientas, y un esquema para poder combinarlas de forma efectiva. Este diseño escala muy bien, permitiendo al sistema crecer, incorporar nuevas herramientas y, a la vez, ser compatible hacia atrás.
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:
- Lo pequeño es hermoso.
- Haz que cada programa haga una sola cosa, pero que la haga bien.
- Construye un prototipo lo antes posible.
- Elige portabilidad sobre eficiencia.
- Guarda los datos en archivos de texto plano.
- Aprovecha funcionalidades del software.
- Usa *scripts* de *shell* para aumentar la funcionalidad y portabilidad.
- Evita interfaces de usuario captivas.
- Haz de cada programa un filtro.
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:
- Que cada programa realice únicamente la tarea para la que fue creado y la haga bien.
- Para llevar a cabo una nueva tarea escribe un programa nuevo. No compliques uno viejo añadiendo nueva funcionalidad.
- Escribe tu programa teniendo en cuenta que su salida probablemente sea la entrada de otro programa.
- Guarda los datos en archivos de texto plano. Si necesitas seguridad, confía en los permisos.
- Usa nombres cortos y en minúscula.
- En la manera de lo posible haz que el usuario suministre los datos por línea de comandos en la llamada.
- Haz partes simples conectadas mediante interfaces limpias y bien definidas.
- Céntrate en los datos.
- Claridad mejor que complejidad. La solución más simple es frecuentemente la mejor.
- Portabilidad mejor que eficiencia.
- Piensa en paralelo. Hay otros procesos en el mundo, incluso instancias de tu mismo programa funcionando al mismo tiempo.
- Hacer programas grandes, solo cuando se demuestre que no se puede realizar con uno pequeño.
- Si no hay nada interesante que decir, que el programa mejor no diga nada.
- Para cada problema existen múltiples soluciones.
- Diseña pensando en el futuro (esta cercano). Esto nos ofrece compatibilidad y mayor tiempo de utilización.
- Programa de abajo hacia arriba y de conocimiento pragmático.
- Programa basado en el conocimiento Empírico o Experiencia.
- No se encuentra en los métodos y las normas oficiales, sino en el medio-reflexivo implícito, el conocimiento.
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
Enviar la salida de errores a un archivo
Enviar la salida estándar y la salida de errores a un mismo archivo
Enviar la salida de errores a la salida estándar
Enviar la salida de estándar a `/dev/null`
Enviar la salida de estándar y la salida de errores a `/dev/null`
Enviar un archivo a la entrada estándar
Enviar la salida estándar a un archivo y a la salida estándar
Enviar la salida estándar de un comando como la entrada estándar de otro comando
`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
`$` 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
- http://www.tomontime.com/[1]
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
Pomodoro
`TODO`
Autofocus
`TODO`
Kanban
`TODO`