===== 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/