💾 Archived View for gmi.osiux.com › linux-sysadmin.gmi captured on 2024-08-25 at 00:28:16. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2023-09-28)
-=-=-=-=-=-=-
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
/ +-- 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
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.
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
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
Aquí se encuentran todos los dispositivos del sistema, presentes y futuros.
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
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
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 `|`
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
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
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
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
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
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 `.`)
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`.
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
Establece el grupo al archivo
Establece el usuario como propietario del archivo
Establece el usuario como propietario del directorio y todo su contenido recursivamente.
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
cat /etc/issue
#+RESULTS:
Debian GNU/Linux 7.0 \n \l
:
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 /proc/meminfo | head -2
#+RESULTS:
MemTotal: 2062464 kB MemFree: 871860 kB
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
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
:
Se utilizan para definir patrones para la búsqueda y filtrado:
Rango de la **a** a la **z**
Rango de la **A** a la **Z**
Rango de 0 a 9
Negación
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'
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:
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
`TODO`
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
`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
`TODO`
`TODO`
`TODO`