===== 3. Conociendo el funcionamiento de Linux =====
==== Objetivos ====
Adquirir conocimientos sobre el sistema de inicio, los permisos, los servicios y el manejo de dispositivos del sistema operativo, así como aprender a encontrar la información necesaria para consultar.
==== 3.1. [ ] Estructura de directorios: concepto, árbol de directorios, contenido, proc, dev, sys ====
La estructura del árbol de directorios es muy parecida de una distribución a otra, aunque puede variar sensiblemente. La raíz del sistema operativo es representada simplemente por la barra común "**/**".
La mayoría de las distribuciones adhieren hoy en día al [[http://www.pathname.com/fhs/|Filesystem Hierarchy Standard (FHS)]], que define cómo debe estar compuesto el árbol de directorios, y qué cosa debe ir en cada uno. Así, en un Linux moderno, los directorios de primer nivel y su contenido típicamente son:
* **bin**: comandos binarios esenciales
* **boot**: archivos estáticos necesarios para el arranque, incluyendo el kernel
* **dev**: archivos de dispositivos
* **etc**: configuración del sistema operativo y sus sistemas y servicios
* **home**: directorios de inicio de cada usuario
* **lib**: librerías esenciales del sistemas y módulos del kernel
* **media**: puntos de montaje para medios removibles
* **mnt**: puntos de montaje estáticos
* **opt**: paquetes de software agregados al sistema
* **proc**: sistema de archivos virtual de información del kernel y procesos
* **root**: directorio de inicio del usuario root
* **sbin**: comandos esenciales del sistema
* **selinux**: sistema de archivos virtual de SELinux
* **srv**: datos para servicios provistos por el sistema
* **sys**: sistema de archivos virtual de información del sistema
* **tmp**: archivos temporales
* **usr**: archivos estáticos binarios ejecutables y librerías, manuales, gráficos, ejemplos, de sólo lectura y compartidos para todos los usuarios
* **var**: almacenamiento de datos variables
==== 3.2. [ ] Proceso de arranque: init, runlevels, comandos: service, chkconfig ====
Un aspecto muy importante de los Linux es el sistema de arranque, el cual es simple, configurable, transparente y muy poderoso. El administrador puede personalizar y ajustar cada parte de este proceso con completa seguridad de que las cosas funcionarán como lo desea.
De la misma manera, el proceso de apagado es configurable y adaptable a las necesidades de cada caso.
- La BIOS revisa el sistema y lanza la primera fase del manejador de inicio que reside en el MBR
- El manejador de inicio lanza la segunda fase desde el directorio /boot
- Esta fase es la encargada de cargar el kernel en memoria, lo que cargará los módulos necesarios y montará la partición raíz en modo de sólo lectura
- El kernel transfiere el proceso de inicio al programa /sbin/init
- Éste cargará todos los servicios y herramientas de nivel de usuario, y montará las particiones listadas en /etc/fstab
- Luego de finalizar estos procesos, se presentará al usuario una pantalla de ingreso
Linux provee varios runlevels, del 0 al 6. Cada uno se utiliza para iniciar o detener servicios de manera automática. Así:
* runlevel 0: halt. Es el runlevel que se inicia cuando se desea apagar el equipo
* runlevel 1: single. En este nivel se realizan tareas administrativas especiales, ya que ningún proceso estará corriendo
* runlevel 2: por defecto en Debian y derivados, tanto para modo de texto como modo gráfico
* runlevel 3: por defecto en RedHat y derivados, para modo texto
* runlevel 4: no se usa
* runlevel 5: por defecto en RedHat y derivados, para modo gráfico
* runlevel 6: restart. Se cambia a este runlevel cuando se desea reiniciar el equipo
Para controlar los diferentes runlevels, se utilizan los comandos **shutdown** y **telinit**, a saber:
* shutdown: para apagar o reiniciar el equipo
* Reiniciar: shutdown -r now
* Apagar: shutdown -h now
* telinit: para cambiar de runlevel. P. ej. para cambiar a runlevel 1: telinit 1
Los servicios del sistema pueden iniciarse, reiniciarse y detenerse con el comando **service**. La configuración respecto a qué servicio se iniciará o detendrá automáticamente en los diferentes runlevels, se realiza con el comando **chkconfig**.
Por ejemplo, para reiniciar el servidor SSH:
/sbin/service sshd restart
Para revisar en qué runlevels se iniciará este demonio:
chkconfig --list sshd
Configurar su inicio en los runlevels 2, 3, 4 y 5:
chkconfig --level 2345 sshd on
Para configurar que no inicie en dichos runlevels:
chkconfig --level 2345 sshd off
==== 3.3. [ ] Permisos, usuarios y grupos ====
El sistema de permisos de Linux es sumamente simple, práctico, eficiente y seguro. Se basa en permisos de archivos, y usuarios y grupos propietarios de los mismos.
Para cada entrada de un sistema de archivos, sea archivo o directorio, hay un indicador de tipo, y tres grupos de permisos:
dr-xr-xr-x. 2 root root 4096 may 11 20:45 /bin
* El primer carácter, **d** en este caso, indica que es un directorio
* Los tres siguientes **r-x**, son los permisos para el propietario
* Los tres del medio **r-x**, son los permisos para el grupo propietario
* Los últimos tres **r-x**, son los permisos para "otros", es decir, para aquellos usuarios que no son el propietario ni pertenecen al grupo propietario
* El número **2** que sigue indica, si es un directorio la cantidad de subdirectorios que contiene, incluyendo **.** y **..**; si es un archivo, indica la cantidad de hardlinks existentes para el mismo
* La primer palabra **root** es el propietario, en este caso el usuario root
* La segunda palabra **root** es el grupo propietario
* El valor numérico, **4096** en este caso, es el número de bloques ocupados. Si fuese un archivo, indica el tamaño del mismo
* Luego viene la fecha y hora de modificación
==== 3.4. [ ] Montando y desmontando sistemas de archivos ====
Montar un sistema de archivos significa hacer visibles al operador los archivos contenidos en él. Esos archivos pueden estar en un dispositivo de almacenamiento local, extraíble o no, o ser exportados por un servidor remoto, entre otras posibilidades.
Para montarlo, se necesita un directorio vacío creado al efecto, que se denomina **punto de montaje**. Estos directorios habitualmente son creados dentro del directorio /mnt.
Por ejemplo, para montar un pendrive:
mkdir /mnt/pendrive
Insertar luego el pendrive en un puerto USB, y montarlo:
mount /dev/sdb1 /mnt/pendrive
Donde **sdb1** es el nodo asignado al mismo por el kernel, cosa que se puede ver en el archivo **/var/log/messages**, o bien ejecutando un **cat /proc/partitions**
==== 3.5. [ ] Servidores: definición, demonios, posibilidades, iniciando y deteniendo demonios ====
Además de al equipo físico, se llama **servidor** a un proceso que brinda servicios de diferente índole. También se lo denomina **demonio**.
Ejemplos son los servicios Apache, Samba, NFS, Bind9, DHCP, y muchos otros. Así, el servicio HTTP provisto por Apache, es brindado por el demonio **httpd**; el servicio DNS ofrecido por Bind9, es brindado por el demonio **named**.
El objetivo del servidor físico es centralizar la información, así como la configuración, de los servicios que son provistos a las estaciones cliente.
En la mayoría de los Linuxes modernos, los servicios se controlan con el comando service.
Para ver el estado de un servicio:
service sshd status
Para detenerlo e iniciarlo:
service sshd stop
service sshd start
==== 3.6. [ ] Servicios más comunes en un servidor: Samba, NFS, httpd, DHCP, proxy, firewall, SSH, mail, impresión, DNS, FTP, virtualización ====
Entre muchos otros servicios importantes hoy día, algunos comunes, prácticos y confiables son:
* **Samba**: provee compartición de archivos e impresoras, principalmente para estaciones Windows. Puede simular un Primary Domain Controller completo en la versión 4, mientras que en la 3 provee la mayoría de las funciones, pero es más limitado
* **NFS**: provee compartición de archivos para clientes Linux y Unix
* **httpd**: provee como su nombre lo indica protocolo HTTP/HTTPS. Los más usados son **Apache** y **Nginx**
* **DHCP**: ofrece configuración dinámica de hosts. En conjunto con un DNS, permite configurar una red por completo con asignación dinámica de IPs a nombres de host
* **proxy**: permite almacenar localmente archivos descargados de Internet, de manera que al ser accedidos nuevamente pasen desde el servidor directamente a la estación cliente, sin tener que ser descargados nuevamente. Además, provee permisos de acceso a Internet, así como otros servicios. El más usado es **Squid**
* **firewall**: controla el tráfico de red de entrada y salida, bloqueando accesos no permitidos y permitiendo la salida o entrada de conexiones según reglas preestablecidas, entre otras posiblidades
* **SSH**: brinda acceso encriptado a servidores, proveyendo al mismo tiempo una gran funcionalidad relacionada a la administración remota de los mismos
* **mail**: ofrece administración de correo electrónico, ruteo de entrada y salida, permisos, almacenamiento, filtro de spam y virus, entre otros servicios. Como SMTP puede mencionarse a Postfix y Exim, y como demonios POP3/IMAP a **Cyrus**, **Courier** o **Dovecot**.
* **DNS**: resuelve nombres de host en su o sus respectivas direcciones IP, y viceversa. En conjunto con DHCP resulta muy útil para administrar intranets complejas
* **FTP**: provee transferencia simple de archivos
* **virtualización**: es la capacidad de emular por software algún tipo de hardware. Permite aprovechar realmente un servidor físico, instalando máquinas virtuales, cada una con diferentes sistemas operativos y variado software. Algunos sistemas de virtualización son **KVM**, **Xen** y **vserver**.
==== 3.7. [ ] Shell : Introduccion, Filosofia de trabajo, multitarea Basica====
Se llama **shell**, **terminal**, **intérprete de comandos** o **línea de comando**s a una [[http://es.wikipedia.org/wiki/Shell_de_Unix|interfaz de texto para interactuar con el sistema operativo]].
El usuario dirige el sistema operativo mediante el envío de comandos como texto a un intérprete.El intérprete también permite escribir scripts que constan de uno de o más de esos comandos, y que se ejecutan llamándolos por su nombre.
Los shells más comunes son Bourne Again Shell (Bash) y C Shell (Csh). Hay muchos otros, cada uno con sus características particulares.
Estas interfaces han sido desarrolladas desde fines de los años 60 y principios de los 70 en forma estable, conservada, y con claros objetivos de confiabilidad y seguridad, a la vez que explotan toda la potencia del sistema subyacente y sus diferentes características: kernel, sistema de archivos, multitarea, multiusuario, etc.
El principio básico de la línea de comandos es lograr la interacción con el sistema operativo rápida y eficazmente, consumiendo lo menos posible de recursos, concentrándose en la resolución de los temas de manera estable, confiable y segura. Permite resolver cualquier situación de manera local o remota sabiendo con absoluta certeza cómo va a responder el sistema operativo, y cómo va a ser el resultado de la interacción.
Algunas características básicas y ejemplos:
* Multitarea: permite ejecutar tareas simultáneamente en una sola línea y mientras se ejecutan seguir trabajando (**&**)cd /usr ; tar czf /tmp/bin.tar.gz ./bin & tar czf /tmp/lib.tar.gz ./lib &
* Alias: creación de comandos personalizados mediante el uso de aliases (comando **alias**) alias listado="ls -la --color=auto"
* Redireccionamiento de entrada/salida: en Linux hay siempre tres archivos abiertos: **stdin** (el teclado), **stdout** (la pantalla), y **stderr** (mensajes de error enviados a la pantalla)
* Redireccionar stdout a un archivo: ps axu > psaux.txt
* Redireccionar stderr a un archivo: grep lalala * 2> grep-errores.txt
* Redireccionar stderr y stdout a un archivo: grep lalala * &> grep-salidayerrores.txt
* Tuberías (pipes): se puede utilizar la salida estándar de un comando como la entrada de otro (**|**) ps aux | grep syslog
==== 3.8. [ ] Documentación: dónde, cómo, qué, páginas man, ayuda de comandos ====
La documentación disponible sobre Linux y sus comandos es amplísima en la mayoría de los casos. Se recomienda acceder a la documentación en los sitios oficiales de cada proyecto.
Por ejemplo, en el caso de la última versión de Apache Tomcat la misma está disponible en http://tomcat.apache.org/tomcat-7.0-doc/
Asimismo, la documentación de la última versión de MySQL se encuentra en http://dev.mysql.com/doc/refman/5.6/en/index.html
Hay muchísima documentación, alguna de excelente calidad, creada y mantenida por terceros. En estos casos se puede buscar como referencia de otros, y ver los comentarios respecto a la seriedad del enlace.
Por ejemplo la [[http://www.tldp.org/LDP/abs/html/|Advanced Bash-Scripting Guide]] es la referencia obligada de programación de Bash. Otro ejemplo son los tutoriales escritos por Falko Timme y varios otros autores en http://www.howtoforge.com/
Los comandos suelen tener una ayuda en línea, accesible generalmente con el modificador **--help**, **-help** o **-h**. Por ejemplo, para visualizar la ayuda básica del comando grep: grep --help
Además, en el propio sistema operativo ya instalado, se dispone de las **páginas man**. Éstos son manuales de cada comando, archivo de configuración, funciones, llamadas y otros, disponibles con el comando **man**.
Ejemplos:
* Uso del comando grep: man grep
* Archivo de configuración yum.conf man yum.conf
Existe otro manual, interactivo y generalmente más desarrollado, que es denominado **manual Texinfo** o **páginas info**. Por ejemplo, para acceder a un extenso manual del intérprete Bash: info bash
==== 3.9. [ ] Dispositivos: reconocimiento, módulos y parámetros, cargar y descargar módulos. Problemas de permisos. Comandos modprobe, insmod, rmmod, lsmod ====
Se denomina "módulo" o "driver" a un archivo binario que es cargado junto al kernel, y que permite el acceso a un dispositivo, sistema de archivo o nueva funcionalidad, entre otros.
Los comandos para realizar estas tareas son:
* modprobe: carga un módulo, realizando las tareas necesarias para que funcione adecuadamente, por ejemplo, cargando otro que es requerido. Ej.: modprobe snd_intel8x0
* insmod: instala un módulo, especificando si es necesario opciones para el mismo. Como no resuelve dependencias, generalmente se lo usa en situaciones específicas
* lsmod: lista los módulos cargados con el kernel
La configuración de los módulos, así como blacklisting y otras tareas, se realiza con los archivos de configuración existentes dentro de /etc/modprobe.d/
==== Bibliografía ====
* Debian GNU/Linux Installation Guide: https://www.debian.org/releases/stable/amd64/
* Debian Reference: https://www.debian.org/doc/manuals/debian-reference/
* Red Hat System's Administrator Guide: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/index.html
* Filesystem Hierarchy Standard: http://www.pathname.com/fhs/