Vous êtes sur la page 1sur 174

ADMINISTRACION LINUX 1

1
Breve introducción al linux, al código GNU
Comparaciones entre código libre y código comercial.

Comandos básicos para manejar la consola, el editor de textos vi

Instalación y particionamiento de linux.

• Introducción al sistema operativo Linux Recurso


• El kernel de linux Recurso
• Emulación de otros sistemas Recurso
• Distribuciones Recurso
• Iniciando y cerrando la sesión de trabajo en Linux Recurso
• El sistema de archivos Linux Recurso
• El árbol de directorio de Linux Recurso
• Manejo del shell BASH Recurso
• Sistema de ayuda Recurso
• uso del editor de texto vi Recurso
• Instalación del Sistema Operativo Recurso
• Sugerencias para un correcto particionamiento Recurso
• Diagrama de migración Recurso
• Tarea de la Semana 1
• Bibliografía Recurso

2
Recuperación del sistema operativo ante desastres.
Manejo de usuarios y permisos, delegación de tareas del superusuario y manejo de
cuotas de disco.

• Recuperación en Caso de desastres Recurso


• Bibliografía adicional Recurso
• 3- Gestión de usuarios y permisos
• Creación y administración de usuarios y grupos de usuarios Recurso
• Permisos de lectura, escritura y ejecución Recurso
• Delegación de tareas de superusuario Recurso
• Opciones del mount Recurso
• Tarea de la Semana 2

3
Gestión de procesos
Herramientas de monitoreo
Trabajo con servicios
Arranque y parada de linux

• 4- Gestión de procesos
• Conceptos de la Gestión de procesos Recurso
• Procesos, /proc y control de procesos Recurso
• Herramientas para monitoreo y trabajo con procesos Recurso
• Otras herramientas de monitoreo Recurso
• 5- Sistema de inicio y finalización del sistema (SysV)
• Conceptos Recurso
• Niveles de ejecución Recurso
• Descripción y localización de los servicios Recurso
• ntsysv, chkconfig y service Recurso
• Demonios del sistema Recurso
• Arranque y parada de linux Recurso
• Bibliografía adicional Recurso
• Tarea de la semana 3

4
Respaldos, herramientas para crear respaldos, trabajo con los discos.
Utilerías para programar tareas

• 6- Gestión de unidades de almacenamiento y sistemas de archivos


• Conceptos Generales Recurso
• Añadir/Eliminar particiones Recurso
• Chequeando el disco Recurso
• Accediendo a disketes formateados con DOS Recurso
• Compresión de archivos Recurso
• Trabajo con imágenes y CD Recurso
• Optimizando accesos a disco Recurso
• Herramientas para realizar respaldos Recurso
• Realizando respaldos en linux Recurso
• 7- Automatización de tareas
• cron Recurso
• anacron Recurso
• at Recurso
• Bibliografía adicional Recurso
• Tarea de la semana 4

"GNU / LINUX" o "LINUX" ?


El proyecto GNU fue iniciado por Richard Stallman en 1984, con el objetivo de crear
un sistema operativo completo libre: el sistema GNU, basado en el sistema operativo
UNIX (UNIX fue creado en 1970). Richard Stallman publicó un artículo conocido
como el "Manifiesto GNU", en el que estableció sus motivaciones para realizar el
proyecto GNU, entre las que destaca "retornar al espiritu de cooperación que prevaleció
en los tiempos iniciales de la comunidad de usuarios de computadoras". GNU es un
acrónimo recursivo que significa "GNU No es Unix". Stallman sugiere que se
pronuncie, en inglés, como "guh-noo" (se puede observar que el logo es un ñu) para
evitar confusión con "new" (nuevo). En español, GNU se pronuncia fonéticamente (Ge
Ene U).

Para asegurar que el software GNU permaneciera libre para que todos los usuarios
pudieran "ejecutarlo, copiarlo, modificarlo y distribuirlo", el proyecto debía ser liberado
bajo una licencia diseñada para garantizar esos derechos al tiempo que evitase
restricciones posteriores de los mismos. La idea se conoce en Inglés como copyleft (en
clara oposición a copyright), y está contenida en la Licencia General Pública de GNU
(GPL).

El proyecto GNU desarrolló varios programas incluyendo compiladores, utilitarios,


intérpretes de comandos, pero no ha completado (hasta esta fecha, mediados de 2009)
un núcleo (los programas para administrar memoria, procesos, archivos, periféricos,
seguridades).

En 1991, Linus Torvalds empezó a escribir su núcleo Linux y decidió distribuirlo bajo
la GPL. Rápidamente, múltiples programadores se unieron a Linus en el desarrollo,
colaborando a través de Internet y consiguiendo paulatinamente que Linux llegase a ser
un núcleo compatible con UNIX. En 1992, el núcleo Linux fue combinado con el
sistema GNU, resultando en un sistema operativo libre y completamente funcional. El
sistema operativo formado por esta combinación es usualmente conocido como
"GNU/Linux" o como una "distribución Linux" y existen diversas variantes. (Ver
también: Controversia por la denominación GNU/Linux)

Una distribución Linux (o mejor GNU/Linux) es entonces un conjunto de programas


creados por el proyecto GNU, o por otros desarrolladores que se apoyan en la licencia
GPL o LGPL, y el núcleo desarrollado por Linus Torvalds.

Desde su primer lanzamiento, GNU/Linux ha incrementado su popularidad en el


mercado de servidores. Su gran flexibilidad ha permitido que sea utilizado en un rango
muy amplio de sistemas de cómputo y arquitecturas: computadoras personales,
supercomputadoras, dispositivos portátiles, etc.

Los sistemas Linux funcionan sobre más de 20 diferentes plataformas de hardware,


entre ellas las más comunes son las de los sistemas compatibles con PC, computadoras
Macintosh, procesadores PowerPC, Sparc y MIPS.

También es frecuente hallar componentes de GNU instalados en un sistema UNIX no


libre, en lugar de los programas originales para UNIX. Esto se debe a que muchos de
los programas escritos por el proyecto GNU han demostrado ser de mayor calidad que
sus versiones equivalentes de UNIX. A menudo, estos componentes se conocen
colectivamente como "herramientas GNU". Muchos de los programas GNU han sido
también portados a otras plataformas como Microsoft Windows y Mac OS X.

¿Qué es el software libre?

Software libre es el software que, una vez obtenido, puede ser usado, copiado,
estudiado, modificado y redistribuido libremente. El software libre suele estar
disponible gratuitamente en Internet, o a precio del coste de la distribución a través de
otros medios; sin embargo no es obligatorio que sea así y, aunque conserve su carácter
de libre, puede ser vendido comercialmente. Análogamente, el software gratuito
(denominado usualmente Freeware) incluye en algunas ocasiones el código fuente; sin
embargo, este tipo de software no es libre en el mismo sentido que el software libre, al
menos que se garanticen los derechos de modificación y redistribución de dichas
versiones modificadas del programa.

En resumen, libertad no significa gratuidad y al contrario tampoco. Se puede obtener


software gratuito sin tener la libertad de ver el código y a su vez se puede usar software
libre (free software) para ver su código pero pagar por su soporte comercial, o por la
distribución de las copias de software libre.

¿Qué es el código (software) comercial?

• El autor cobra un precio por el uso del software (licencias)


• No se puede ceder ni alquilar el software en cuestión
• El único autorizado a realizar modificaciones al software es el desarrollador de
éste. Esto, claro está, siempre y cuando les sea rentable. Por ejemplo: Cambio de
plataforma, mejoras, customizaciones
• No se podrá realizar ingeniería inversa para estudiar su comportamiento.

Ejemplos de código comercial y libre (los pondremos con ejemplos tomados


mayormente de la empresa MicroSoft)
Comercial

sendmail, postfixIISLibre Apache, thttpd


Microsoft OfficeExchange Open Office, StarOffice, koffice
Internet Explorer

Microsoft OutlookFireFox Evolution, Thunderbird, pine, mutt


Decenas de antivirus comerciales Clamav
TrendMicro antispam

msn chat, yahoo messenger, gaim


trillianspamassassin

Existen otros tipos de licencia de aspecto libre, algunas son compatibles con la licencia
GNU y otras tienen ciertas restricciones o libertades que la hacen incompatibles; por
ejemplo la licecencia tipo Apache permite la distribución de binarios sin su
correspondiente código fuente lo que imposibilita en muchos casos el que se pueda
conocer las directivas de compilación o parches aplicados a un producto liberado).

Sin embargo esto no significa que una licencia para código libre deba dejar de ser usada
o ignorada, muchas tienen elementos válidos a nuestros efectos y de hecho una
distribución de Linux comprende no sólo software licenciado bajo gnu-gpl sino que
incluye otros tipos de licenciamiento.
Se puede obtener muchísima más información en la página de la FSF: Otros tipos de
licenciamientos para código libre

Sitios de ayuda

Existen una buena cantidad de sitios de ayuda (autoayuda también) en el planeta, en


muchísimos idiomas, aquí listaremos algunos sitios con soporte en inglés y español,
además de sitios propios ecuatorianos para obtener ayuda más rápidamente:

Equinux es una lista dedicada a los amantes de linux en el Ecuador, sus aplicaciones
prácticas en el país, acciones que se deberían tomar y demás alternativas. Se habla
también sobre otros proyectos open source
http://nuevared.org/mailman/listinfo/equinux_nuevared.org

Ecualug es el primer foro de usuarios ecuatorianos dedicado íntegramente al tema de


linux. Surgió hace 3 años y tiene una enorme cantidad de artículos. La mayoría de los
usuarios del foro siempre requieren de un buen planteamiento ante un problema o
inquietud para dar una respuesta adecuada a este planteamiento, es muy útil y se
aprende mucho en este foro:
http://www.ecualug.org

Existen varios sitios web ecuatorianos que se especializan en GNU/Linux. Los citamos
aquí, sin que eso signifique que de alguna manera estén asociados con el CEC-EPN.

www.nuestroserver.com (antiguo www.ecualinux.com)

www.palosanto.com

www.infodesarrollo.ec

www.bmind.ec

www.redpartner.com

www.refundation.com

www.hightelecom.com

www.powerfast.net

www.omnisoft.com.ec

www.plus-projects.com

Hispasec es un sitio dedicado a la seguridad informática, una de las cosas más


interesantes es su lista de anuncios diaria (su nombre es: una al día) que envía
actualizaciones con los problemas más importantes de seguridad ocurridos en los
últimos días u horas.
www.hispasec.com

El kernel (nucleo o corazón) de linux es la creación original de Linus Torvalds en 1991,


más las modificaciones del grupo www.linux.org . Este nucleo es la base del sistema
GNU/Linux. Ha sido ampliamente revisado (y modificado) por una enorme comunidad
de personas a lo largo del planeta. De hecho la contribución en código que ha aportado
Linus Torvalds es menor al 5% del kernel. Linus a veces dice que él se siente como si se
aprovechara de las demás personas porque él es el que menos ha escrito líneas de
código.

Cierto o falso, es una realidad: Linus Torvalds fué capaz de crear un kernel muy
maleable, muy modificable, además es una persona que acepta retos, sugerencias y
siempre se mantiene en constante investigación y modernización del kernel.

El kernel básicamente es el conjunto de programas que permiten administrar (manejar)


los recursos del sistema de forma organizada y eficiente: La memoria, el uso de CPU,
uso de disco, manejo de espacios de memoria virtual, swap y demás. En los últimos
años se han ido agregando al kernel temas como seguridades (iptables, selinux), nuevos
formatos de archivos (ntfs, hpfs, reiserfs) y el reconocimiento de gran cantidad de
dispositivos modernos.

Qué significa 2.6.9.56

El sistema de numerar el kernel está en cambio actualmente, de todas formas el kernel


se ha numerado hasta el momento de la siguiente forma:
linux-X.Y.Z

El primer numero (X) significa un cambio mayor respecto al anterior, posiblemente


incompatible en sus binarios, cambios en las concepciones.

El primer kernel útil fué del tipo 1.Y.Z éste kernel por ejemplo era monolítico, no
permitía cargar módulos (drivers) para nuevo hardware, lo que hacía que para agregar
nuevo hardware había que recompilar completamente el kernel.

Posteriormente, sobre el año 1996-1997, surgió el kernel 2.Y.Z

Este sí era modular, e incluida ciertas características más que hacía que fuera
incompatible con el 1. Básicamente nos mantenemos en el kernel tipo 2 de momento.

El segundo número (Y) indica un cambio en concepción del kernel, pero no en su


compatibilidad, posiblemente hay restructuraciones a diferentes áreas del kernel,
mejoras en su rendimiento, seguramente habrán miles de drivers nuevos, arquitecturas y
dispositivos que antes no existían serán agregados.

El kernel 2.0 soportaba un firewall muy rudimentario llamado ipfwadm. Ver más
novedades del kernel 2.0.
El kernel 2.2 ya soportó un firewall (ipchains) que permitía hacer NAT, y hasta se podía
con un módulo externo hacer labores de reenvío de paquetes hacia máquinas dentro de
la red. Ver más novedades del kernel 2.2
El kernel 2.4 ya soportaba un firewall mucho más poderoso llamado iptables que es el
que al momento se usa, con muchísimas características de manejo de firewall que lo
hacen bien fuerte y estable. Ver más novedades del kernel 2.4
El kernel 2.6 incluyó soporte para discos SATA, tiene un manejo de memoria y
procesos totalmente renovado lo que hace que el rendimiento, nivel de respuesta ante
ambientes multitareas bien complejos sea altamente eficiente y bueno. El kernel 2.6
realmente responde mucho más rápido que su antecesor. Ver más novedades del kernel
2.6

Los números Y, si se fijan bien, son pares. Si este número es impar lo que significaba
era que el kernel era de pruebas, altamente inestable y no apto para la producción (2.3,
2.5, 2.1), esto está de momento cambiando, veremos qué decide Linus.

El último número (Z) solamente indica un cambio cosmético con respecto al Z-1
(anterior), pueden ser correcciones de seguridad, adiciones de nuevos hardwares,
mejoras en drivers, etc. Pero normalmente no implica que el kernel haga que deje de
funcionar ningún hardware ni cambie ningún concepto o preconcepción respecto a otros
kernels del mismo X.Y

Igual que el kernel de linux, muchos paquetes de aplicaciones usan la misma


terminología para numerar sus sistemas:

• sendmail-8.13.2
• httpd-2.0.54
• php-4.3.11

Sin embargo, estas no tienen en cuenta la características de que si la Y es impar estos


son inestables. De hecho, repetimos, Linus ha decidido que ya este dato no tenga ningún
valor respecto a la estabilidad o no de un kernel. Es decir, posiblemente el kernel 2.7 sea
tan estable o más que un kenel 2.6.

Todos los kernels oficiales que han salido, pueden ser encontrados en: www.kernel.org

Cómo puedo saber la versión del núcleo de linux que tengo instalada ?

Use desde una terminal de Linux, el comando uname -r

o este otro comando: cat /proc/version

Actualizado: 2009/07.

GNU/Linux no sólo es capaz de ejecutar programas binarios creados específicamente


para GNU/Linux, sino que es capaz de ejecutar programas binarios creados para otros
sistemas operativos. Para ello existen emuladores como DOSEMU o DOSBOX para
correr programas para DOS. El emulador WINE para emular Windows. Emuladores o
máquinas virtuales como XEN, VMWARE, BOSCH y otros. Generalmente la velocidad
es adecuada, lo que hace al GNU/Linux adecuado para correr programas creados para
otros sistemas operativos.

Por ejemplo, linux es capaz de emular una máquina real que pueda ejecutar el DOS,
mediante el dosemu

Para el caso de windows, es capaz de emular a través del wine, la plataforma básica de
windows y ejecutar desde el wine diferentes aplicaciones compiladas para windows.
Realmente es un trabajo viejo y que sigue en constante actualización, y siempre tiene
mejoras ya que emular toda la cantidad de llamadas que microsoft ha creado toma su
tiempo, sobre todo cuando microsoft actualiza estas llamadas y hace que se tenga que
revisar constantemente el trabajo.

Con muchísimas aplicaciones como firefox, thunderbird, open office y cientos más que
corren nativamente en linux, no es muy necesario el wine, sobre todo porque cualquier
otra aplicación que no exista para linux, puede ser ejecutada mediante el rdesktop que
permite conectarte a un servidor windows de terminal services y ejecutar aplicaciones
en ese servidor.

Además nativamente linux puede interpretar y ejecutar código de otros sistemas


operativos unix, mediante el mecanismo llamado Linux ABI.

Mediante el linux ABI podemos ejecutar el foxpro que existe para SCO dentro de
nuestro linux, así como casi cualquier binario creado para otra plataforma de unix
dentro de nuestro linux.

Aparte de estos emuladores que son bastante conocidos, linux es capaz de actuar como
servidor netware (mars nwe) y como servidor de archivos de windows (samba). Así
como es capaz de interpretar aplicaciones hecha en java desde el mismo shell.

También linux es capaz, mediante el proyecto go-mono aplicaciones hechas para .NET
permitiendo que muchas empresas puedan ahorrar en costos de implementación de
sistemas operativos windows para ejecutar aplicaciones en mono.

Es muy común encontrar sistemas GNU/Linux corriendo VMWare www.vmware.com


(cada vez más, también el más joven VirtualBox de Sun www.virtualbox.org) con
varios sistemas operativos como DOS, Windows, MAC OSX, Solaris, BSD, todo
funcionando AL MISMO TIEMPO en linux. Esto es factible si el computador dispone
de suficiente memoria y espacio en disco para que estos sistemas trabajen
simultáneamente. Se recomienda al menos 1GB de RAM y alrededor de 10GB por cada
sistema operativo, además del almacenamiento que se pueda necesitar para guardar los
datos del usuario. Ayuda mucho también que el CPU del equipo contenga las
extensiones para soporte de virtualización (Intel VT ó AMD-V por ejemplo).

Linux es básicamente el kernel del sistema operativo, la base, el que maneja todas las
operaciones de entrada/salida y mantiene saludable el manejo de memoria y asignación
de recursos del procesador.

Sin embargo, debemos diferenciar bien entre el kernel de linux, y una distribución de
Linux.

Una distribución de linux es básicamente una colección o conjunto de paquetes,


recompilados por una empresa, normalmente con fines comerciales (vender los CDs,
vender soporte, vender cursos) en uno o varios cds o dvd los cuales vienen con un
proceso de instalación el cual permite, entre otras cosas:

• particionar el disco duro


• definir una clave para el usuario de administrador,
• escoger los paquetes a instalar
• instalar grupos de paquetes previamente seleccionados para escritorio, ofimática,
gráficos, multimedia, servidores, monitoreo, etc.

• configurar elementos del sistema como es la zona horaria, el ambiente gráfico,
definir direcciones IP, etc.

Estos paquetes incluidos en una distribución no son solamente del proyecto GNU, sino
de otros proyectos, con otros tipos de licenciamientos no comerciales (licencias tipo
bsd, apache, X, etc) así como paquetes comerciales (adobe acrobat reader, flash player,
real player, etc) pero que se distribuyen libremente.

El objetivo final de las empresas que realizan las distribuciones es lograr dar cierto nivel
de soporte y actualizaciones frecuentes a su distribución, estas actualizaciones pueden
variar siendo algunas gratuitas, otras pagadas

El tiempo de vida de una distribución también puede variar; así como soporte técnico
(normalmente es pagado) y cursos y certificaciones para la distribución en cuestión.

Distribuciones basadas en RPM:


Los archivos rpm terminan en la extensión .rpm contienen varios archivos y programas
en su interior, algo similar a los archivos .zip

RPM es el acrónimo creado por redhat para definir un esquema de distribución de


paquetes. Significa RedHat Package Manager o Manejador de paquetes de RedHat

Los RPM fueron en su momento y todavía siguen siendo un paso de avance muy grande
para el mundo de linux, ya que los rpm no sólo incluyen una colección de binarios
relativos a un determinado paquete o utilería sino que también incluye archivos de
ayuda, de configuración y sobre todo! incluye lo que se llama dependencias, esto es,
qué otros paquetes rpm requiere este rpm para instalarse.

De esta forma nos evitamos problemas que anteriormente ocurrían y ocurren cuando se
instala un paquete que para funcionar correcta o completamente, requiere de otros. Por
ejemplo:

El paquete php (php es un lenguaje interpretado que genera código html de amplio uso
en internet en estos momentos) tiene entre sus requerimientos el que exista un servidor
web (apache) instalado. De esta forma si intentamos instalar el rpm del paquete php,
este nos fallará diciendo que requiere del paquete rpm httpd (apache) para instalar.

Entonces debemos instalar el apache primeramente y seguramente este nos fallará


diciéndonos que requiere algún paquete relacionado con SSL (capa de encriptación) por
lo que deberemos instalar el mod_ssl seguramente y entonces instalar el httpd (apache)
y ahora sí: instalamos el php.
De esta forma no dejamos cabos sueltos.

Pero esto no es todo, los paquetes rpm permiten además desinstalar completamente una
aplicación, pues se mantiene una lista de todos y cada uno de los ficheros de
configuración, librerías, binarios, páginas de ayuda y demás que haya instalado un
paquete rpm, así de esta forma al borrar un paquete rpm podemos tener la total
seguridad de que hemos eliminado todas las referencias y archivos instalados por el
rpm. Esto puede sonar natural para una persona que viene del mundo de windows, pero
un sistema de desinstalación en linux era algo sumamente importante y requerido que
no existía antes.

Además los paquetes rpm pueden ser actualizados, los rpm sobreescriben con total
tranquilidad sus anteriores versiones instaladas, sustituyendo binarios y páginas
manuales así como creando nuevos enlaces que se requieran, pero siempre respetan los
archivos de configuración preexistentes, lo que permite actualizar una aplicación con
una versión superior sin incurrir en una tarea completa de reconfiguración.

Sobre los rpm trabajaremos más adelante en el curso, cuando aprenderemos a manejar
rpm, recompilar paquetes, instalarlos, actualizarlos, removerlos y demás características
propias de los rpm.

Algunas distribuciones:

De forma totalmente arbitraria nosotros hemos decidido dividir las distribuciones en:

• distribuciones basadas en rpm y


• distribuciones no basadas en rpm.

De todas formas para una lista completa de distribuciones existentes o ya difuntas,


pueden referirse a http://distrowatch.com/

Red Hat es una empresa lider en desarrollo, implementación y administración de


soluciones linux y open source para la internet- Las aplicaciones de redhat varían desde
dispositivos embebidos hasta servidores web seguros. Red Hat fué fundado en 1994 por
dos visionarios Bob Young y Marc Ewing. El código libre es la base de su sistema de
negocios. Redhat no sólo es el creador de la idea del rpm, para nosotros algo
fundamental que sentó bases para un rápido desarrollo del linux, sino que son los
mantenedores y hospederos de una serie de proyectos y programadores muy conocidos
para el mundo del linux. Proyectos tales como GCC (el compilador de C) y le dan
trabajo a muchos programadores como Alan Cox, uno de los desarrolladores del kernel
más importantes al momento.

Al momento el producto fundamental de redhat es el RedHat enterpise linux, al


momento redhat mantiene 3 versiones: RHEL3, RHEL4 y RHEL5 las cuales son
mantenidas por un periodo de 7 años a partir de su fecha de salida al mercado. Estos
periodos extendidos de soporte (se está hablando de hasta 10 años de soporte) son una
de las ventajas de usar esta distribución.
La lista de servicios de redhat es grande, pero uno de los fuertes de ellos es:

• Soporte técnico
• Actualizaciones frecuentes
• Certificaciones para trabajar en sus productos

Los productos y servicios de redhat tienen un costo. Pero el sistema operativo y


paquetes incluidos en la distribución son distribuidos con el código fuente de estos. A
excepción de los logos de redhat y cualquier paquete comercial que hayan incluido (al
momento en rhel5 son sólo 2 paquetes comerciales que no revisten mayor importancia).

RedHat crea un sistema operativo y paquetes de ayuda altamente parcheados, que son
en muchos casos bien diferentes a los paquetes originales creados por sus autores. Tiene
una tecnología que llaman backporting, en el que redhat no cambia la numeración de los
paquetes durante el tiempo de vida de su distribución, sin embargo esto no significa que
las aplicaciones sean viejas. Redhat se ocupa de portar hacia esas versiones, los parches
y actualizaciones necesarias para corregir errores y potenciales o reales problemas.

Es por esto que no debemos asustarnos de ver que el kernel del redhat es el 2.6.9 cuando
hay kernels 2.6.12, es decir, técnicamente hay una diferencia de 3 números entre el
kernel de redhat y la última versión oficial, pero esto no es cierto, pues redhat hace
backporting, trae los arreglos y mejoras del kernel 2.6.12 o sus predecesores hacia el
2.6.9. El objetivo? Muy simple lograr que el kernel o cualquier aplicación se comporten
de forma estándar y no varíen sus configuraciones o formas de trabajar durante el
tiempo. Muchos paquetes nuevos traen nuevas configuraciones o nuevas
funcionalidades que aunque buenas, puede que traigan problemas al ser instaladas y
requieran de reconfiguración por parte del administrador.

Algunos administradores no manejan 1 o 2 máquinas, sino cientos, talvez miles de


máquinas y realizar cambios en una configuración es algo sumamente penoso y que
puede traer enormes pérdidas económicas.

Los servidores de redhat enterprise linux están creados con el objetivo de ofrecer
estabilidad, y esta es una de las maneras de lograrlas.. sin demeritar en lo absoluto que
es un sistema eficiente y actualizado.

Fedora se convirtió desde inicios del siglo 21 en una distribución auspiciada por redhat,
un sandbox, o caja de arena, donde redhat prueba y prepara los paquetes que serán
implementados para sus distribuciones comercialmente soportadas (RHEL). Fedora
básicamente contiene una serie de paquetes de ultima generación que son planteados,
propuestos en sus distribuciones para que los interesados puedan probarlos y reportar
problemas.

Fedora se compromete a liberar un nuevo core (así llaman a sus distribuciones, core1,
core2, core3, core4, etc) cada 10 a 12 meses, y se compromete a actualizar solamente la
versión recién liberada y la anterior a la recién. Por ejemplo, ahora estamos en fedora
core11, por lo tanto actualizan el core11 y el core10. Core9 y core8 no son soportados
ni actualizados ya por fedora.
Pros:

• Paquetes muy actualizados,


• Ciclo de vida de las distribuciones: muy corto por lo tanto hay nuevos paquetes
constantemente

Contras:

• Al ser paquetes totalmente novedosos, muchos de ellos experimentales y sin


mucho periodo de prueba, estos son propensos a fallar inexplicablemente o a
fallar con una causa conocida. Por parte de fedora no existe un compromiso de
arreglar un paquete, aunque claro está se intenta arreglar de ser posible.
• Al tener un periodo de vida muy corto (sólo mantienen los dos ultimos cores) si
una empresa necesita mantenerse actualizada para prevenir ataques, deberá
cambiar constantemente de core de fedora, incurriendo en downtimes, nuevos y
desconocidos problemas, etc.

Es nuestra opinión de que fedora es una muy buena distribución para las personas que
requieren experimentar con lo ultimo del mercado, pero que no requieren de un
compromiso de estabilidad por parte de la distribución. Fedora NO se debe usar en
servidores de aplicaciones críticos y que necesiten de soporte extendido y estabilidad.

Si miramos estas dos opciones de redhat (RHEL y fedora) no tenemos muchas


opciones, y verdaderamente casi nadie veía al principio una salida a esta problemática:
redhat distribuye su versión empresarial pero cobra por las actualizaciones y por usar su
logo; mientras fedora es sólo un juguete para desarrolladores y estudiantes..

Existen empresas que necesitan un servicio estable, con actualizaciones por largos
periodos de tiempo y que no pueden o no quieren pagar por el servicio de
actualizaciones de redhat. ¿Qué hacer?

Clones de Redhat

Para eso han surgido, gracias al código GNU y otros códigos no comerciales,
alternativas gratuitas o menos costosas de mantenimiento de servidores.

Vayamos por el principio:

Redhat, al usar código GNU está obligado a liberar este código, sin embargo redhat no
sólo libera el código gnu que incluye en su distribución, sino que también distribuye en
formato src.rpm (SRPM, o los fuentes del rpm) la forma exacta en que ha compilado
TODOS los paquetes que tienen código libre, ya sean estos GNU o no.

¿Qué significa esto?

Que cualquiera puede tomar los SRPMS que libera redhat, y recompilarlos de la forma
exacta (clon) en que redhat lo hizo, así de esta forma obtendrá los paquetes rpm, con los
binarios y archivos de configuración exactos que redhat entrega en su distribución.
Eso sí. Redhat, de acuerdo a su licencia, en el artículo 2 del apéndice 1 indica
claramente que los logos de redhat y todas sus marcas son propiedad de redhat, por lo
que no se deben distribuir sin autorización de ellos.

Es por esto que se puede usar básicamente todo de redhat, menos sus logos y demás
marcas comerciales así como que no se puede acceder al soporte técnico y
actualizaciones si no se pagan por ellas.

Basados en estas premisas, algunas personas y empresas crearon lo que se llaman clones
de redhat, para más información sobre los diferentes clones visitar este sitio.

Entre los clones de redhat, está CentOS el que definitivamente vemos más activo y con
ánimos no sólo de copiar la información sino de crear distribuciones para nuevas
arquitecturas no soportadas por redhat, etc,

Es precisamente centos, en su versión 5 el que estaremos estudiando en este curso. De


forma tal de que tengamos un conocimiento completo sobre cómo funciona un servidor
RedHat Enterprise Linux y podamos posteriormente definir si se adquirirá una licencia
de uso del RHEL o se seguirá usando en su empresa el centos. Ambas variantes son
válidas para comenzar.

Trustix (trustix secure linux, tsl)


Es una distribución creada por www.trustix.org que es una empresa que crea esta
distribución con el objetivo expreso de funcionar y servir para ambientes de servidores.
Es una distribución muy optimizada y altamente especializada en el área de servidores.
No contiene ambiente gráfico y se distribuye en un sólo CD al momento.

Las actualizaciones de trustix se ofrecen por al menos 2 años después de salida al


mercado una distribución, pero no sólo eso, sino que la migración de una versión
anterior de trustix a una más moderna es un proceso poco complicado lo que permite
mantenerse con un sistema actualizado y un alto uptime, o tiempo en el aire.

Nosotros las usamos para sistemas de servidores que requieren de alto performance y la
usamos de base para construir nuestra propia distribución para servidores segura.

OpenNA:
Es una distribución creada en el Canadá, orientada a un alto aseguramiento del sistema
mediante medidas preventivas y predictivas de problemas. Esta distribución es basada
en la idea de redhat, se maneja por rpm y una de las características más interesantes de
los señores de openna es que en su sitio web distribuyen un libro en el que indican paso
a paso cómo se van compilando todos los paquetes de un sistema y cómo se deben ir
asegurando. Es aproximadamente el mismo método que usan para crear la distribución y
definitivamente el libro es una gran ayuda para personas que desean mejorar su
conocimiento sobre cómo asegurar paquetes de un sistema linux.

Mandriva Linux (antiguamente Mandrakelinux)

Creada en 1998 con el objetivo de hacer linux más fácil de usar por cualquier persona.
En aquellos momentos linux era bien conocido como un sistema operativo poderoso y
estable que demandaba muy sólidos conocimientos técnicos y un uso extensivo de línea
de comando. Mandrake vió la oportunidad de integrar el ambiente gráfico con
poderosas utilerías de configuración y manejo del sistema. Con esta idea innovativa
mandriva ofrece todo el poder y estabilidad de un sistema linux tanto a personas
profesionales y conocedoras de Linux como a principiantes o personas sin mayores
conocimientos técnicos pero con interés en usar linux para realizar sus labores.

En nuestra opinión realmente mandrake o mandriva como se llama actualmente es una


muy buena distribución orientada al ambiente gráfico.

SUSE
SUSE LINUX se cataloga como líder internacional y proveedor de soluciones en
sistemas operativos de código abierto. La larga experiencia de suse en linux y además
su enorme cantidad de personas dedicadas a desarrollar en código abierto han
contribuido indudablemente en reconocer a suse como una de las soluciones de linux
más completas disponibles al momento. SUSE LINUX fue adquirido por Novell, Inc en
Noviembre del 2003.

DISTRIBUCIONES NO BASADAS EN RPM

Aunque hay un gran numero de distribuciones, sólo hablaremos de las más importantes
al momento:

Debian
El proyecto Debian es una sociedad de personas que han hecho causa común para crear
un sistema operativo gratuito. Este SO se llama Debian GNU/Linux o simplemente
Debian. Los sistemas Debian actualmente usan el Kernel de Linux.

Debian se caracteriza por ser totalmente gratuito, sin organizaciones que los mantengan
y con una amplia cobertura de plataformas, tanto populares como ya obsoletas o muy
nuevas.

Entre las dificultades que debian está enfrentando ahora es una falta de soporte
comercial (requerido por muchos clientes) así como una gran lentitud en liberar nuevas
versiones y nuevas actualizaciones, así como peleas internas dentro del grupo de
desarrolladores.

Como objetivo social, gratuito y libre, es una gran distribución. A mis efectos, como
persona que tiene que dar soporte comercial serio a empresas, debian no es una
distribución preparada para mantener puntos o sistemas críticos dentro de las empresas.

Muchas personas adoran a debian y mueren por él, lo califican como altamente adictivo,
sobre todo programadores, o investigadores o simplemente partidarios del software
totalmente libre.

Gentoo
Es una distribución que tiene una características interesante, aparte de ser gratuita y
libre por supuesto, es una distribución que puede adecuarse completamente a la
máquina en que se instala. Esto es, a los efectos de una instalación se pueden mandar a
instalar solamente los paquetes que requeriremos, ni más ni menos, y estos paquetes
podemos bajarlos de la internet, de su sitio web y recompilarlos de acuerdo al hardware
o plataforma que tengamos.

Gentoo además no tiene distribuciones así propiamente dichas, se puede instalar desde
cualquier cd de arranque de gentoo, que él mismo se encargará de bajar el código fuente
de todos los paquetes requeridos desde la internet, y este código por supuesto será de la
última versión disponible en internet.

Es un ambiente muy interesante para experimentadores y es una distribución muy


popular entre personas que realmente quieren comprender cómo funciona linux y que se
preocupan por su desempeño.

Ubuntu
Otra distribución popular al momento es ubuntu, indica que es y permanecerá libre.
Estimamos esta distribución ha salido adelante sobre todo por los problemas de lentitud
de debian, que hacían que muchas gentes se desmotivaran por usar debian por lo viejo y
demorado de sus actualizaciones.

MINI DISTRIBUCIONES,
Las minidistros, son distribuciones pequeñas, usualmente basadas en un sólo CD, o CD
de tamaño de una tarjeta de crédito.

Además no es infrecuente encontrarnos con distribuciones que caben solamente en un


floppy (sí, en un floppy se puede montar un router que haga nat y firewall), o en dos o
tres floppies. También hay distros que caben en pendrive o cualquier dispositivo USB.

No solamente son distribuciones educativas o proyectos para pasar el tiempo, sino que
muchas de ellas (coyote linux) permiten tener un efectivo firewall y servidor que haga
NAT, así como son pequeñas alternativas para levantar un sistema más grande en caso
de que haya fallado y trata de recuperar su información y echarlo a andar nuevamente.

Hay decenas de distribuciones interesantes, por favor buscar y ver:


knoppix
puppy linux
coyote linux
en www.distrowatch.com

o en www.LinuxCd.org

Las diez mejores distribuciones GNU/Linux

http://distrowatch.com/dwres.php?resource=major

Distribuciones educativas:
Una de las distribuciones más interesantes es Linux From Scratch, más que educativa en
el sentido general podemos indicar de ella que es una distribución que enseña cómo
realizar una distribución desde cero. Cómo recompilar e instalar un sistema operativo
compilando paquete por paquete e instalándolos. Así que nos enseña básicamente cómo
instalar linux sin tener que usar ninguna distro previamente comentada.
Los CD Vivos o Live CD

Son CDs o DVDs que no requieren instalación. Traen conjuntos de programas


seleccionados para que funcionen al arrancar directamente desde un CD o DVD. No
tienen ni la velocidad ni toda la funcionalidad de los programas instalados en el disco
duro, pero son una excelente alternativa para probar una distribución, para
familiarizarse con Linux y para aprendizaje del sistema Linux o de sus programas.

Aquí hay varias docenas de CDs / DVDs que pueden ser descargados. Necesitará un
ancho de banda no disponible en en CEC-EPN.

http://www.frozentech.com/content/livecd.php

Y qué hay de otros programas y aplicaciones ?

Existen miles de programas y aplicaciones para Linux (y para Windows) que están
desarrollados o que están en desarrollo. Puede apreciar una buena cantidad en:

www.sourceforge.net

www.freshmeat.com

En conclusión:

Como se puede ver, Linux es una enorme fuerza en el planeta Tierra. Una fuerza que no
tiene retorno. Como se puede apreciar en los links arriba indicados, existen cientos de
miles, tal vez millones de personas trabajando de una u otra manera para mejorar Linux
y agregar programas (y facilidades) a su ya extensa lista. Lo interesante de Linux es que
se basa en la cooperación de la comunidad y no en la competencia o el secretismo.

Linux, como cualquier sistema operativo moderno, solicitará que el usuario ingrese su
nombre de usuario y contraseña para que pueda iniciar su trabajo.

Deberá consultar con el instructor o con el personal de soporte del CEC para conocer el
nombre de usuario y contraseña válidos.

Una vez que escribe el nombre de usuario y contraseña, aparecerá una pantalla similar a
esta:

En este momento no profundizaremos con el ambiente gráfico ya que la mayoría de


actividades de administración se realizan en modo texto, pero sí explicaremos dos temas
importantes: cómo cerrar la sesión y cómo iniciar en modo texto o terminal:

Para cerrar la sesión (una de las varias maneras de hacerlo) haga clic en Sistema y luego
en Salir o Apagar. Esta segunda opción apaga el computador, mientras que la primera le
permite ingresar como otro usuario.

Para abrir una sesión en modo texto (modo terminal) haga clic con el botón derecho del
ratón sobre cualquier parte de la pantalla no ocupada por otro elemento gráfico
(cualquier parte de color azul estará bien, suponiendo que no haya cambiado por otro el
fondo azul de la pantalla).

La sesión de TERMINAL o modo texto aparecerá algo así:

En la ventana de terminal se pueden escribir cientos de órdenes utilizando el teclado.


Vamos a ver una instrucción que le permitirá cambiar de idioma inglés a español o a
cualquier idioma que Ud. elija. Por favor elija un idioma que Ud. conozca, porque de lo
contrario, le resultará difícil volver a configurar el idioma (no encontrará la opción
adecuada).

En este caso hemos seleccionado Spanish (spain)

Ahora, deberá cerrar la sesión (de la manera indicada arriba) y volver a ingresar para
que los cambios se realicen.

Administrador de archivosUd. puede revisar los archivos y carpetas (directorios) de


Linux tanto en modo gráfico como en modo texto.

Seleccione

Y luego puede hacer clic en donde dice EQUIPO

Hay muchas otras formas que deberá conocer, tanto en modo gráfico, como en modo
texto. Se supone que un administrador de Linux debe conocer más que los usuarios, así
que deberá investigar y experimentar.

Sistema de archivos de Linux (Linux Filesystem)

El sistema de archivos de Linux es transparente para la mayoría de usuarios, a quienes


no les interesa la manera en que se graba su información en el disco duro, cd, dvd o
flash memory. A un usuario normal solamente le interesa que pueda grabar y recuperar
su información.

Sin embargo, a un administrador de linux le interesa (debe interesarle) el formato


interno de grabación para poder controlarlo, optimizarlo y en muchas ocasiones, escoger
diferentes formatos en beneficio de los usuarios que dependen de él (del administrador).

Por lo tanto, aquí veremos a qué se refiere con eso de Filesystem

Linux reconoce (puede leer y grabar) muchos tipos de filesystem, entre ellos: ext, ext2,
ext3, raid, reiserfs, ntfs, fat12, fat16, fat32, hpfs, pcfs, nfs, samba, cdfs y otros. Sin
embargo, así como el formato nativo de windows es NTFS (antes era FAT32, y antes de
ello el FAT16 y el FAT12), linux tiene su formato nativo en el ext3 (antes era el ext2, y
antes era el ext).

Las mejoras en los formatos de grabación (filesystems) permiten aprovechar las nuevas
capacidades de almacenamiento, mejoran el tiempo de lectura y escritura, brindan
mayores seguridades y permiten recuperación en caso de caídas del sistema. Por ello es
mejor usar un filesystem reciente en vez de un filesystem antiguo.

El sistema de archivos de Linux filesystem, fue en principio el mismo sistema de


archivos de Minix creado por Andrew S Tannenbaum a fines de los 80.

Este sistema de archivos de Linux se conoció inicialmente como EXT. Era digamos así
una extensión al sistema de archivo Minix. Minix adolecía de ciertas falencias que su
autor en el ánimo de mantener simpleza a la hora de educar (minix es un SO orientado a
universidades, a la educación, a comprender su funcionamiento) había introducido.

Por ejemplo Minix no soportaba (ni soporta) archivos de más de 64mb de tamaño así
como que el nombre de los directorios no debía pasar de los 16 caracteres.

Los filesystem ext, ext2, ext3

El formato de archivos EXT corrigió estas limitaciones y sí soportaba tamaños de


archivo de hasta 2GB de tamaño y filesystems de hasta 2GB de tamaño (mucho para esa
época) y además que los nombres directorios y archivos podían ser de hasta 255
caracteres.

Sin embargo, el sólo soportar 2GB como tamaño máximo de un Filesystem era una
dificultad, aunque no la única. También la forma en que se organizaban los inodos
libres (listas de bloques que pertenecen a un archivo) era del tipo de lista enlazada
simple, lo que hacía sumamente ineficiente la búsqueda de un inodo para ser usado
(asignado).

Por lo tanto, los autores del EXT y la comunidad de linux se vieron en la necesidad de
diseñar y programar un mejor formato que permitiera superar estas dificultades.

Para esto, se creó el formato EXT2, a fines de los 90, que no sólo superaba con creces el
tamaño máximo que podía tener un archivo (ahora soportan unos 4TB de tamaño) sino
que además la forma de organizar los inodos era en forma de árbol lo que hacía
sumamente efectiva la búsqueda de inodos libres y asignación de espacios en disco.

Sin embargo el FS ext2 tenía (tiene) una pequeña situación problema. Y es que no
mantiene una bitácora o sistema transaccional que es muy útil para recuperar un
filesystem dañado por caídas inesperadas de la máquina o fallas de corriente.

El EXT2 podía dejar inconsistente un sistema lo que lo hace altamente peligroso por la
potencial pérdida de datos que se puede incurrir.

Si embargo el FS ext2 fué creado con provisiones para posteriores adiciones y mejoras
al sistema, lo que permitió que se pudieran agregar nuevas características de bitácora a
este FS.

Este nuevo tipo de FS es llamado EXT3 y no es incompatible con el EXT2, es decir, un


FS ext2 puede ser convertido a ext3 y lo contrario también es posible, lo que ha hecho
muy fácil la migración de ext2 a ext3 con sólo actualizar las utilerías de acceso a los FS
y el kernel.
Aparte del FS ext3, existe al menos un sistema transaccional más, es el llamado
ReiserFS los autores lo califican como un FS que permite un mejor performance por la
forma en que organiza los inodos así como que también permite una mejor recuperación
del FS en caso de un evento inesperado que ponga en peligro la información contenida
en los discos. Este formato es usado en forma nativa en el sistema operativo MAC OSX
(La X al final indica que es un derivado de Unix / Linux).

Sin embargo en diferentes pruebas de performance se ha determinado que el FS reiserfs


es muy rápido en efecto para el manejo de gran cantidad de archivos pequeños (de 2 a
3k de tamaño) pero el performance en el manejo de grandes archivos (superiores a 3k)
no se diferencia en nada del ext3.

Además, el reiserfs tiene todavía una buena etapa de experimentación y pruebas para
determinar potenciales fallas que todavía surgen en él, así como adiciones de
características básicas como el manejo de quotas.

Por todas estas razones, nosotros no recomendamos de momento el usar el reiserfs para
manejas nuestro sistema de archivos en un servidor, siendo adecuado para estaciones.

Linux además puede manejar diferentes FS de otros sistemas operativos, es capaz de


leer y escribir sin inconvenientes en FS del tipo VFAT (FAT32), msdos (FAT16), puede
leer NTFS (y escribe pero de forma experimental)

También se mantienen sistemas de archivos virtuales como el tmpfs (permite mantener


un disco en ram), cramfs, squishfs (estos dos permiten mantener archivos pero en
formato comprimido, no permiten escribir, pero sí leer) y diferentes FS informativos
como el procfs para obtener información del kernel y usbfs para manejar dispositivos
USB.

Otros FS menos conocidos son:


NFS: Para compartir archivos entre linux
Samba: Para compartir archivos con servidores windows.

PCFS es el formato que utiliza el sistema operativo Solaris para equipos X86.

Y para qué me sirve todo esto ?

La importancia de conocer el filesystem se verá al usar el comando mount y los


comandos mkfs.

Por lo pronto, asegúrese de que las particiones del disco estén como tipo ext3 que es el
mejor sistema de archivos para servidores. Si la partición está como NTFS o FAT,
deberá realizar ciertas operaciones extras y cargar drivers que retardarán el rendimiento
del equipo.

Para ver el sistema de archivos que utiliza cada partición de linux, use el comando df
-T

o vea el contenido del archivo /proc/mounts por ejemplo cat /proc/mounts


/

|-bin/

|-boot/

|-dev/
|-etc/

|-home/

|-lib/

|-media/

|-mnt/

|-root/

|-sbin/

|-tmp/

|-usr/ sbin/
| bin/
| etc/
lib/
|-var/

Aquí tenemos la estructura básica del sistema linux. Comienza de arriba a


abajo por el directorio raíz (root) que se describe con el signo /.

En el directorio /bin tenemos los binarios básicos de linux, los requeridos para
su funcionamiento mínimo, no incluye adicionales como servidores (web,
mail, ftp, etc) ni ambiente gráfico ni nada similar, sólo los comandos
requeridos para que linux funcione y pueda ser reparado.

El directorio /sbin contiene igualmente los binarios básicos para que linux
funcione pero en este caso los del super usuario (sbin=superuser binaries),
como son los comandos para apagar la máquina, reiniciarla, formatear los
discos, particionarlos. No están las utilerías como agregar usuarios ni ningún
servidor.

El directorio /boot es uno de los más importantes y simples del sistema,


sencillamente contiene el kernel (o los kernels, pues podemos tener más de
un kernel instalado) del sistema linux. Este directorio siempre recordamos que
al particionar debe montarse en una partición primaria y ser el primero en ser
creado.

En /etc tenemos un etcétera de cosas, básicamente todos son archivos de


configuración que podemos modificar para cambiar el comportamiento del
sistema, sus servicios y servidores. En /etc tenemos por ejemplo los archivos
que almacenan las claves de usuarios, archivos que indican cómo y cuándo
debe levantarse un servicio, qué zona horaria tenemos, y muchísimos archivos
de configuración más de los cuales estudiaremos algunos posteriormente. El
directorio /etc contiene mayormente archivos de textos que pueden ser leídos
y contienen mucha explicación sobre cómo realizar cambios y la utilidad de
estos archivos.

La carpeta /etc es importante porque guarda archivos de configuración


propios de cada máquina, por ejemplo: /etc/passwd, /etc/smb,
/etc/sysconfig, /etc/rc.local y otros archivos que deben ser respaldados
porque contienen la configuración y valores exclusivos de cada equipo.

Es en /home donde se crean las carpetas de los usuarios, al crear un usuario,


el sistema linux le asigna un directorio raíz o base para este usuario, donde él
podrá escribir y guardar su información. Estos directorios normalmente se
crean dentro de /home y tienen como nombre el nombre del usurario
(/home/pedro, /home/magda, /home/joel, etc, etc)

Para el usuario administrador del sistema (root) el directorio base no está en


home sino en un directorio propio llamado /root

El directorio /lib contiene las bibliotecas del sistema, aqui se almacenan todas
las funciones que pueden ser usadas por las aplicaciones del sistema. Podemos
pensar en un equivalente de windows: DLL. Este directorio normalmente no
debe ser tocado, no hay mucha información extraíble de ella y no debemos
tocar nada a no ser que realmente conozcamos lo que estamos haciendo.

/media y /mnt, son los directorios donde se montan los dispositivos


extraíbles, tales como cámaras digitales, CDROM, floppies, dispositivos USB,
etc. Anteriormente se usaba /mnt para realizar los montajes de estos
dispositivos. Desde Centos4 se usa el directorio /media.

El directorio /proc contiene información útil que nos brinda el kernel y


además mediante este pseudo filesystem, podemos realizar ajustes y cambios
al kernel ;cambiar parámetros del protocolo tcpip, leer la memoria y
procesador usados, ver cantidad de procesos ejecutando y quién los ejecutó y
decenas de parámetros interesantes del kernel.

En /usr van las aplicaciones del usuario, digamos, los binarios que no son
requeridos para que la base del sistema funcione: servidores como el apache,
sendmail, vsftp, sistemas de análisis de logs, herramientas de firewall,
sistema de ambiente gráfico; en fin: cualquier aplicación que aunque muy útil
no es imprescindible para cuando tenemos una emergencia, para arrancar
básicamente al sistema. /usr tiene una estructura similar a /, es decir,
contiene un directorio bin/, sbin/, etc/, todos estos repetimos serían binarios
y archivos de configuración no imprescindibles para un arranque de
emergencia y que son elementos agregados por el usuario (nosotros) a la hora
de instalar o durante el tiempo de vida del sistema.
/tmp contiene archivos temporales escritos por cualquier usuario,
normalmente va en una partición aparte y por defecto es posible escribir
desde cualquier usuario hacia él. Como su nombre lo indica, los datos en él
deben ser temporales y de hecho el sistema linux se ocupa cada cierto tiempo
en hacer limpieza de estos datos para evitar que se llene por falta de control

/dev contiene dispositivos del sistema, esto es, /dev es un punto de enganche
para referirnos a elementos tales como los discos, puertos seriales, teclado,
video (tty), unidades de almacenamiento, sonido, etc.. en fin, es el que nos
da entrada al mundo del manejo de los dispositivos. Por ejemplo algunos
dispositivos y su descripción:

• ttyS0 - puerto serial 1 (com1 en DOS)


• ttyS1 - Puerto serial 2 (com2 en DOS)
• sda - primer disco scsi
• sde - quinto disco scsi
• sdb1 - primera partición del 2do disco scsi
• hda - disco ide (hd) máster primario (el primer disco del primer bus)
• hdb - disco ide esclavo primario (segundo disco de la 1ra controladora)
• hdc - disco ide máster secundario (primer disco de la segunda controladora)
• hdd - disco ide esclavo secundario
• hda3 - 3ra partición del disco máster primario
• dsp - digital signal processing - dispositivo de procesamiento de sonido

/var es el ocupado de almacenar datos variables. Estos son datos que


eventualmente ingresarán al sistema pero pueden ser eliminados por la
aplicación que los usa, o sencillamente el usuario mismo se encargará de
procesarlos.

Por ejemplo, var sirve para:

• almacenar los logs del sistema (/var/log)


• almacenar la caché del proxy del sistema (/var/cache/squid)
• almacenar los mensajes entrantes a los usuarios (/var/spool/mail)
• almacenar los mensajes salientes (/var/spool/mqueue)
• almacenar los archivos de actualización (/var/cache/yum)

básicamente como podemos ver, estos datos que indicamos son variables, unas veces
pueden existir y pueden ser procesados y eliminados posteriormente (mensajes
salientes? mensajes entrantes?) a medida que los usuarios vayan procesando su
mensajería o que el tiempo vaya pasando y los logs vayan siendo rotados.

Importancia y atención a la carpeta /var

La carpeta /var es muy importante porque contiene especialmente estos cuatro


directorios que deben ser respaldados:

/var/log contiene los logs del sistema


/var/lib/mysql contiene las bases de datos de mysql

/var/www/html contiene las páginas web del servidor web

/var/spool/mail contiene los mails de los usuarios

Para los usuarios de Windows

1. En linux es más común llamar DIRECTORIO a lo que en Windows se conoce como


CARPETA o Folder.

2. Linux NO tiene unidades o letras como A: C: D: etc. Vea los directorios /mnt y
/media para encontrar los disquetes, los cds, los dvds y las memorias flash.

3. El directorio raiz de Linux es el / (barra diagonal inclinada a la derecha o slash),


mientras que en Windows es el \ (barra inclinada a la izquierda o backslash).

4. El separador de directorios (carpetas) de linux es el / mientras que el de windows es


el \

5. Los nombres de directorios y archivos de Linux reconocen y diferencian letras


mayúsculas de letras minúsculas, mientras que en Windows eso no importa. En linux no
es lo mismo el archivo ABC que el archivo aBC o que Abc, son tres distintos archivos,
y si equivoca el tipo de letra, no obtendrá los resultados deseados.

6. Al copiar archivos de Linux a memorias flash o cds, se pierden ciertos atributos de


los archivos, como los permisos. Si luego desea regresar el archivo a su máquina linux,
o desea pasar a otra máquina linux, es recomendable usar el comando tar que guarda en
un archivo todos los atributos y permisos. Revise el comando tar.

7. Las memorias flash generalmente se activan automáticamente (servicio autofs) y


quedan dentro de la carpeta /media o aparecen en el escritorio del usuario.

8. Antes de retirar una memoria flash o disquete, debe DESMONTARLO o


EXPULSARLO. En linux se conoce como DESMONTAR, con el comando umount
(no, no falta la letra n, no es unmount sino umount por ejemplo umount
/media/flash_ro

9. Algunos directorios equivalentes entre Linux y Windows

/ equivale a \

/bin equivale a \Archivos de programas y \windows\system32/home equivale a


\Documents and Settings

/home/ricardo equivale a \Documents and Settings\Ricardo

/root equivale a \Documents and Settings\Administrador\Mis documentos

/root/Desktop equivale a \Documents and Settings\Administrador\Escritorio


El resto de directorios no tienen una equivalencia precisa.

BASH
Es un shell, o consola, muy popular en el ambiente linux, de hecho será el que
estudiaremos y mantendremos usando durante todo el curso.

Aunque existen otros shells, no es el objetivo aprender características y diferencias entre


estos, sino mejor dirigirnos a aprender el uso del bash que por su popularidad es
básicamente el estándar a usar entre todos los shells que existen para linux.

Estos comandos son muy comunes a sistemas unix y linux, por lo que si se conocen
comandos de unix o se conoce el manejo de otros shells, el usar el bash será una labor
muy fácil.

Una guía mucho más completa de manejo del shell la podemos encontrar en:
www.ernestoperez.com

Atajos:

antes de comenzar, queremos indicarles de ciertos atajos muy útiles para el bash, que
pueden ayudar a mejorar el rendimiento y la rapidez conque hagamos tareas en el shell.

Bash es conocido por algo que llaman autocompletion, o auto completamiento, no


tenemos que escribir completamente un comando o un directorio, sino que
sencillamente lo podemos completar con la tecla <TAB>.

Por ejemplo si quisieramos ejecutar el comando dos2unix (comando utilizado para


convertir ficheros textos de DOS a ficheros textos de unix) podríamos hacerlo tecleando
completamente todos sus caracteres (desde la d de dos hasta la x de unix) pero
también podemos usar un atajo, esto es escribir sólo los primeros caracteres y después
apretar <TAB>, por ejemplo:
dos2<TAB>
De esta forma se nos completaría la cadena completa (dos2unix).

Lo mismo ocurrirá cuando nos queremos cambiar de directorio, por ejemplo


supongamos que queremos cambiarnos a /var/spool/mqueue es un directorio un poco
largo de teclear y puede inducirnos a errores por desconocimiento o sencillamente por
haber tecleado mal.

A muchas personas le ocurre que en vez de poner spool ponen por error spoll o
cualquier otra variante lo que conducirá a que no podamos entrar a ese directorio, nos
falle, nos inquietemos, nos desesperemos porque no existe ese directorio, hasta hallar
que en realidad es cierto el directorio ni existe ni es el que queríamos acceder pues lo
hemos escrito mal.

Cómo evitar esos malos entendidos? Sencillamente:


cd /va<TAB>sp<TAB>mq<TAB>
Es decir, con sólo describir las dos primeras letras (va, sp, mq) y apretar TAB
inmediatamente después, he logrado cambiarme de directorio además que el shell se ha
ocupado por mi de escribir correctamente el nombre del directorio.

Esto nos acelera el proceso de entrar a un directorio o ejecutar un archivo, y además nos
evita confusiones sobre nombres.

En caso de existir más de un directorio o archivo con los mismos caracteres iniciales,
podemos presionar TAB dos veces y nos dirá las alternativas que tenemos, por ejemplo
pongamos:
[root@eperez ~]# dos<TAB><TAB>
dos2unix dosfsck
[root@eperez ~]# dos
Nos dará posiblemente dos opciones: dos2unix y dosfsck, es decir dos comandos que
comienzan con dos, podemos entonces diferenciarlos escribiendo la siguiente letra (por
ejemplo 2) y apretando <TAB> de nuevo, esto nos llevará al comando que queremos.

Otros atajos son el ctrl E y ctrl A, ^a nos lleva al inicio de una línea que estamos
escribiendo de forma tal que no tenemos que ir con el cursos poquito a poco hasta el
inicio sino que podemos apretar ^a y listo. ^e por el contrario nos lleva al final de una
línea si necesitamos seguir agregando.
TAREA: Probar creando una linea cualquiera (con su nombre por ejemplo) y apretando
^a y ^e

Otros shortcuts muy importantes:


^c : Detiene, para, elimina de memoria un programa que estemos ejecutando en el shell

^l : limpia la pantalla

^d : permite la salida del shell actual (cierra la sesión)

Copiar, mover, renombrar, borrar:

Los comandos son muy simples y parecidos en su sintaxis. Para copiar un archivo de un
lugar a otro podemos hacerlo con cp
cp /etc/resolv.conf /root/
Esto moverá el archivo resolv.conf que está dentro de /etc hacia el directorio /root (el
directorio home del administrador)

También existe la variante de copiar hacia el directorio donde estoy (directorio actual)
descrito por el signo de .
cp /etc/resolv.conf .
Copia resolv.conf que está en /etc hacia aqui (.)

Para mover, se usa el comando mv, con la misma sintaxis del anterior:

mv /root/resolv.conf /varEsto es, mueve el archivo resolv.conf que está en /root


hacia /var
cuidado con el comando mover, pues si movemos de lugar algo dentro de /etc
podemos dañar el arranque del sistema!!!!!!!

Para renombrar podemos usar el mismo comando mv pero dándole otro nombre:
mv install.log milogdeinstalación
por ejemplo esto movería un archivo llamado install.log hacia otro llamado
milogdeinstalacion lo que es lo mismo que renombrarlo (fíjense que el movimiento fue
dentro del mismo directorio).

Para borrar muy sencillo igualmente, podemos ejecutar rm


rm milogdeinstalacion
borraría el archivo que acabamos de renombrar. De ser posible traten de no borrar nada
mientras prueban, para evitar que se dañe el sistema.

Si queremos borrar un directorio recursivamente podemos usar:


rm -Rf directorio/
Esto borrará todo el directorio y los archivos y directorios que estén dentro de él.

ls: permite listar contenidos de un directorio

ls -l permite listar contenidos de un directorio y mostrar información del propietario,


tamaño del archivo fecha de creación y otra información de ejecución:
ls -l /etc
listaría contenidos extendidos del directorio /etc

cd : me permite cambiarme de directorio


cd /etc
me cambiaría a /etc

cd
así sólo, sin ningún parámetro adicional nos llevará al directorio home del usuario que
estemos usando, en este momento estamos usando root, por lo tanto nos llevaría a /root

cd -
nos permitirá ir al directorio inmediato anterior donde hemos estado

Para conocer el directorio actual, podemos usar el comando pwd (no lleva parámetros)
[root@eperez ~]# pwd
/root

Para crear un directorio podemos usar mkdir, y para borrarlo rmdir


mkdir test
rmdir test

El primer comando creará el directorio test y el segundo comando lo borrará.


rmdir no borra un directorio si no está vacío, por lo que preferimos la opción anterior
(rm -Rf)

Para conocer el espacio disponible en disco, podemos usar df, este nombre viene de
"disk free" o disco libre.

El switch -h representa los valores en formatos legibles para el humano (en megabytes,
gigabytes).
[root@eperez ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda3 8.6G 5.1G 3.1G 63% /
/dev/hda1 99M 8.3M 86M 9% /boot
/dev/hdd2 7.5G 6.8G 364M 95% /home
none 221M 0 221M 0% /dev/shm
En este ejemplo la partición / (/dev/hda3) tiene 8.6 gb de tamaño de los cuales estoy
usando 5.1G y libres 3.1GB para un 63% de uso. /home (/dev/hdd2) está hsando 6.8GB
de los 7.5gb máximos que tiene.

nos da una idea completa de todos nuestros filesystems y su nivel de uso.

Intentar sin la -h (sólo poniendo df) ver que los numeros se representan en k y son más
difíciles de comprender.

du -h nos permite ver el uso detallado dentro de un directorio, por ejemplo:


du -h /usr

nos listará detalladamente el uso de espacio en disco de cada directorio dentro de /usr,
hemos puesto el ejemplo de /usr porque es un ejemplo bien largo como verán.

Para reducir el detalle del comando du, podemos especificarles la profundidad máxima
que queremos que nos detalle, por ejemplo:
[root@eperez ~]# du -h --max-depth=1 /usr
95M /usr/include
368K /usr/local
19M /usr/libexec
1.3M /usr/kerberos
86M /usr/java
21M /usr/sbin
104M /usr/bin
1014M /usr/lib
1.1G /usr/share
8.0K /usr/etc
8.0K /usr/games
34M /usr/src
88M /usr/X11R6
2.5G /usr
Verán que tenemos un detalle de cada directorio dentro de /usr, pero resumido sólo a un
directorio de profundidad, y al final tenemos el uso real de /usr que es en mi caso de
2.5GB.

Paginadores
un paginador es un comando que nos permite ver un archivo una página a la vez.
Por ejemplo, el comando cat no es un paginador, pues nos mostrará un archivo en toda
su extensión (recuerden usar el <TAB>):
cat /etc/protocols
Nos dará un listado grandísimo de los protocolos que conoce nuestro servidor (numeros
de puerto - protocolo) pero no nos dejará prácticamente ni leer.

A veces cuando el archivo es pequeño (menos de una página) conviene usar el cat. Pero
si queremos leer con detenimiento podemos usar:
more /etc/protocols
more es un paginador antiquísimo y conocido, nos permitirá movernos con espacio de
página en página. Con q podemos salir del archivo que estamos visualizando.

Otra opción, mucho mas preferida por mí es less, less (el antónimo de more) nos
permitirá paginar igualmente y podremos movernos con espacio hacia abajo. Y
podemos salir con q, pero además nos permite:

G: ir al final del archivo


g: ir al inicio del archivo
15G: ir a la línea 15 del archivo (en vez de 15 puede ser cualquier numero)
/texto : permite buscar texto dentro del archivo, yendo desde donde estamos
posicionados hacia abajo
/ : permite buscar el mismo texto anterior (es decir no especificamos cadena de
búsqueda por lo que busca nuevamente la búsqueda anterior).
?texto : busca desde donde estamos hacia arriba el texto
? : sigue buscando la siguiente ocurrencia del texto anteriormente buscado.
!cmd : ejecuta cmd, por ejemplo !ls ejecutaría un ls en el shell pero se mantendría en el
comando less sin salir
F : hace un poll, es decir una búsqueda de nuevas adiciones al final de un archivo, es
muy útil cuando estamos viendo archivos de logs que están creciendo continuamente,
podemos ver qué va sucediendo interactivamente.
w : sube una página
ESPACIO: baja una página
v : llama al editor vi dentro del mismo less y permite editar cualquier archivo.
Nos permite también ver directamente archivos comprimidos sin tener que abrirlos
previamente.

Búsquedas dentro del árbol de directorios.

Para este objetivo podemos usar dos comandos, el primero find, es muy lento porque
hace búsquedas en vivo dentro del árbol de directorio, pero es muy efectivo ya que nos
da información real al momento de la ejecución:

find /etc -name "host*" -printEsto lo que haría sería encontrar dentro del
directorio /etc todos los archivos que contengan la palabra host* e imprimir esta info.

find /usr -name "*bin*" -print


encontraría cualquiera que tenga bin (cualquier cosa delante y detrás) dentro de /usr

El otro comando muy fácil es locate, permite hacer búsquedas dentro de una BD
generada en cada madrugada. Esta búsqueda es extremadamente rápida, pero como la
BD se genera en la madrugada, puede ocurrir que algunos archivos no aparezcan o
aparezcan pero ya no existan.

locate dos2unix
buscaría cualquier referencia a dos2unix

Si quisiéramos actualizar la BD con la información al momento actual, podemos


ejecutar: updatedb y esperar un tiempo a que actualice, si el filesystem contiene
muchos archivos demorará algunos minutos u horas

Directorio /proc

Este directorio contiene muchísima información que podemos leer y hasta escribir para
mandarle mensajes al kernel, o para obtener información del kernel.

En /proc se listan diferentes aspectos del sistema como la memoria o procesadores, los
dispositivos usb activos y también información sobre todos y cada uno de los procesos
del sistema (son esos numeros que se ven si listamos /proc)

Algunos datos interesantes que podemos obtener:


cat /proc/meminfo
nos indicará variada información sobre la memoria del sistema (RAM y virtual)
información que también podemos obtener con el comando free de una forma muy
resumida.

[root@eperez ~]# free -m


total used free shared buffers
cached
Mem: 440 433 6 0 72
127
-/+ buffers/cache: 233 207
Swap: 509 0 509
en este caso free me indicaría que tengo 440mb de memoria de los cuales se están
usando 433 y efectivamente quedan libres 6 megas.

Pero que de esos 433 megas en uso, 72 se están usando para áreas de intercambio y 127
es memoria de caché con actividad reciente para no tener que acceder al disco, lo que
significa que esos 72+127megas son descartables por el sistema para cualquier uso que
amerite (233megas) y en realidad el sistema tiene una necesidad de memoria que al
momento asciende a 207mb los cuales sí no son descartables (es decir, esa es la
memoria realmente requerida por el sistema).

/proc/cpuinfo nos indicará la cantidad de procesadores que tenemos (comenzando por el


procesador 0) y además nos dirá la marca del procesador y la velocidad a que está
corriendo así como cierta información adicional sobre este procesador. En mi caso:
[root@eperez ~]# cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 6
model : 8
model name : AMD Sempron(tm) 2400+
stepping : 1
cpu MHz : 1666.982
cache size : 256 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags
: fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36
mmx fxsr sse syscall mp mmxext 3dnowext 3dnow
bogomips : 3268.60
Es un procesador sempron 2400+, que la cpu corre a 1666mhz y tiene una cantidad de
bogomips equivalente a 3268.6

bogomips es una forma que tiene el kernel de determinar mediante una medida no
científica la velocidad de un procesador al momento de bootear, mediante lo que llaman
un loop ocupado. Básicamente es la cantidad de millones de veces por segundo que un
procesador puede estar sin hacer nada.

En mi caso uso mucho los bogomips para comparar qué tan lento o rápido es un
procesador con respecto a otro, sin importar los valores que digan los fabricantes.. es el
bogomip para mi una de las herramientas de medición más fuertes.

Apagado y reinicio de la máquina

Todos estos comandos ayudan a un reinicio o apagado correcto de la máquina, es decir,


no sólo la reinician sino que se ocupan de cerrar todos los archivos y bajar todos los
procesos de la máquina así como de intentar desmontar las particiones que tengamos
montadas antes de proceder a apagar el servidor o de reiniciarlo.

Para reiniciar la máquina tenemos varias alternativas:

El comando
reboot
cerrará todas las aplicaciones y procederá a reiniciarla.
shutdown -r now
hará igual trabajo

O sencillamente desde el ambiente de texto podemos apretar: CTRL-ALT-DEL y se


procederá a reiniciar la máquina.

Para detener la máquina sin reiniciar podemos usar:


shutdown -h now
que detendrá la máquina sin apagarla.

o mucho más fácil:


halt
que detendrá la máquina después de haber bajado todos los procesos.

Ninguno de los procesos anteriores apaga la máquina, sencillamente descargan el


sistema operativo pero el hardware sigue encendido.

Si nuestra máquina lo permite, podemos apagar una máquina después de haber detenido
al sistema operativo, esto se hace sencillamente con el comando:
poweroff
apagará la máquina al final del proceso.

El editor vi fue el primer editor de pantalla completa para los sistemas Unix.

Es simple, pequeño y elegante. En las tareas de administración del sistema es muy


empleado. Basado en los mismos principios que otras aplicaciones Unix, vi no incluye
su propio revisor ortográficos, o formateador de textos, pero existen otros programas
que lo realizan, los cuales pueden ser usados dentro del vi, con lo que se logra
interactuar con otras aplicaciones para tener la funcionalidad que se requiera.

Inicio de vi

Para usar el editor con algún archivo que se desee crear o modificar se deberá teclear vi
archivo

$ vi prueba

1.Observa que en la pantalla aparece el cursor en la esquina superior izquierda y


en la parte inferior una columna de caracteres , los cuales nos indican que estamos
en el fin del archivo. Anota y explica lo que aparece en el renglón inferior

"prueba" [noeol] 4L, 12C indica el numero de lines y caracteres que contiene el archivo.

NOTA: Antes de continuar, revisa el tema de Guardando archivos y saliendo del vi

Insertando texto y moviéndose


Mientras se esta usando vi, en algún momento se esta en uno de los siguientes tres
modos de operación: modo comando, modo edición (se muestra en la línea inferior del
lado izquierdo -- INSERT --) y modo extendido que se inicia al teclear :.

Después de que se inicia, se esta en el modo comando, en este modo se permite que se
use un determinado número de comandos (usualmente de una sola letra) para modificar
el texto. Para insertar texto y modificarlo se requiere estar en el modo edición.

2.Para iniciar la inserción de texto teclear i y teclear lo siguiente:

Ahora es el momento para que todos hombres buenos vengan ayudar a la fiesta.
Mientras se esta insertando texto, se pueden teclear tantas líneas como se desee
(presionando la tecla Retorno) y corrigiendo errores usando la tecla retroceso. Para
finalizar el modo edición y regresar al modo comando, presiona la tecla ESC.

Estando en el modo comando, se pueden usar las teclas con flechas para moverse en el
archivo, o también se pueden usar las teclas h, j, k, l, que mueven el cursor a la
izquierda, abajo, arriba y derecha respectivamente.

3.Existen otras formas de insertar texto. El comando a inserta texto después de la


posición actual del cursor. Mueve el cursor hasta que quede entre las palabras
todo y hombres, presiona a y teclea los , y después presiona ESC para regresar al
modo comando.

4.Para insertar una línea abajo de la actual, usar el comando o. Presiona o y teclea
lo siguiente:

Después iremos por piza y helado.

Si no se sabe en que modo se esta se puede presionar ESC para salir del modo edición y
regresar al modo comando, si ya se estaba, entonces no hace nada y pita.

Borrando texto y deshaciendo cambios.


5.Desde el modo modo comando, la x borra el caracter donde esta situado el
cursor. Anota lo que tienes que hacer para borrar la palabra helado incluyendo el
espacio y el punto.

RESPUESTA:
tecleando 7 veces x

6.Anota lo que debes hacer para agregar al final de la segunda línea el texto
refresco dietético. colocando el cursor en lugar deseado y presionando "a"

7.Se pueden borrar líneas enteras usando el comando dd (se debe presionar dos
veces d en un renglón). Anota la forma de borrar la segunda línea.
RESPUESTA:
Teclendo dd
8.El texto que ha sido borrado puede ser reinsertado usando el comando p.
Presiona p para poner la línea borrada después de la línea actual. Usando P se
insertará el texto antes de la línea actual. Anota de que forma mueves la primer
línea al final.
RESPUESTA:
tecleando dd en la primera linea y despue el comando p

9.El comando u deshace los últimos cambios y con CTRL-R se puede rehacer.
Presiona varias veces hasta que se regrese al estado que se tenía inicialmente en el
punto anterior.

10.Para borrar una palabra debajo del cursor, se debe usar el comando dw. Coloca
el cursor en el principio de la palabra dietético, y anota cuantas veces diste el
comando dw para borrar toda la palabra.
RESPUESTA:
2 veces

Cambiando el texto
11.Se reemplaza texto usando el comando R, el cual sobreescribe el texto
comenzando a partir de donde esta el cursor. Coloca el cursor en la primera letra
de piza, presiona R y teclea hamburguesas y papas. Observar que se queda en modo
edición, por lo que para regresar deberás teclear ESC

El comando r reemplaza por un sólo caracter debajo del cursor. Este comando no se
queda en modo inserción, por lo que no se requiere usar ESC para regresar al modo
comando.

12.El comando ~ (en un teclado en español presionar AltGr-4) cambia de


minúscula a mayúscula o viceversa la letra que en donde esta el cursor. Cambia la
palabra hamburguesas a mayúsculas.

Otro comando útil para cambiar palabras es el comando cw, que permite ingresar una
nueva palabra y -después de presionar ESC- borrar el resto que pudiera quedar de la
palabra original.

Comandos para moverse


El comando w se usa para mover el cursor a la siguiente palabra; b mueve al principio
de la palabra actual o de la palabra anterior si ya estaba al principio. El comando 0
(cero) mueve el cusor al principio de la línea actual, y el comando $ lo mueve al final.

Para moverse una pantalla hacia adelante o hacia atrás en el archivo presionar CTRL-F
y CTRL-B respectivamente.

Con el comando CTRL-G se puede mover al final del archivo. También se puede mover
a una línea arbitraria si primero se da el número de línea y luego el comando, por
ejemplo, 10G, moverá el cursor a la línea 10 en el archivo. Para moverse al principio del
archivo, ¿qué se deberá teclear?

Tecleando / seguido de un patrón y retorno se logra pasar a la primera ocurrencia en el


texto después del cursor. Usando ? se hace hacia atrás.

Se pueden acoplar comandos de movimiento con otros comandos, tales como borrado.
Por ejemplo, el comando d$ borrará todo desde el cursor hasta el final de la línea; dG
borra todo desde el cursor hasta el final del archivo.

Guardando archivos y saliendo del vi.


Muchos de los comandos relacionados con archivos son invocados en el modo
extendido. Se entra al modo extendido cuando se presiona :, con lo que se coloca el
cursor en la última línea de la pantalla, permitiendo que se ingresen varios comandos
extendidos.

Por ejemplo, para guardar un archivo que esta siendo editado, se usa el comando :q. El
comando :wq escribe y sale del vi (el comando ZZ es el equivalente).

Para salir del vi sin guardar los cambios en el archivo, usar el comando :q!.

Edición de otro archivo


Para editar otro archivo, usar el comando e:. Por ejemplo para terminar de editar prueba,
y editar el archivo otro, se teclearía e otro

Se pueden incluir otros archivos en el archivo actual usando el comando r:, por ejemplo
si se tiene creado un archivo otro y estamos en prueba, se puede teclear :r otro para
insertar el contenido a partir de la línea actual.

Ejecución de comandos
El comando :! permite poner el nombre de un comando, el cual es ejecutado dentro del
vi.

13.Teclea lo siguiente :! ls -F y anota lo que se sucede.

RESPUESTA:
aparece todo lo que se ha realizado en el grafico

El comando :r ! es similar al anterior, pero incluye la salida


estándar del comando en el buffer.

14.Anota lo que sucede al teclear : r! ls -F

RESPUESTA:
se copiarían los contenidos del comando dentro del archivo que estamos editando.

Búsqueda y reemplazo
El comando:

:[x,y] s/patrón/reemplazo/banderas

busca el patrón entre las líneas x y y en el buffer, y reemplaza con el texto reemplazo. El
patrón es una expresión regular, reemplazo es un texto literal, pero puede contener
caracteres especiales para referirse a elementos del patrón original. El siguiente
comando reemplaza las primeras ocurrencias de pez por peces desde la línea 1 hasta la
10:

:1,10 s/pez/peces
En vez de dar un número, se puede usar el símbolo % para referirse a la línea entera, y $
se refiere a la última línea.

Otros editores
Aunque no recomendamos el uso de otros editores, porque el vi es un estándar casi
universal en el mundo de linux, les indicamos algunas variantes para usar:

• nano
• pico
• joe

Estos tres son otros editores muy usados, pero repetimos nuestra advertencia, podrán
parecer fáciles pero puede que no existan en todos los sistemas unix que tengamos que
trabajar, lo que nos podría hacer pasar un apuro de no existir. Sin embargo el vi
SIEMPRE estará presente en cualquier sistema unix por lo que es casi de uso
obligatorio el aprender comandos para manejarlo.

Para instalar el centos, normalmente requerimos tener los 4 discos de instalación. El 1


es el más usado, pero en dependencia de las opciones que escojamos puede que
necesitemos algunos paquetes de los demás discos.

Lo primero que hay que hacer para instalar el centos es configurar el BIOS de nuestra
máquina de forma tal que este permita bootear y arranque desde el CDROM de nuestra
máquina.

Al terminar de indicarle al BIOS que el primer dispositivo de arranque es el CDROM,


insertamos el disco 1 de centos y veremos la siguiente pantalla:

Básicamente lo que nos indica es que para comenzar a instalar en modo gráfico,
presionemos enter.

Además nos indica que para arrancar en modo texto escribamos: linux text y
presionemos enter.

Arrancar en modo texto es muy útil porque a veces la tarjeta de video de nuestra
máquina no es muy compatible con el sistema gráfico de instalación y falla este sistema,
pero podemos usar perfectamente el instalador en modo texto y culminar el proceso.

La gran mayoría de las veces, aunque instalemos en modo texto, el ambiente gráfico
funcionará de maravillas y sin mayor inconveniente. Es sólo que el sistema gráfico del
instalador es muy simple y a veces no detecta bien las tarjetas de video.

Si deseamos ver más opciones de instalación o trabajo con el CD podemos apretar F2 y


analizarlas, no es mi interés verlas ahora.

Procedamos a presionar ENTER y el sistema comenzará a cargar un kernel básico que


viene en el cd de instalación que se ocupará de probar los dispositivos que tengamos en
nuestro hardware.
Posteriormente nos sacará una pantalla la cual nos da la opción de probar los CDs que
tenemos para verificar que no existan errores al haberlos quemados.

Yo sugiero al menos una vez, la primera vez que usemos los cds para instalar, que
verifiquemos estos. Pues así podemos estar seguros de que están bien quemados.

Si la verificación fallase, debemos inmediatamente quemar otro cd en reemplazo de éste


que falló pues es casi totalmente seguro que nuestra instalación en algún momento dirá
que el cd está malo y se negará a proceder, haciéndonos perder tiempo y dejándonos un
sistema a medio instalar.

Si ya sabemos que nuestros cds están bien quemados (sugiero quemarlos siempre a 4x
pues a más velocidad fallan más) entonces podemos apretar en el botón de skip, lo cual
saltará el proceso de verificación.

Hagamos Ok y verifiquemos el cd 1, una vez hagamos ok, nos dará dos opciones: Test,
para probar el cd que tenemos insertado (el 1) y Eject para sacar este cd y poner otro
para ser probado.

el orden de los CDs no importa, el instalador se dá cuenta de qué CD es el que está


insertado y los verifica en cualquier orden.

Ok, presionemos en text (con espacio o con enter)

Comenzará a correr un termómetro (en ambiente de texto todo todavía) que nos indicará
cómo va el proceso, debe avanzar poco a poco, rápido o lento según el lector del cd y
según si el cd está dañado o no:

Al final, cuando acabe de probar el disco, nos emitirá un resumen en el que nos indicará
si él considera que el disco está bueno (PASSED) o falló (FAIL), en mi caso pasó como
podemos ver:

Al apretar en ok, nos sacará el CD del lector para darnos la oportunidad de probar el
segundo, tercero y cuarto.

Al finalizar el proceso de verificación de los 4 CDs, podremos tener la certeza de que


este lector sí lee bien los 4 cds y que seguramente la instalación nuestra no fallará por
problemas físicos en un disco.

Si un CD fallara diría un mensaje como este (en este caso es de un CD numero 2 que
falló):

Si ocurriera algo así, tendríamos que volver a quemar y verificar nuevamente el disco 2
(el nuevo disco quemado) para estar seguros de que podemos continuar con todos los
discos buenos.
Una vez todos estén bien, podemos entonces poner el CD 1 nuevamente en el lector y
apretar continuar. Para entonces sí comenzar con la instalación

Después de unos breves segundos en el que el instalador comenzará a cargar el servidor


gráfico y demás drivers y nos mostrará la pantalla de bienvenida:

Si no cargara esta pantalla o se demorara mucho tiempo sin mostrarla o fallara y


reiniciara la máquina, entonces debemos valorar comenzar a instalar en modo texto. Los
textos serán muy similares a los que veremos aqui sólo que sería en modo texto y no
gráfico.

Básicamente a la izquierda tenemos una pequeña ayuda o información sobre cómo


operar el sistema. Tenemos un botón debajo que dice Hide Help para ocultar este
recuadro de ayuda y otro que dice Release Notes para ver las notas adicionales que
redhat/centos han liberado sobre esta instalación.

Lo que más nos interesan son los botones de Back (deshabilitado pues es la primera
pantalla) y next, para proceder.

Siempre recomiendo leer bien todos los mensajes de cada pantalla pues ellos nos
indican cómo debemos proceder. En caso de tener algún error anotarlo
completamente para poder preguntar a quien nos pueda ayudar.

En el caso de que estemos instalando rhel, veremos los logos y textos de redhat, pero el
proceso de instalación será exactamente igual al que estamos viendo aqui.

Apretemos Next, para ir navegando entre las diferentes pantallas y las iremos
explicando.

La primera pantalla que aparece nos pedirá en qué idioma deseamos que el instalador
nos muestre los mensajes y opciones. Yo sugiero que inglés ya que el inglés está
completo y puede que en otros idiomas no aparezcan los textos correctamente
traducidos o aparezcan en inglés (no estarán traducidos del todo)

A propósito, ésta pantalla que vemos no es la única que levanta linux a la hora de
instalar. Linux tiene múltiples consolas las cuales usa durante la instalación para
mostrar diferentes mensajes relacionados con diversas etapas o pasos que está
siguiendo. La consola gráfica es en la que estamos en este momento y si nos fuéramos
de ella podremos regresar presionando ALT F7

Para ir a otras consolas podremos presionar CTRL ALT F1 y ahi nos movemos a la
primera consola de texto, no se pierde la posición de la consola gráfica, sólo que se
cambia de consola. Y así podemos usar hasta la F4

La pantalla de texto inicialConsola Nos muestra


ALT F2CTRL ALT F1 Nos ofrece un shell por si acaso necesitamos
trabajar en un shell
ALT F3 Nos indica los módulos insertados así como
los pasos del instalador por donde vamos.
ALT F4 Mensajes relacionados con el kernel
ALT F7
Ambiente gráfico
Linux es un sistema operativo cuya lengua franca es el inglés y la enorme cantidad de
información que tendremos será en inglés.

En caso de usted haber pasado inglés por la universidad pero el inglés no haya pasado
por usted sugiero tomar un curso de inglés con cualquier centro que lo ofrezca para
mejorarlo pues les indico desde ya que es sumamente importante el conocer este
idioma.

Pero bueno, en caso de que conozcamos árabe, francés, español, italiano, portugués,
podremos pedirle al instalador que nos hable en esos idiomas. Por mi parte lo dejaré en
inglés:

La siguiente pantalla es relativa al tipo de teclado que nosotros tenemos. En mi caso es


un teclado en inglés (lo prefiero porque en linux se usa mucho el / y en el caso de
teclados en inglés el / queda abajo a la derecha y no requiere del uso de shift como el
teclado en español).

Como deseo que el teclado me permita imprimir acentos, le indico que es United States
International. Así podré escribir acentos ñ y demás caracteres internacionales.

Por supuesto, siempre debemos escoger el teclado adecuado en nuestro ambiente, Latin
American, Spanish, pueden ser opciones válidas para nosotros en caso de que tengamos
la suerte de tener teclados en español con distribución latinoamericana.

A propósito, las diferencias entre un teclado latinoamericano y español son muy sutiles,
y para el caso de linux es indispensable no equivocarse o sufriremos de un teclado mal
configurado puesto que estos teclados difieren en la posición del @, | entre otros
caracteres muy usados en el mundo de linux.

Al acabar de escoger el teclado, linux procederá a buscar instalaciones de centos previas


(centos 3, rhel2.1, o rhel3, rhel2.1) y de estar presentes el instalador de centos nos
ofrecerá actualizar estas versiones. En el caso de que no existan instalaciones previas de
rhel o centos se nos ofrecerán 4 modos básicos de instalación:
En general estos modos le harán saber al instalador cuáles son los paquetes que
posiblemente necesitemos para nuestro trabajo en esta máquina. Por supuesto que
posteriormente podremos escoger más o menos paquetes, pero será una guía general y
bastante precisa de los paquetes que requeriremos.

Estos modos son:


PModo Utilidad fundamental
a
r
a

u
s
a
r
l
o

c
o
m
o

s
i
s
t
e
m
a

d
e

o
f
i
c
i
n
a
,

o
f
f
i
c
e
,

a
m
b
i
e
n
t
e

g
De todas las formas de instalación, sugiero siempre se use el modo servidor, si es que
vamos a instalar un servidor para trabajar. Pero en el caso de este curso, sugiero usemos
el modo desktop, para contar con herramientas de compilación además del ambiente
gráfico y a medida que lo necesitemos iremos instalando los demonios requeridos por el
sistema.

Particionamiento del sistema


El particionamiento es una de las cuestiones más importantes a la hora de instalar un
sistema, sin un correcto particionamiento seguramente presentaremos muchas
dificultades en el futuro.

El instalador de CentOS ofrece dos modos de particionamiento, automático y basado en


l disk druid. No sugiero hacerlo automáticamente sino de forma manual (disk druid).

El particionamiento es un tema esencial a la hora de instalar y aqui indicaremos algunos


factores a tomar en cuenta a la hora de particionar. Sin embargo siempre debe tenerse en
cuenta las características propias de la instalación que se está haciendo y lo que
requerirá la empresa o lugar donde estemos instalando.

El particionamiento es útil por diversas razones como por ejemplo:

1. Permite permite controlar que un disco no se llene completo, si por casualidad


un proceso comienza a escribir descontroladamente a disco, solamente podrá
llenar la partición hacia donde escribe, mas no podrá llenar el disco completo.
La partición / requiere siempre de tener espacio disponible, si no
particionáramos correctamente podríamos llenar / y por lo tanto dejar el sistema
sin funcionar.
2. Si un pedazo del disco se dañara, muy posiblemente el resto podrá ser todavía
utilizado y recuperado. Por supuesto un disco dañado requiere de una migración
inmediata hacia otro disco. Pero no es lo mismo perder la única partición que
tenemos a perder sólo una de las varias.
3. Posteriormente estudiaremos seguridades al sistema concebidas para trabajar
con particiones. Sin un correcto particionamiento no podríamos implementar
estas seguridades.

Básicamente nosotros preferimos particionar el disco en al menos 6 áreas que serán


usadas para montar los directorios:

• /boot
• /usr
• /home
• /var
• /
• SWAP

Aquí detallaré los por qués de cada tamaño según su punto de montaje:

/boot:
Es en la partición /boot donde el sistema operativo linux guarda todos los kernels
instalados en el sistema. En efecto, cada máquina puede tener varios kernels para
bootear, la razón más común es porque son kernels viejos que linux va dejando como
copias de seguridad.

La arquitectura para PC sólo permite bootear un sistema operativo cuyo kernel esté
localizado dentro de los primeros 1024 cilindros, y es por esto que el lugar donde esté el
kernel debe estar localizado lo más próximo al inicio del disco, para que siempre caiga
en los primeros 1024 cilindros.

Seguramente uds se han preguntado alguna vez: ¿Por qué windows funcionaba
normalmente y hoy no arranca?

Bueno, en realidad windows es un sistema operativo muy inestable, pero una de las
razones más frecuentes (pero poco conocidas) es que posiblemente el kernel de
windows fue actualizado "ayer" (actualizaciones de windows) pero este nuevo kernel
por alguna razón quedó por encima de los 1024 cilindros, lo que hace que al siguiente
día cuando encendamos la máquina, ésta se niegue a arrancar el sistema operativo.

Es una razón muy común y definitivamente por esta razón debemos asignarle a /boot la
primera partición posible, y el tamaño recomendado para RHEL4 es de 100MB con esto
bastará para guardar al menos unos 30 kernels diferentes. La realidad es que el kernel de
linux se actualiza pocas veces en el año.. y a medida que se estabiliza el sistema se
actualiza menos, por lo que sobrará espacio.

Resumen: /boot debe ser forzada a ser primaria y debe tener 100MB

/usr

Es un área del sistema donde se almacenan gran cantidad de binarios que vamos
instalando con el tiempo, aplicaciones de todo tipo, ayudas, etc. Por lo tanto debe tener
un tamaño considerable de acuerdo a las instalaciones que haremos. Yo siempre le
asigno al menos 2GB, pero de ser posible le asigno mucho más espacio (digamos 10GB
o más).

Resumen: /usr debe tener al menos 2GB, de preferencia 10GB o más. En dependencia
del tamaño del disco.

/home

Directorio del sistema donde se guardan todos los directorios de usuario también
conocidos como directorios home de los usuarios. En caso de que tengamos un sistema
personal, posiblemente no sea necesario tener /home, en caso de que trabajemos para
una empresa y cada usuario vaya a almacenar algún tipo de dato en /home, debemos
asignar un valor apropiado.

Comúnmente se usa para guardar los mensajes de correo de los usuarios con el
protocolo imap. Si usaremos IMAP para almacenar los mensajes de los usuarios en el
servidor, debemos asignar a /home un valor apropiado para que TODOS los mensajes
de los usuarios quepan, digamos 50GB, 80GB o más.
Resumen: Si usaremos IMAP debemos asignarle un valor alto. Para este curso
asignaremos 1GB para los efectos de probar.

/var

Directorio donde se almacenan los logs y la caché de algunos programas. Pero sobre
todo es donde se almacenan los INBOX de todos los usuarios
Muchas veces es necesario migrar entre una versión de Linux redhat y otra. A estos
efectos redhat trae una utilería muy interesante y fácil de usar en su disco de instalación.

Al insertar el disco 1 de cualquier redhat, podemos escribir:


linux upgradeany
Y esto arrancará el instalador de redhat en modo de actualización. Se seguirán los
mismos pasos iniciales, pero redhat intentará buscar una distribución anterior de redhat
y solicitará actualizarla.

Al actualizarla, debemos verificar que esta instalación no haya sido comprometida pues
sino la actualización casi seguramente fallará. En cursos subsiguientes indicaremos
cómo proceder a revisar contra ataques un sistema linux.

El proceso de actualización es simple y claro, el instalador verificará si en efecto hay


una instalación anterior de redhat (centos o wbel) indicará algunas advertencias como
que actualizar puede ser peligroso y algunas cosas pueden no funcionar, etc, etc y a la
final procederá a obtener una lista de paquetes instalados y a actualizarlos con las
versiones más modernas, de ahi reinicia y listo.

Básicamente yo acepto todas las advertencias (Desea continuar? Respuesta: Si) y dejo
todas las opciones que me pide por defecto. Es decir, no ando cambiando opciones por
todas las pantallas.

El proceso es rápido realmente y hasta el momento no me ha dado problemas.

Aunque técnicamente es posible actualizar de cualquier versión anterior de redhat hacia


cualquier otra versión nueva, sin importar las fechas y numeros, nosotros no
recomendamos que se actualice sin un previo análisis.

Aquí indicaremos una pequeña ruta para realizar la migración entre diferentes redhat
para que esta sea lo más fácil posible.
RH7.2-> RH7.3- RHEL3
>
RH8-> RH9-> RHEL3

grupootrosRHEL2.1 RHEL3-> RHEL4


->
dusuarioSemana 2 rwx r-w r-w
2
Recuperación del
sistema operativo
ante desastres.
Manejo de usuarios
y permisos,
delegación de tareas
del superusuario y
manejo de cuotas de
disco.

Revisar un buen
manual
introductorio a la
administración de
linux aqui

Tipos de fallas
Las fallas se pueden
catalogar en 4 tipos
fundamentales, es
un tema muy bien
estudiado y
extendido en
variados lugares, les
sugerimos que
revisen y analicen
cada una de ellas
aqui.

Estas básicamente
son:

• Fallas del
hardware
• Fallas del
software
• Fallas
ambientales
• Errores
humanos


• Planificación
ante
desastres
Es indudable
que los
desastres
existen, que
los desastres
no se pueden
evitar
mayormente,
pero lo que sí
podemos
hacer es
prevenirlos,
planificarnos
para cuando
ocurran
poder
tramitar
rápidamente
cualquier
evento que
ocurra.

Para esto es
muy
importante
mantener
políticas de
acción ante
fallas,
escribirlas,
detallarlas y
practicarlas
en nuestra
organización.
Estas
políticas son
propias de
cada una de
las
organizacion
es por lo que
no existe un
procedimien
do único
para
trabajar.

Estos
estudios
deben
realizarse no
sólo para
nuestros
servidores
linux, van
mucho más
allá de un
curso de
linux y son
un punto
muy
importante a
tener en
cuenta en
una
organización.

Aquí listamos
algunos sitios
que nos
pueden
ayudar a
analizar
planificacion
es ante
desastres y
sugerimos
que como
estudio
independient
e realicen un
estudio
completo de
ellos:
http://www.li
nux-
backup.net/
http://www.d
isasterplan.co
m/

• Linux Rescue

En linux hay
muchas
ocasiones en
que
perdemos el
arranque del
sistema (por
ejemplo si
instalamos
windows
después de
haber
instalado
linux), o que
el sistema
por alguna
inexplicable
razón se
niega a
levantar,
normalmente
porque
hemos
cambiado de
discos o el
disco de
posición.

El primer
CD de
CentOS 5
(RHEL 5) es
booteable,
fue por esta
vía que
realizamos la
instalación
del sistema.
Pero también
este CD nos
da una
opción muy
muy útil, que
es la llamada
linux rescue

Esta opción
nos permite
arrancar
desde el
kernel que
está instalado
en nuestro
CD, y
mediante un
pequeño
script de
arranque,
este CD será
capaz de
detectar las
particiones
de redhat
(centos) que
tengamos
instaladas y
las montará
en el
directorio:
/mnt/sysimag
e

Una vez
montadas,
nos dará un
shell, en el
que
podremos
trabajar más
fácilmente.

Nota: Al
arrancar el
linux rescue,
hagámoslo
con esta
opción
completa
para
deshabilitar
el selinux:
• linux rescue
selinux=disab
le

• De esta
forma
arrancaremo
s el modo de
rescate
(rescue) pero
con el
ambiente de
seguridad
selinux
deshabilitado
, de lo
contrario
podremos
presentar
problemas
por ejemplo
a la hora de
intentar
cambiar la
clave.

Al arrancar
en modo
rescue, nos
preguntará si
deseamos
arrancar la
red para este
sistema,
digamos que
NO

Después nos
indicará que
si queremos
que revise
instalaciones
de redhat
hechas,
digamos que
SI...
normalmente
las
encontrará y
las montará
en
/mnt/sysimag
e, de no
poder
montarlas
igualmente
procederá a
darnos un
shell para
que hagamos
lo que
creamos
conveniente.

Una vez en el
shell
podemos
usar algunos
comandos
para manejar
los discos.
Estos pueden
ser (Por
favor no
grabar nada,
no usar de
ser posible!):

fdisk:

• fdisk -l nos
permitirá ver
las
particiones y
discos que
tenemos
instalados.
fdisk
/dev/xxx nos
permitirá
acceder a un
determinado
disco para
reparticionar
lo, borrar
particiones,
analizar
cualquier
situación
relativa a
particiones.
Un ejemplo
puede ser:
fdisk
/dev/hda

El fdisk es
sencillamente
como en
windows un
comando que
se usa muy
infrecuentem
ente, sobre
todo para
darle de alta
(particionar)
nuevos discos
o para
revisar o
corregir
discos con
particiones
previamente
creadas.

• mkfs.ext3 nos
permite
formatear
una partición
que ya
hayamos
creado con el
fdisk. Por
ejemplo:
mkfs.ext3
/dev/hda3
formateará la
partición
hda3 con el
formato ext3.

Si queremos
usar otro tipo
de formato
podemos
usar
mkfs.ext2

Si deseamos
chequear un
filesystem
determinado,
podemos
hacerlo
sencillamente
con el
comando:
fsck
/dev/hda1 (o
cualquier
otra
partición que
requieramos)
.

Este es uno
de los
comandos
más usados a
la hora de
usar el linux
rescue, pues
muchas veces
el sistema
falla por una
caída
desordenada
y debemos
realizar una
revisión del
FS. En efecto
aunque el FS
tipo ext3 es
muy bueno
recuperándos
e, a veces hay
que
ayudarles a
recuperarse.

En caso de
encontrar un
error el fsck
les
preguntará
qué hacer y
les sugerirá
la variante
más
conveniente,
en todos estos
años de
trabajo no
hemos
hallado
ninguna
razón por no
decir que
"yes" a la
variante que
presenten,
por lo tanto
cuando
pregunte si
aceptamos
reparar o
borrar algo,
sugiero
siempre
digan 'y'.

También se
puede
ejecutar el
fsck -y
/dev/xxx con
el switch -y el
sistema
asumirá que
diremos sí a
todas las
preguntas.

Enjaulándon
os en la
partición
original de
redhat.
Otra opción
que nos
brinda el cd
de arranque
de redhat
(centos) es
que una vez
que nos
brinda el
shell,
también
monta dentro
del directorio
/mnt/sysimag
e todo el FS
de nuestro
servidor de la
misma forma
que se monta
de forma
normal.

Sólo que la
raíz del
sistema
original
queda en
/mnt/sysimag
e, cuál es el
objetivo de
poner la raíz
del sistema
original en
otro
directorio?
básicamente
evitar que si
los binarios
del sistema
original han
sido
cambiados
por un
atacante,
podamos
usar los
binarios
básicos que
nos brinda el
cd de
arranque.

Ahora, si
estamos
seguros que
no es un
problema de
un ataque, o
si estamos
sencillamente
ante una
situación
diferente a
un ataque
como por
ejemplo:
quisiéramos
cambiar la
clave de root
porque la
hemos
perdido o si
queremos
reinstalar el
grub, o si en
general
necesitamos
realizar
reparaciones
que
conocemos su
alcance y
sabemos que
no es un
ataque
podemos
enjaularnos
en ese
directorio
para usar el
arbol de
directorio tal
y como se usa
en un sistema
normal.

• chroot
/mnt/sysimag
e

• Con este
comando,
logramos
trasladar la
raíz de
nuestro
sistema hacia
/mnt/sysimag
e, de forma
tal que
caemos
exactamente
en el árbol de
directorio de
nuestro
servidor.

Una vez
dentro de la
jaula
podemos
proceder
cambiar la
clave de root,
por ejemplo:

• passwd

• o también
podemos
editar
/etc/passwd y
eliminar la x
que está en la
segunda
columna, esta
es una forma
un poco dura
pero efectiva
de eliminar
la clave de
root.

• root:x:0:0:ro
ot:/root:/bin/
bash

podemos
dejarlo así:
• root::0:0:roo
t:/root:/bin/b
ash

De esta
forma
quitamos la
clave a root y
podemos
bootear
normalmente
.

Otra utilidad
de
enjaularnos
en el sistema
original
puede ser la
de
reemplazar o
sustituir un
paquete rpm,
por ejemplo
un nuevo
kernel o un
kernel que
sabemos que
bootea, una
vez aqui en el
shell
podemos
arreglarlo.

Además, si
hemos
perdido el
grub (por
ejemplo
porque
hemos
instalado
windows y
windows
siempre
cambia el
MBR y pone
su propio
loader)
podemos
hacerlo por
esta vía:
• /sbin/grub-
install
/dev/hda

• Nos
permitirá
reescribir el
grub hacia el
disco
/dev/hda y
restaurar
todas las
configuracio
nes de éste.

Reinstalar el
grub es una
acción poco
traumática
pero que
ocurre a
veces, sobre
todo cuando
hemos
instalado
windows
después de
haber
instalado
linux.

• Arrancando
en modo
single

El modo de
arranque
tipo rescue es
muy bueno,
pero a veces
no tenemos
que llegar a
estos
extremos, por
ejemplo si
sólo
requerimos
un shell sin
necesidad de
escribir la
clave de root
podemos
hacerlo
llamando al
kernel desde
el grub pero
con el
comando
single:
1. En el grub,
presionar
cualquier
tecla para
caer en el
menú de
arranque
2. En el kernel
por defecto,
apretar la
tecla a y
escribir
single
3. El sistema
arrancará en
modo
monousuario
y sin
ambiente
gráfico ni
red, nos
mostrará un
shell desde el
que
podremos
por ejemplo
cambiar la
clave de root
o en general
realizar
cualquier
tarea que no
requiera o
que no
deseemos que
tenga la red
activa.
4.
5. Desactivar
SELinux
Selinux como
ya hemos
hablado es
un sistma de
seguridad
muy
novedoso que
ha
implementad
o redhat y
otras
distribucione
s, sin
embargo
muchas
aplicaciones
no están
preparadas
para trabajar
con el selinux
activado.

Es por esto
que a la hora
de instalar
Linux,
recomendam
os que
desactivaran
el SELinux
desde el
mismo
instalador.

Sin embargo
muchas veces
nos topamos
con sistemas
previamente
instalados
por personas
que no
conocen
mucho de
estos detalles
o
sencillamente
lo hemos
dejado
activado por
error.
Entonces nos
queda la
opción de
desactivar el
selinux. Para
esto,
arranquemos
en modo de
rescate. Una
vez dentro
del sistema
en modo
rescate,
procedamos
a editar el
archivo de
configuració
n del selinux:
6. vi
/mnt/sysimag
e/etc/sysconfi
g/selinux
o si estamos
en la jaula
podemos
hacer:
vi
/etc/sysconfig
/selinux

7. y veremos
una opción
que dice:
8. SELINUX=e
nforcing
le podemos
cambiar a:
SELINUX=di
sable

9. Y listo, el
sistema a
partir de que
reiniciemos
arrancará
por defecto
con el selinux
deshabilitado
lo que nos
evitará
problemas
con el
selinux.
10.
11. Chequeo de
memoria
Existen
ocasiones en
que dudamos
de que la
memoria esté
correctament
e
funcionando.
Es por esto
que
requerimos
de
programas
para
verificar la
memoria. El
CD de
arranque de
Centos4 nos
ofrece por
defecto una
aplicación
muy sencilla
pero muy
conocida y
poderosa que
nos permitirá
revisar la
memoria.

Es un
proceso muy
lento,
extremadame
nte
demorado,
pero
podemos
tener la
seguridad
que si tras
una hora de
revisión de la
memoria,
habremos
verificado
que esta no
tiene errores
comunes y
facilmente
descubribles.
Pero si
queremos
realizar un
chequeo
exhaustivo
debemos
dejar el
sistema
revisar la
memoria por
al menos 12
horas (una
noche) y así
tendremos la
seguridad de
que errores
casuales o
errores que
no salen a la
superficie
con una sola
revisión
pueden
mostrarse al
realizarse
varios pases.

El sistema se
llama
memtest86+
y lo podemos
ejecutar
desde el CD
de instalación
de CentOS
mediante:
12. memtest
13.
Este sistema
no permitirá
que nuestro
servidor
funcione
normalmente
, es decir, no
se realizará
otra
actividad
más que el
chequeo de
memoria por
lo que debe
planificarse
la revisión de
la memoria
para el
momento que
menos afecte
el
funcionamien
to de éste.
14.
15. Siempre es
importante,
para lograr
la
estabilidad,
realizar una
buena
planeación
del sistema
que vamos a
correr,
verificar que
tengamos un
sistema que
sea
actualizable
durante
largos
periodos de
tiempo, pues
en las
actualizacion
es se corrigen
una enorme
cantidad de
problemas
que pueden
causar
desastres o
situaciones
definitivame
nte evitables
si tenemos un
servicio que
se puede
actualizar.

16. Los usuarios


en linux, se
almacenan en
el archivo
/etc/passwd,
que aunque
su nombre lo
indica, no
almacena la
clave de los
usuarios, esta
es
almacenada
en el
archivo
/etc/shadow

La
información
que se
guarda de
cada usuario
en
/etc/passwd
es la
siguiente:
1. userna
me,
2. passw
d (ya no se
usa!)
3. UID,
4. GID,
5. nombr
e del usuario
(campo
informativo),
6. direct
orio base,
7. shell a
ejecutar
8. La
información
que se
guarda en
/etc/shadow
para cada
usuario es la
siguiente:
1. userna
me,
2. clave
encriptada,
3. día en
que la clave
fue cambiada
por ultima
vez,
4. días
durante los
que la clave no
puede ser
cambiada,
5. días a
partir de que
la clave tiene
que ser
cambiada,
6. días de
advertencia de
que la clave
debe
cambiarse,
7. días
después de
que la clave
expiró y se
deshabilida la
cuenta,
8. día en
que se
deshabilitó la
clave
9. De todos
estos campos,
los más
interesantes
son el
primero y
segundo, que
me permiten
manejar la
clave del
usuario

El proceso
completo
para la
creación de
un usuario es
el siguiente:
1. Se lee
/etc/defaults/
useradd
donde se lee
fundamental
mente el shell
por defecto a
asignar a los
usuarios
nuevos
(/bin/bash)
2. Se crea un
nuevo grupo
en /etc/group
con el
nombre del
usuario que
estamos
creando, este
GID será el
que se
asignará
en
/etc/passwd
3. Se crea una
línea en
/etc/passwd
donde se
almacena el
identificador
de usuario
(UID), el
grupo
primario del
usuario
(GID), el
directorio
raíz, el shell
que se
ejecutará
para el
usuario
4. Se crea una
línea en
/etc/shadow
donde se
indicará el
username y
la clave en
formato
deshabilitado
(!!), así como
opcionalment
e los tiempos
de expiración
de las claves,
etc.
5. Se crea el
directorio
raíz del
usuario
(usualmente /
home/userna
me)
6. Posteriormen
te se debe
proceder a
cambiar la
clave del
usuario por
una válida, y
se actualizará
/etc/shadow
con la nueva
clave. Estas
claves son
encriptadas
en una vía,
por lo tanto
no se pueden
obtener las
claves
intentando
desencriptarl
as.
7. Cómo
agregar
usuarios?
el comando
para agregar
usuarios es
useradd, este
comando no
le asigna
clave a un
usuario.

8. useradd
eperez
9.
Agregaría el
usuario
eperez con el
primer UID
disponible.
Le crea un
directorio
raíz
(/home/epere
z) y le asigna
el shell que
esté listado
en
/etc/defaults/
useradd

Posteriormen
te a
agregarlo,
debemos
ponerle una
clave:
passwd
ernesto

El sistema
nos verificará
que la clave
no sea fácil
de descubrir
y le asignará
esta clave al
usuario para
operar en
todo el
sistema.

passwd se
puede usar
también para
cambiar la
clave de
cualquier
usuario desde
root (passwd
usuario) o
cualquier
usuario
puede
cambiar su
propia clave
ejecutando
passwd

Cómo borrar
usuarios?
10. userdel -r
usuario
11.
el switch -r
indicará que
además se
borre el
directorio de
usuario, de lo
contrario no
lo borraría y
nos podría
dejar
información
inutil en
nuestro FS.

Cómo
cambiar
información?
Existe un
campo de
información
sobre el
usuario
(nombre y
demás) que
se puede
cambiar
ejecutando:
12. chfn
username
13.
Esta
información
ya casi no se
usa por nadie
en sistemas
linux, por lo
tanto no
hacemos
mucho
énfasis en
ella.

Cambiando
el shell por
defecto:
Actualmente
la mayoría de
los usuarios
que se crean
en un sistema
linux son
para que lo
usen como un
servidor de
mensajería,
esto es, los
usuarios no
acceden
directamente
al shell del
sistema sino
que usan sus
contraseñas
para leer los
correos y/o
enviarlos así
como para
potencialmen
te hacer otras
tareas como
acceder via
ftp.

De los
usuarios
comunes que
tendremos
(nivel
gerencial,
secretarias,
ingenieros de
otras áreas,
etc) casi
nadie conoce
del uso del
shell, por lo
tanto no es
necesario que
tengan un
shell. De esta
forma nos
ahorramos
potenciales
problemas a
la hora de un
ataque,
muchos
atacantes
hacen lo que
se conoce
como un
ataque de
diccionario,
mediante el
cual intentan
adivinar las
claves de los
usuarios de
un sistema
para poder
entrar por
esa vía. Una
vez dentro
intentarán
otros
métodos que
se hablarán
en cursos
más
adelantados,
mediante los
cuales
pueden
obtener
privilegios de
root.

Por lo tanto,
para leer
correos y
usar ftp no es
requerido
que un
usuario tenga
asignado un
shell como
bash, más
bien es un
potencial
problema, así
que sugiero
que siempre
que creemos
este tipo de
usuarios lo
hagamos con
un shell no
válido o un
shell que no
dejará entrar
al usuario,
por
ejemplo
/bin/false, lo
podemos
cambiar en
vez de
/bin/bash en
el archivo
de
/etc/passwd y
así el usuario
no podrá
usar el shell.

Ahora,
cambiar en
/etc/passwd
unos 10
usuarios es
algo que es
factible,
digamos que
cambiar 50 o
100 también
lo es, pero
mejor es el
no tener que
cambiar
constanteme
nte los shells
de los nuevos
usuarios, sino
más bien
crear todos
los usuarios
con un shell
por defecto
diferente
de /bin/bash;
esto se puede
lograr
editando
/etc/defaults/
useradd y
cambiando la
línea que
dice:
14. SHELL=/bin/
bash
por
SHELL=/bin/
false

15. De esta
forma
cualquier
usuario que
se cree a
partir de
ahora, será
creado con el
shell
/bin/false

Crear un
usuario
nuevo, y
verificar
que /bin/false
sea su shell
por defecto
en
/etc/passwd

Cómo
cambiarnos
de usuario en
el sistema?
Una forma
muy cómoda
pero lenta es
sencillamente
salir del
usuario
actual
(escribiendo
logout o
presionando
ctrl-D o
escribiendo
exit) y
volviendo a
entrar.

Ahora en
linux existe
un comando
llamado su
(super user)
que permite
convertirte
en cualquier
usuario

Su sintaxis
básica es:
16. su -
[username]
17. Por ejemplo:
18. su -
19. nos
convertirá en
root, desde
cualquier
usuario no
privilegiado
del sistema,
cualquier
usuario no
privilegiado
que intente
convertirse
en otro
usuario
necesitará
teclear la
clave del
usuario en
que se quiere
convertir,
por lo tanto
su - no
asegura que
me convierta
en root si no
conozco la
clave.

Otra variante
es:
20. su - eperez
21.
De esta
forma me
convertiré en
el usuario
eperez y
podré
trabajar con
sus permisos
y con su
directorio de
usuario. Si
estoy como
root y me
convierto en
cualquier
usuario no
necesitaré
teclear la
clave del
usuario en
que me
convierto.

Cómo crear
un usuario
con derechos
de root?

Aunque para
nosotros no
es la opción
más elegante,
no es ni
siquiera una
opción que
pensaríamos
en usar,
podemos
indicar que si
deseamos
mantener un
usuario con
derechos de
root, la labor
es muy fácil:
• Agregar el
usuario que
queremos
que sea root.
• Editar
/etc/passwd y
poner 0 en el
UID y GID
del usuario
en cuestión
• Con estos
pequeños
cambios el
usuario que
le pongamos
uid 0 y gid 0
será root con
su propia
clave.

Posteriormen
te
hablaremos
sobre otras
formas de
asignar
derechos de
administrado
r mucho más
cómodas que
además nos
permitirán
manejar logs
para ver lo
que un
usuario hace
mientras es
root.

El UID de
cualquier
usuario
creado en el
sistema
siempre será
mayor a 500
aunque como
vieron se
pueden
cambiar los
UID nosotros
no
recomendam
os hacerlo
para
mantener
consistencia y
permisos
diferenciados
entre
usuarios.

Cómo
cambiar los
dueños de un
archivo?
Al hacer un
listado
extendido de
un archivo o
directorio,
podremos ver
que estos
pertenecen a
un usuario
determinado

Si deseamos
cambiar el
propietario
de un archivo
o directorio
podemos
usar el
comando
chown:
• chown
nuevopropiet
ario[.nuevogr
upo] archivo

• esto es, si
quisiéramos
asignarle un
nuevo dueño
a
/home/eperez
por ejemplo
podríamos
decir:
• chown
root
/home/eperez

Esto haría
que el
directorio
eperez
pasara a ser
propiedad
del usuario
root

Si
quisiéramos
cambiar a un
nuevo grupo
de usuarios,
podríamos
usar el
comando
chgrp o
extender el
chown:
• chgrp root
/home/eperez
• cambiaría al
grupo root el
directorio
/home/eperez
o
• chown
root.root
/home/eperez
• cambiaría al
usuario root
y al grupo
root el
directorio
/home/eperez
todo en un
sólo
comando.

Tanto chown
como chgrp
son capaces
de actuar en
directorios,
es decir como
acabamos de
ver son
capaces de
cambiar los
permisos a
directorios y
a archivos.
Sin embargo,
si
quisiéramos
cambiar no
sólo los
dueños de un
directorio
sino además
recursivamen
te todos los
directorios y
archivos
contenidos en
este, debemos
usar la
opción -R:
• chown
root.root
/home/eperez
-R
• Al momento
hemos
logrado
asignarle
archivos y
directorios a
usuarios del
sistema, sin
embargo, a
veces no es
sólo eso lo
que
deseamos.

Hay
momentos en
que deseamos
darle un poco
más de
granularidad
al sistema de
archivos, por
ejemplo
permitir que
algunos
usuarios
puedan
ejecutar
ciertos
binarios pero
no escribir, o
que no
puedan
acceder a
ciertos
directorios.

Para esto, en
unix existen
desde
tiempos
inmemoriales
, tres tipos de
permisos
básicos que
son:
• Permiso de
lectura (r)
• Permiso de
escritura (w)
• Permiso de
ejecución (x)
• Estos tres
permisos,
pueden ser
asignados a
tres
diferentes
usuarios y
grupos de
usuarios,
estos son:
• Usuario
propietario
(u)
• Grupo al que
pertenece el
propietario
(g)
• Otros
usuarios del
sistema (o,
other)
• Para ver los
permisos,
podemos
hacerlo
invoncando
al comando ls
-l por
ejemplo:
• [root@eperez
~]# ls -l
total 67124
drwxr-xr-x 2
root root
4096 Jul 27
07:47
Desktop
drwxr-xr-x
14 root root
4096 Jul 27
16:27 epe
drwxr-xr-x 3
root root
4096 Jul 27
07:48 tmp
-rw-r--r-- 1
root root
184707 Jul 26
11:23 VSAT-
Ecuador.pdf

• La primera
columna de
la izquierda
nos indica
precisamente
los permisos,
notemos que
en algunas de
estas líneas
hay una d de
primer
caracter. El
primer
caracter en la
lista de
permisos
indica
claramente si
estamos
hablando de:
• un directorio
(d)
• un archivo (-)
• un enlace
directo (l)
• un
dispositivo de
caracter (c)
• un
dispositivo de
almacenamie
nto (bloque)
(b)
• Respecto a
estos últimos
dos permisos
están
presentes
solamente en
el
directorio
/dev y son
formas de
representar
dispositivos
de caracteres
o de bloque a
los efectos del
kernel
(discos,
cintas,
terminales,
puertos
seriales, etc)

Los
siguientes
nueve
caracteres en
los permisos
son
realmente 3
grupos de 3
caracteres
cada uno,
indicando
estos los
diferentes
permisos
para el
usuario
propietario
(u), el grupo
(g) y otros
(o).

Por ejemplo
drwxr-xr-x lo
podremos
dividir así

directorio • lectura • lectura • lectura
• escritura
• ejecución • ejecución
• ejecución
Esto es, estamos ante un directorio y el usuario propietario podrá leer, escribir y ejecutar
en ese directorio. Los usuarios del grupo al que pertenezca el propietario podrán leer y
ejecutar dentro de este directorio y los otros usuarios podrán leer y ejecutar dentro de
éste directorio.

A los efectos de un binario o archivo normal, la x (ejecución) significa que este archivo
podrá ser ejecutado. A los efectos de un directorio, la x significará que a este directorio
se podrá entrar. Es decir, por el tipo de permisos que vemos en el ejemplo anterior,
básicamente todos podrán entrar (x) a este directorio, ya que hasta others (o) puede
hacer ejecución (x).

Cambiando los permisos:

Les explicaremos dos formas básicas de cambiar los permisos, una muy conocida por
todos pero un poco compleja de entender a mi forma de ver y otra muy fácil y
descriptiva, comencemos por esta:

El comando para cambiar los permisos se llama chmod, y debemos indicarles qué
permisos poner o quitar así como el directorio o archivo a ponerle o quitar permisos,

El comando básico es:


chmod [ugoa]<=|-|+>[rwx] archivoodirectorio

por ejemplo:

chmod og-w prueba

Éste comando anterior lo que hará será quitar (-) el permiso de escritura (w) al grupo y a
los otros usuarios del archivo prueba.

El resto es muy fácil y descriptivo:


chmod u+x prueba
chmod +x prueba (dará a todos permiso de ejecución)
chmod a+x prueba (lo mismo del anterior)
chmod -w prueba (quitará a todos permiso de lectura)
chmod og=r prueba (asignará a o y a g lectura solamente, quita las otras banderas)

La segunda forma de asignar permisos se maneja de forma binaria. Por ejemplo


supongamos que cada permiso es un bit y que si un permiso está habilitado el bit está en
1, si está deshabilitado el bit está en 0:

permiso binario octal


rwx 111 7
rw- 110 6
r-- 100 4
r-x 101 5

Entonces podemos asignar permisos poniendo los valores decimales (u octales) uno
valor por cada grupo de usuarios:
chmod 755 prueba (esto sería rwxr-xr-x)
chmod 644 prueba (sería rw-r-r)
y así por el estilo.

Hay muchas personas que usan esta última forma porque les parece más conveniente, en
cualquiera de las circunstancias, sería el mismo objetivo el que estaríamos logrando.
Como último debemos indicar que para hacer un cambio de permisos recursivos dentro
de un directorio, lo podemos hacer igualmente con el switch -R
chmod og-w * -R

Esto quitaría el permiso de escritura a o y a g en el directorio que estamos a todos los


archivos y recursivamente en todos los directorios de aqui en adelante.
chmod 755 directorio/ -R

Pondría permiso rwxr-xr-x del directorio/ en adelante.

En Unix, en Linux hay siempre muchas formas de hacer las cosas, hay varias formas de
llegar a un mismo objetivo, así que no nos sorprendamos si durante el curso algunos
estudiantes planteen otras formas de solucionar un problema en particular, son
bienvenidas y aceptadas, ya que siempre hay más de una forma de hacer las cosas.

El sudo es un sistema que permite que usuarios autorizados por nosotros ejecuten
ciertas (o todas) las tareas que puede hacer el usuario root, pero sin tener que conocer la
clave de éste.

Es decir, desde el propio usuario no privilegiado eperez, yo podría sencillamente


tecleando mi clave, acceder a ciertas tareas autorizadas por el administrador del sistema.

Un detalle adicional: el sudoers no sirve solamente para dar acceso de root a otros
usuarios, aunque esta es realmente una de las funciones más comunes y funtamentales,
también el sudoers sirve para darle accesos de un usuario a otro usuario, es decir poder
ejecutar comandos como otro usuario.

El archivo donde se guardan los permisos de sudo se llama /etc/sudoers pero no es


recomendable editarlo directamente, sino usando la utilería visudo

visudo tiene dos pequeñas ventajas, evita edición simultánea del mismo archivo (esto es
que dos o más usuarios root vayan a hacer cambios al sudoers) y además tiene un
pequeño y rudimentario analizador sintáctico lo que ayuda a revisar contra posibles
errores cualquier cambio que hagamos.

Estructura del archivo /etc/sudoers

La estructura es muy simple y es algo así:

<usernames|group> <server=[ALL]|IP>[(usuario que ejecutará)]


<comando>

• usernames: puede ser una lista de usuarios a los que concederemos el permiso
• group: puede ser una lista de grupos de usuarios a los que concederemos el
permiso, un grupo se describe con el signo de % primero (%users, por ejemplo)
• si queremos listar más de un usuario o grupo, podemos separalos por coma
• server= nos indica desde qué servidor este permiso ejercerá efecto, porque
podemos ejecutar técnicamente comandos desde otros lugares. Usaremos ALL
para indicar desde cualquier IP (server=ALL).
• (usuario que se ejecutará): Nos indicará a qué usuario tendremos acceso, o bajo
qué usuario nos darán el permiso para ejecutar (ALL) indicaría root

Veamos algunos ejemplos, ejecutemos visudo y veremos sólo una línea no comentada
(visudo usa los comandos de vi, usa vi en sí):
root ALL=(ALL) ALL

Esta línea por defecto sugiero la dejemos, permite básicamente que el usuario root
ejecute todod desde cualquier lugar.

Cómo hacer para que un usuario determinado (eperez en mi caso) pueda hacer lo que
root? Simple:
eperez ALL=(ALL) ALL

esto es: eperez, desde cualquier servidor "ALL=" , ejecutará como root "(ALL)"
cualquier comando "ALL"

Probémoslo con cualquier usuario que tengamos en el sistema, ahora salgamos del
visudo (:wq), entremos en otra consola como ese usuario (eperez en mi caso) y
pongamos:
[eperez@eperez ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
nos dará un error, porque sólo root puede ver los contenidos de /etc/shadow.

ahora usemos sudo:


[eperez@eperez ~]$ sudo cat /etc/shadow
Password:
root:$1$dMoUbmLb$rkoT14Xw1W.eHmInMUvYC0:12990:0:99999:7:::
bin:*:12985:0:99999:7:::
daemon:*:12985:0:99999:7:::
adm:*:12985:0:99999:7:::
lp:*:12985:0:99999:7:::
sync:*:12985:0:99999:7:::
shutdown:*:12985:0:99999:7:::
halt:*:12985:0:99999:7:::
mail:*:12985:0:99999:7:::
news:*:12985:0:99999:7:::

Ohh sí, pudimos.. en efecto, la línea que agregué en sudoers, usando visudo, en efecto
me permite poniendo la clave del usuario eperez poder acceder a sitios que sólo root
puede.

Cómo guardar logs de lo que se hace?

Muy simple, en el sudoers (ejecutar visudo) pongamos una linea al comienzo que diga:
Defaults logfile=/var/log/sudolog
Esto le indicará al sudo que cada comando que ejecute, lo guarde en /var/log/sudolog,
de forma que nosotros podamos monitorear cuándo, quién y qué comando se ejecutó.

tail /var/log/sudolog
y podríamos ver todos los comandos sudo que se vayan poniendo.

Limitando comandos:
eperez,jose ALL=(ALL) /sbin/reboot,/sbin/halt,/usr/sbin/eperez/

Este comando indicaría que eperez y jose (dos usuarios, se parados por coma), podrán
ejecutar como root /sbin/reboot y /sbin/halt, así como cualquier binario que esté dentro
de /usr/sbin/eperez/ (/ al final para indicar que es un directorio)

De esta forma podemos limitar el alcande de los usuarios, ya estos usuarios no podrán
formatear el disco, ni agregar o eliminar usuarios, ni ver /etc/shadow (no le hemos
autorizado a usar cat como root), sino que sencillamente podrán reiniciar o detener la
máquina, sólo esos dos comandos como root.

En el visudo sólo ponemos los comandos, no los archivos permitidos. Es decir, si


ponemos en el visudo /etc/shadow, no lograríamos nada, pues no es un comando, de
todas formas cuando intentemos hacer un sudo cat /etc/shadow, al no estar autorizado
cat, no podríamos ver /etc/shadow.

Todo sistema linux viene configurado de la forma más estándar posible, para evitar que
algunas opciones que se le pueden implementar fallen para usuarios no conocedores.

Además, existen infinidad de criterios sobre opciones que se le deben imponer a los
filesystems, dónde, cómo y por qué.

En todo caso, un correcto particionamiento del sistema, no sólo evitará que un daño en
una sección del disco haga totalmente inoperable al sistema, sino que permitirá una más
fina granulación de los permisos para evitar o minimizar el impacto de un intruso.

Particionamiento:
Uno de los temas más olvidados, heredado de cuando windows era el único sistema
operativo del mercado (lo digo por porcentaje de uso en el mercado) es el tema del
particionamiento.

Básicamente, muchas personas que se dicen que saben trabajar en linux y que hasta
tienen la osadía de dictar cursos en linux, ignoran por completo un tema tan crucial
como es un correcto particionamiento.

Supongamos que tenemos un disco de 80GB para instalar linux y que lo particionamos
de la siguiente forma:
100 MB a /boot
1GB para SWAP
80GB para /

Este es el tipo de configuración más usada por los "conocedores" de linux.. qué han
logrado? Pues porque redhat así les pide instalan una partición /boot con 100MB en
disco. Porque siempre el instalador les exige, instalan una partición SWAP de un
tamaño determinado. Y ya que no le exigen nada más, dejan el resto para /, puesto que
siempre hay que tener una partición /.
¿Está correcto este esquema de particionamiento?

Definitivamente NO. En efecto es un esquema que funciona, definitivamente funciona y


no podemos negarlo, pero pensemos solamente en un detalle:

¿Qué tal que un día determinado, falle un grupo de sectores o clusters dentro de la
partición donde está /?

Sencillamente, perderemos todo el sistema, perderemos toda la información que ahi


tenemos guardada, perderemos los logs del sistema que están en /var (aunque la falla
haya sido por otros sectores), perderemos los directorios de usuario (/home),
perderemos los binarios del sistema (/bin, /sbin), perderemos los binarios extras al
sistema (/usr), básicamente nos quedaremos con un bonito /boot (porque está en otra
partición) y un bello e inútil SWAP que de nada nos servirá con el resto del filesystem
sin ningún tipo de uso.

¿Qué tal realizar un particionamiento así?:


Partición montada en el directorio Tamaño de la partición
/boot 100MB

/ 512MB
/var 20GB

/home 15GB

/usr 20GB

SWAP 1GB

/tmp 512MB

Básicamente, según los autollamados "entendidos" en instalar linux, esto no resolvería


mucho, pues igual el disco se dañaría.

En efecto, el disco puede dañarse por completo y de eso no nos salva nadie, pero
normalmente los discos se van dañando por partes, es decir, emiten avisos, se corrompe
algún filesystem pero básicamente funcionan ellos como un todo, sólo que con daños.

Al particionar de la forma antes mencionada, logramos que si ocurre un fallo en la


sección del disco donde está la partición /usr, podamos recuperar la información en el
resto de particiones (/var no estaría dañada, /home tampoco). Esto es muy interesante
ya, porque en efecto, el disco estaría herido de muerte, pero todavía le podríamos
montar a las particiones que estén buenas y sacar los datos para reemplazar el disco.

Básicamente al particionar podemos lograr minimizar el impacto de un daño parcial


localizado en ciertas partes del disco, y créanme, es lo que normalmente ocurre.

Como ejemplo, a inicios de Setiembre del 2005, uno de los discos de un servidor que
mantengo con varios sitios en los Estados Unidos se me dañó, en efecto, perdí /var,
perdí todos los logs del sistema y algunas BD importantes. Pero no perdí los sitios de
los usuarios que yo tenía en /home porque estaban en otra partición, ni perdí los binarios
del sistema que estaban en /usr

Solicité un cambio de disco, repuse la imagen que tenía de /usr y de las BD y logs que
tenía de un respaldo y listo, el sistema continuó funcionando.

De haber tenido una sola partición el daño hubiera sido grave, hubiera tenido que
recuperar todo de respaldo: Además de los 3gb de usr y 3gb de var hubiera tenido que
recuperar de respaldo los 40gb de datos de usuario y les aseguro que recuperar via ftp
46gb de datos no es lo mismo que recuperar 6gb.

Esto nos demuestra que en efecto es algo que funciona y que nos puede ser de gran
utilidad, mas esta no es la única ventaja.

Opciones de montaje

Linux tiene una serie de opciones a nivel de filesystem, que nos permiten evitar que se
ejecuten ciertas acciones según el filesystem que tengamos montado.

Por ejemplo, qué utilidad tiene el directorio /var? Básicamente /var sólo nos sirve para
guardar archivos de logs, nadie debe ejecutar nada dentro de /var, por ejemplo, los
atacantes usan /var/tmp para una vez entrado al sistema, bajar binarios
comprometedores y ejecutarlos. Es un hecho real y muy usado.

De no tener correctamente particionado el sistema, /var no sería más que un directorio


de /, y por supuesto en / hay binarios que sí requieren derechos ejecución (/bin, /sbin).
No podríamos hacer nada con un sistema particionado sin ningún conocimiento.

Ahora, si /var estuviera en una partición aparte como propuse. Entonces la labor sería
muy sencilla. A esta partición (/var) le podríamos asignar una opción del filesystem que
indicaría que no se puede ejecutar ningún archivo aún cuando tenga permisos de
ejecución (x).

Así de simple, el atacante entrará al sistema, eso no lo evitaremos sino por otros medios,
pero la idea de la seguridad no consiste solamente en evitar intrusiones, realmente está
compuesta la seguridad por capas, por diferentes lineas de combate, una de ellas es que
dado que ya el atacante entró, nosotros le pondremos barreras físicas para minimizar el
impacto de una intrusión.

Básicamente, podemos montar el filesystem /var con la opción noexec, esta es la opción
que impide que se ejecuten archivos dentro de /var. Se podrán leer, se podrán escribir,
mas no se podrán ejecutar, así un atacante se quedará sin su medio de usar /var/tmp para
ejecutar sus scripts maliciosos

Para agregar esta y otras opciones del filesystem, sencillamente editamos: /etc/fstab y le
agregamos la opción deseada, separada por coma, después de la palabra default (default
options), por ejemplo en mi caso tengo /var en hda4 por lo tanto sencillamente busco la
línea de /etc/fstab que hable de /var y le agrego noexec:
LABEL=/var /var ext3 defaults,noexec 0 0
Así le habremos indicado a nuestro sistema, que la próxima vez que arranque, monte la
partición /var con la opción noexec, lo que evitará la ejecución.

noexec, por seguridad, siempre lo combino con nosuid.

El bit suid se usa para indicarle al sistema que ese binario podrá requerir accesos de root
y estos deberán ser concedidos.

Por ejemplo, para cambiar la clave, un usuario normal no tiene acceso a /etc/shadow
(este archivo sólo root lo puede cambiar), por lo tanto en binario passwd que es el que
se llama para ejecutar la acción del cambio de clave está tagueado como SUID, lo que
permitirá al binario requerir operar como root y alterar el archivo /etc/shadow poniendo
la nueva clave.

Así se logra que sin ser root, ciertas acciones como el cambio de clave las puedan
ejecutar los usuarios desde sus cuentas.

por supuesto el binario passwd es sumamente bien hecho y controlado, sólo usará root
para cambiar la clave, más nada.

Ahora, qué tal que un atacante baje un binario a nuestro sistema y le cambie los
permisos a suid (+s)? Básicamente esta persona podría crear un binario que solicite
derechos de root y le sean concedidos, y realizar cuantas operaciones estime necesarias
para, como root, alterar o robar información de nuestro sistema. Es por eso que la
opción nosuid se utiliza para decirle al sistema que no ejecute como suid ningún binario
aunque así esté marcado en el sistema.

Como regla general, cualquier filesystem al que yo le aplique noexec, también por
seguridad le indico que sea nosuid también.

Así quedaría mi /var:


LABEL=/var /var ext3 defaults,noexec,nosuid 0 0
Estas mismas opciones se pueden aplicar a /boot a /tmp y a /home

básicamente en /home nadie debe tener la capacidad de ejecutar archivos y menos con
suid, muchos hackers entran a través de nombres de usuarios adivinados o de servicios
que corren bajo algún username determinado (apache, named, etc) y por supuesto
intentarán usar el directorio de ese usuario para ejecutar sus archivos y binarios
maliciosos. Al poner /home como no ejecutable, coartamos su intento.

/tmp es un directorio que se concibió para que cualquier persona pudiera escribir,
independientemente de sus permisos como usuario. Así podían guardar (sin
compromiso por parte del administrador) por un tiempo o un momento ciertos datos
para procesar información, etc...

Los hackers lo usan para poner sus ejecutables (ya no escribir, sino ejecutar) y por lo
tanto podemos indicarle a nuestro sistema que ejecute el noexec y el nosuid para evitar
que un atacante pueda ejecutar sus binarios precompilados desde esa dirección.
/tmp así como /var/tmp son uno de los directorios más usados por los atacantes.

A propósito, /usr/tmp debe ser eliminado y convertido en un enlace a /tmp puesto que a
/usr no podemos quitarle derechos de ejecución (contiene cientos de binarios), pero sí
podemos decirle que no hay tal tmp dentro de /usr sino que lo mandamos a /tmp que ya
lo tenemos protegido.
cd /usr
mv tmp tmp.old
ln -s /tmp
rmdir tmp.old
Con estos simples comandos podemos eliminar ese directorio tmp dentro de /usr y
apuntarlo a nuestro ya protegido /tmp

En la partición /boot no hay ningún ejecutable, sólo la copia del binario del kernel que
se levanta al levantar el sistema, también le podemos poner nosuid y noexec para evitar
que potencialmente sea usada esa partición para escribir y ejecutar aplicaciones no
deseadas.

nodev
Es otra de las opciones del sistema. un dispositivo (device, dev) es un enlace que se crea
para permitir interactuar entre las aplicaciones y ciertos puertos o dispositivos del
sistema. Ahora, algunos dispositivos no vienen creados por defecto o los hemos
eliminado por seguridad (por ejemplo si eliminamos /dev/ttyS0 no se podrá acceder al
puerto serial com1 de nuestra máquina).

Algunos atacantes, conscientes de que no está disponible ese dispositivo, pueden


intentar crearlo. No en /dev ya que /dev solo root lo puede escribir. Pero lo intentarán
crear en cualquier otro lado del sistema de archivos para darle de todas formas uso. Por
ejemplo qué tal /tmp/ttyS0? Por más que borramos ttyS0 de nuestro /dev, este atacante
lo creó en /tmp y le dará uso desde ahi.

Para eso existe la opción nodev, que al indicársela a un filesystem, evitará que se creen
o usen dispositivos desde ellos.

El único Filesystem que debe tener derechos de dev es /, puesto que / tiene al
directorio /dev y no debemos prohibirle o el sistema no nos funcionaría.

Cualquier otro filesystem, debe llevar nodev (/tmp, /home, /usr, /var, /boot):

LABEL=/var /var ext3 defaults,noexec,nosuid,nodev 0 0


/usr no tiene dispositivos, así que sí es seguro ponerle nodev a /usr.

Repetimos: /usr no debe llevar noexec ni nosuid o no funcionaría el sistema.

noatime
Es una opción realmente no de seguridad directamente sino de performance, de
desempeño. Esta opción puede ser implementada y debe ser implementada en todos los
filesystems tipo ext3, ext2 y similares. No funcionará para otros filesystems como
RAMFS, TMPFS, etc.
De acuerdo a estándares seguidos para la implementación de diversos filesystems, existe
la obligación de escribir cuánto se accedió en LECTURA un archivo.

Esto es, cada vez que leamos para ejecutar a /usr/sbin/sendmail o leamos el mailbox
nuestro, o cada uno de nuestros 500 usuarios lean el mailbox, el sistema se verá
obligado a escribir cuándo se leyó cada uno de ellos.

Las lecturas siempre son más rápidas que las escrituras y no sólo eso, sino que cada
escritura le disminuye el tiempo de vida a un disco y por cada lectura de un binario
habrá que mover el cabezal del disco hacia la tabla de inodos para guardar cuándo se
accedió.

Esto genera muchos movimientos en el disco y hace que disminuya el desempeño en su


labor.

Nadie realmente hace un uso del access time (atime) que se escribe para cada uno de los
binarios. De hecho muchos no lo conocíamos hasta que descubrimos la opción noatime,
esta opción lo que hace es evitar que se escriban los access time en los inodos de los
archivos que están siendo leídos.

Esta opción noatime mejora el desempeño en sistemas con media o full carga hasta en
un 30% al evitar constantes accesos a disco para escribir que hubo una lectura.

Al mejorar los tiempos de acceso a disco, que es un medio mecánico, estamos evitando
o minimizando el impacto que potencialmente pueden provocar algunos atacantes al
obligar que nuestro disco escriba constantemente (negación de servicio por cuello de
botella en accesos a disco).

Definitivamente es una opción que debe ir, no tiene razón para no ir y que nos ayudaría
mucho en el normal funcionamiento de un sistema.
3
Gestión de procesos
Herramientas de monitoreo
Trabajo con servicios
Arranque y parada de linux

Una de las cuestiones más interesantes y útiles en linux, es, definitivamente, el manejo
de procesos.

Esto es, desde Linux tenemos muchas variantes para manejar procesos, tales como
levantarlos, ejecutarlos, o sencillamente cambiarles la prioridad.

También el kernel de linux ha sido mejorado con el tiempo hasta llegar a lo que
conocemos actualmente como el kernel 2.6 que tiene un manejo muy efectivo de los
procesos, como veremos más adelante.

También en esta parte del curso veremos ciertas utilidades para el manejo de procesos
en Linux.
Nice Level
Todos los procesos de linux corren bajo lo que se conoce como colas de prioridad con
round robin, esto es, cada nivel de prioridad, señalada por un número del -20 (más
prioridad) al 20 (menos priodidad) mantiene a su vez una lista de procesos bajo su
control, estos procesos sólo son ejecutados cuando las colas con más prioridad a su
nivel hayan procesado todas sus listas de prioridad.

Estos niveles de amabilidad, como también se les conoce, pueden ser asignador por el
usuario que ejecuta un proceso o por el administrador del sistema.

Veamos un ejemplo tabulado de colas de prioridad:


SWA Mayor Prioridad
P-20
...-10
0 firefox apache pop3 sendmail
...
10 panelcontrol respaldos
Meno
rPrior
idad..
20En la tabla de ejemplo anterior, el proceso que maneja la swap siempre tendrá mayor
prioridad que cualquier otro proceso en un nice level inferior; los procesos que están en
la cola de prioridad 0, son los iniciados por el sistema (normalmente se inician con
priodidad 0) y en esa cola todos serán atendidos por round robin, es decir, uno a la vez.

En la prioridad 10, tendremos por ejemplo un panel de control (le dejamos mejores
prioridades a los procesos que el sistema necesita trabajar rápidamente) de forma tal que
él sólo se ejecutará en los momentos que el procesador no esté atendiendo a las colas
superiores, y también ponemos los respaldos, de forma tal que cuando se estén sacando,
los respaldos no afecten a otros procesos, sino que se vayan realizando a medida que
quede libre el procesador.

Estas colas de prioridad es lo que se conoce en linux como Nice level, o nivel de
gentileza.

Aparte de los nice level, también el kernel asigna porciones del procesador, o tiempos
durante los cuales un proceso se ejecutará. Esto con el kernel 2.6 se llama prioridad
dinámica y es determinada por el planificador monitoreando su comportamiento durante
la ejecución. Los procesos que gastan mucho de su tiempo bloqueándose son conocidos
como procesos "cota de E/S" ("I/O bound", en inglés); su comportamiento está acotado
por la entrada y la salida. Cuando el planificador reconoce a un proceso "cota de E/S" se
le asigna una bonificación negativa (de hasta -5), y por lo tanto una mayor porción de
tiempo. En contraste, a los procesos "cota de CPU" se les asigna una bonificación
positiva (de hasta +5), y por lo tanto una porción de tiempo menor. Esto previene que
los procesos "cota de CPU" controlen el procesador, y permite a las entradas y salidas
desarrollarse sin problemas. A veces, un proceso puede intercambiar entre
comportamientos "cota de E/S" y "cota de CPU". Por ejemplo, un proceso puede leer
cierta información desde el teclado y realizar algunas computaciones basadas en esa
entrada. El planificador necesita constantemente estar alerta del comportamiento del
proceso; las prioridades dinámicas pueden ser reajustadas de acuerdo a esto.

El planificador lleva un registro de todas las porciones de tiempo con dos listas de
procesos. La primera lista contiene a los procesos que todavía disponen de tiempo; la
segunda contiene a quellos procesos que ya han agotado su tiempo. Cuando un proceso
usa su porción de tiempo, el planificador calcula una nueva porción añadiendo la
bonificación de prioridad dinámica a la prioridad estática. El proceso es luego insertado
en la segunda lista. Cuando la primera lista se vacía, la segunda lista la reemplaza y
viceversa. Esto permite al planificador calcular continuamente las porciones de tiempo
con una sobrecarga computacional mínima.

Estados de un proceso
Los procesos se pueden catalogar en 3 estados fundamentales (existen otros):

1. Running: Es cuando un proceso está haciendo uso del procesador, o está en la


lista de espera por el procesador (waiting)
2. Stopped: Es cuando un proceso voluntariamente se retira del procesador y
solicita que no le asignen procesador, este proceso posiblemente esté bloqueado
esperando por alguna instrucción de e/s (disco, teclado, etc)
3. zombie: Es cuando un proceso ha muerto, pero su tarea padre sigue esperando
por información de este. Estos procesos no se pueden matar, técnicamente no
existen, pero consumen recursos en la tabla de procesos. De vez en cuando el
kernel puede limpiarlos, sobre todo si el padre también muere.

El kernel 2.6 ahora tiene algo muy interesante en funcionamiento, que es lo que se llama
preemtividad (expropiación), esto es, la posibilidad de sacar a un proceso que esté
usando el procesador, cuando otro de mayor prioridad caiga en estado runneable
(posiblemente saliendo del stopped).

Por ejemplo, esto mejora mucho la interacción con eventos del teclado, el usuario
definitivamente nota que los eventos del teclado son atendidos mucho más rápidamente.

El mismo kernel es preemptivo en sí, es decir, puede retirarse del procesador si algún
proceso que maneje eventos como el del teclado

Señales
Las señales, son formas de comunicarse en linux entre diferentes procesos, enviando
mensajes a través del kernel, que los procesos a los que se les envía la señal podrán
procesar o el kernel mismo podrá aceptarlas.

Las señales más comunes, que estudiaremos aquí son:


Nombre Numero
SIGHUP 1
SIGKILL 9
SIGUSR1 10
SIGTERM 15
• HUP (número 1) recarga la configuración, útil para cuando se ha cambiado el
archivo de configuración de un proceso y se requiere que lo relea, se le envía la
señal 1 y éste se ocupará de releer la configuración y se recargará sin dejar de
atender a los usuarios.
• KILL (número 9) Mata un proceso de forma incondicional, esta señal no se
ocupa de cerrar organizadamente archivos abiertos ni de emitir ninguna
advertencia, sencillamente el kernel al ver esta señal elimina el proceso de la
tabla de procesos y dispone de la memoria ocupada previamente por este.
• USR1 (Número 10) señal para ser usada por diferentes procesos como el apache
y el bash; es una forma de matar el bash por ejemplo pues éste no obedece a la
señal TERM, o una forma de recargar el apache sinque deje de servir a los
clientes actuales (el HUP en el apache hace que este recargue todos los hijos y
desatiendan las peticiones de la red)
• TERM (número 15) es la señal por defecto que se envía con el comando kill,
esta señal indica a un proceso que debe cerrarse, el proceso entonces procederá
como mejor le convenga, posiblemente cerrando todos los archivos que tiene
abierto y mandando a liberar la memoria que ocupa en el sistema. Algunos
procesos a veces caen en un estado en el que no pueden responder a esta señal y
sólo se dejan matar con KILL (9), pero nunca debemos intentar directamente el
KILL ya que es una forma imperiosa y un poco brusca para cerrar los procesos.

Todas estas señales así como una descripción de las otras señales (son en total 32)
pueden ser obtenidas con el comando:
man 7 signal

Fork y exec:
fork y exec son llamadas al sistema de Unix. Es la forma común que muchos procesos
de unix usan para crear nuevos procesos.

Cuando se comienza un sistema linux, este arranca solamente con el proceso conocido
como init.

Un proceso "engendra" a otro ya sea reemplazándose a sí mismo cuando llame al otro,


conocido como "exec", o si este proceso quisiera mantenerse activo, mediante un
proceso conocido como fork, bifurcación. En este último caso la copia bifurcada
cometerá suicidio ejecutando a su vez un exec del nuevo proceso a levantarse.

Un buen ejemplo del uso de fork/exec se puede ver en el login de un sistema Unix desde
un terminal. El proceso init engendra una serie de procesos getty, cada uno de ellos
monitorea un puerto serial o consola (ttyS o tty) en espera de actividad. Es el programa
getty el que realmente pone la línea que dice: login:

Una vez alguien escriba su username el trabajo del getty está terminado, este hace un
exec del programa login. login entonces nos pide una clave (si la cuenta la tuviere) y si
esta clave es la correcta, entonces realiza un exec del shell del usuario (comúnmente
bash). Cada vez que ejecutemos un programa dentro del shell, este hará un fork de sí
mismo y su copia realizará un exec de cualquier programa que le hayamos requerido.

También hay un comando exec que se puede usar en el prompt del sistema. Usarlo con
atención pues en efecto éste ejecutará cualquier programa que iniciemos a través de él y
eliminará la copia del shell que estemos usando sustituyéndola por el programa en
cuestión. En efecto es muy útil si queremos dejar corriendo una aplicación que no le
permita al usuario salir de ella hacia un shell, pues tan pronto esta termine, se realizará
un logout ya que el shell que se ejecutó desde el login habrá sido sustituido mediante un
exec por esta aplicación, no quedarían más recursos detrás de este hijo y se saldría a la
pantalla del login.

Formas de usar el exec:


Supongamos que tenemos que dejar un shell abierto ejecutando un ping a internet de
forma tal que si algún operador ve que el ping no responde puede tomar ciertas
medidas.

Este operador no queremos que tenga acceso al shell, una variante muy cómoda sería:

exec ping www.google.com

de esta forma, el ping se estará ejecutando indefinidamente, pero si alguien presiona ^C,
saldrá directamente sin caer en el shell ya que no se hizo mediante un fork sino
mediante un exec.

Entendiendo los procesos:

Como ya todos sabemos, cuando nosotros nos logueamos dentro de Linux y


comenzamos a escribir, le estamos hablando al shell. El shell que usamos actualmente
es el GNU BASH, sin embargo hay muchas variantes del tipo bourne como el sh, el ksh.
También existen variantes del C Shell (csh) como el tcsh.

Nuestro shell es un proceso, uno de los muchos programas ejecutándose al mismo


tiempo en una computadora. Cada proceso tiene diferentes tipos de información
asociado con él, incluyendo:

• El PID o identificador del proceso. Es un número asignado cuando el proceso es


arrancado. Normalmente es un número consecutivo que solamente se repite
cuando se haya alcanzado el máximo de procesos en la tabla de procesos aunque
muchos sistemas de protección para evitar averiguar fácilmente por parte de un
atacante el pid, prefieren hacerlo aleatorio (así al hacerse un fork posiblemente
no será el PID del padre+1). En todo caso es un número único para cada uno de
los procesos corriendo en un sistema.
• El UID o identificador del usuario, nos indica a quién pertenece este proceso.
Determina por lo tanto a qué archivos y directorios éste proceso podrá escribir o
podrá leer además de a quién le será permitido matar este proceso.
• El GID o identificador del grupo, es similar al UID, pero determina a qué grupo
éste pertenece.
• El ambiente de trabajo o environement, contiene una lista de variables y valores
asociados, por ejemplo si nosotros escribimos: echo $HOME en el shell, éste
nos indicará el nombre del directorio raíz del proceso del shell. Nos ha indicado
básicamente los contenidos de una variable de ambiente llamada HOME.
• Directorio de trabajo actual. Si no se especifica un directorio para abrir un
archivo o para ejecutarlo, el proceso mirará al directorio actual (CWD o current
working directory) y procederá a tratar de abrirlo desde ahi.
• Descriptores (file descriptors), nos indicará qué archivos ha abierdo este proceso
para lectura o escritura asi como la posición actual dentro de cara uno de ellos.

Todos estos detalles pueden ser vistos en nuestro sistema linux. Cada proceso que se
ejecuta en el sistema, abre un "directorio" con toda su información dentro del
directorio /proc

/proc no es un directorio común y corriente, sino que contiene información sobre los
procesos, además de información sobre el sistema y nos permite realizar cambios en el
comportamiento del kernel y sus diferentes módulos o partes.

Centrándonos en el tema de los procesos, vayamos a /proc si listáramos dentro de /proc


(ls /proc), podremos observar una serie de números en forma de directorio, que nos
indican los PID, dentro de cada directorio podremos ver una serie de archivos que no
son más que diferentes aspectos del proceso, algunos anteriormente descritos, como
son:

cmdline: Indica la línea de comando conque el proceso fué ejecutado, por ejemplo en
mi caso me cambié aleatoriamente a un directorio, el del proceso 9408 (cd /proc/9408) e
hice un cat cmdline, obtuve lo siguiente:
cat cmdline
bash
Lo que nos indica que es el bash, que fué ejecutado mediante una simple llamada (bash)

environ: nos indica las variables de ambiente conque este proceso trabaja:
cat environ
SSH_AGENT_PID=4877HOSTNAME=eperez.ecualinux.comTERM=xtermSHELL=/bin/bashHISTSIZE=1000U
rootLS_COLORS=SSH_AUTH_SOCK=/tmp/ssh-KjxSWn4876/agent.4876
PATH=/usr/java/j2re1.5.0_01/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/
local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin
DESKTOP_SESSION=defaultMAIL=/var/spool/mail/rootPWD=/root
INPUTRC=/etc/inputrcJAVA_HOME=/usr/java/j2re1.5.0_01LANG=en_US.UTF-
8GDMSESSION=defaultSSH_ASKPASS
=/usr/libexec/openssh/gnome-ssh-askpassSHLVL=1
HOME=/rootLOGNAME=rootDBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-
kbf74OqytDLESSOPEN=|/usr/
bin/lesspipe.sh%sDISPLAY=:0.0G_BROKEN_FILENAMES=1
XAUTHORITY=/root/.XauthorityGTK_RC_FILES=/etc/gtk/gtkrc:/root/.gtkrc-1.2-
gnome2SESSION_MANAGER=
local/eperez.ecualinux.com:/tmp/.ICE-unix/4852
GNOME_KEYRING_SOCKET=/tmp/keyring-
rrJk94/socketGNOME_DESKTOP_SESSION_ID=DefaultDESKTOP_STARTUP
_ID=COLORTERM=gnome-terminalWINDOWID=37757804

status: nos indicará variada información del estado actual del proceso, cantidad de
hilos, información sobre el pid del padre (ppid), memoria consumida, cantidad de
descriptores reservada, el estado del proceso (sleeping), etc.

[root@eperez 9408]# cat status


[root@eperez 9408]# cat status
Name: bash
State: S (sleeping)
SleepAVG: 98%
Tgid: 9408
Pid: 9408
PPid: 9228
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 256
Groups: 0 1 2 3 4 6 10
VmSize: 4444 kB
VmLck: 0 kB
VmRSS: 1528 kB
VmData: 308 kB
VmStk: 112 kB
VmExe: 577 kB
VmLib: 1307 kB
StaBrk: 080e3000 kB
Brk: 099c6000 kB
StaStk: bffe9890 kB
ExecLim: 080d8000
Threads: 1
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000010000
SigIgn: 0000000000384004
SigCgt: 000000004b813efb
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff

Name: bash
State: S (sleeping)
SleepAVG: 98%
Tgid: 9408
Pid: 9408
PPid: 9228
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 256
Groups: 0 1 2 3 4 6 10
VmSize: 4444 kB
VmLck: 0 kB
VmRSS: 1528 kB
VmData: 308 kB
VmStk: 112 kB
VmExe: 577 kB
VmLib: 1307 kB
StaBrk: 080e3000 kB
Brk: 099c6000 kB
StaStk: bffe9890 kB
ExecLim: 080d8000
Threads: 1
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000010000
SigIgn: 0000000000384004
SigCgt: 000000004b813efb
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff

cwd: directorio de trabajo actual, en qué directorio estaba el proceso padre cuando lo
ejecutó. Muy útil para cuando tenemos un proceso extraño, levantado por un ajeno
intruso, para saber desde dónde estaba cuando lo levantó.
cd cwd (nos llevará directamente al directorio en cuestión)
exe: el programa ejecutable del proceso en cuestión, es decir es un enlace hacia el
programa que está siendo ejecutado al que pertenece el proceso.
root: un enlace al directorio raíz del proceso (usualmente /)
fd: un directorio que contiene todos los file descriptors abiertos por este proceso.
/proc/self a su vez nos da una forma fácil de llegar al proceso desde el que estamos
ejecutándonos (bash posiblemente).

Control de procesos
Normalmente cuando estamos en el shell y ejecutamos un comando, este toma el
control del terminal y el shell se queda tranquilo esperando a que el comando termina.
Ahora, si no queremos perder control del bash y ejecutar un proceso y dejarlo corriendo
hasta que finalice, podemos hacerlo mediante el comando &

tail -f /var/log/maillog &Lo que hará será hacer un tail con polling (es decir buscando
siempre al final del archivo)

El &?
simple, lo que hace es mandar este trabajo al fondo, a background, y mientras el trabajo
está corriendo, podremos seguir usando el shell.

Es importante que sepamos que el padre (en este caso del ejemplo el shell) no puede
interactuar para cambiar al hijo, ni el hijo en el padre, es decir, al dejar al tail en
background, podremos movernos de directorio hacia otros lugares sin que esto afecte el
directorio de trabajo del hijo (que será el directorio desde el que le llamamos
inicialmente) ni los archivos conque el hijo trabaje.

Cómo vemos los procesos que tenemos corriendo en nuestro shell?

Simple, el comando "jobs" nos indicará cuántos procesos están ejecutándose en nuestro
shell así como su número de trabajo. Por este número podremos trabajarles:

[root@eperez ~]# jobs


[1]+
Running
tail -f /var/log/maillog &

aquí tenemos un sólo trabajo, el cuál es el trabajo número 1 (fíjense en [1]) y es un


trabajo que está corriendo.

Los trabajos los podemos traer a primer plano con el comando fg %#detrabajo
fg %1
nos llevaría este trabajo a primer plano. En el primer plano, hemos "perdido el shell"
nuevamente, pues el tail ahora se está ejecutando pero no nos deja acceso al shell hasta
que termine.

Cómo podemos hacer para mandar un proceso a segundo plano (background)? Hay dos
alternativas que conozco, la primera es como hicimos anteriormente, con el &, ejecutar
el proceso y al final llamarlo con &, de esta forma lo movemos a segundo plano
primerito.

Pero a veces ya hemos iniciado el proceso y queremos llevarlo a segundo plano, los
pasos serían:

1. Detener temporalmente el proceso


2. Mandar el proceso a segundo plano

Aquí la forma (supongo que seguimos ejecutando el tail en primer plano porque
anteriormente lo llamamos con fg):

• ^Z (esto detiene el proceso, nos brinda un shell pero el proceso no está


corriendo, está detenido):

1.[1]+
Stopped
tail -f /var/log/maillog

• bg %1 (con este comando mandamos a correr el trabajo 1 en segundo plano


(bg=background) nos dirá algo así como respuesta:

1.[1]+ tail -f /var/log/maillog &


• verificamos que esté corriendo:

[root@eperez ~]# jobs


[1]+ Running tail -f /var/log/maillog &

Listo, lo tenemos corriendo en backgroun a pesar de que al inicio estuvo en fg.

Ejercicio:
ejecutar el gnome-calculator desde un shell, detenerla (con ^Z), tratar de usarla y
posteriormente ponerla en background.

Comandos para conocer procesos ejecutándose en el sistema

Comencemos primero con los comandos más usados para analizar los procesos
ejecutándose en el sistema así como diferentes aspectos de ellos tales como la memoria
consumida y la prioridad.

Comandos para verificar procesos corriendo en el sistema:


El más simple pero útil de los comandos es ps, este es un comando bien conocido por
personas del mundo de unix que no ha variado mucho al momento
Para las personas que conocen el comando de la forma antigua, le sugerimos no usar el
signo de -, pues puede conducir a interpretaciones erróneas sobre el funcionamiento, por
ejemplo: ps -aux significa brindar toda la información sobre el usuario x, de acuerdo al
antiguo formato, claro, si el usuario x no existe, el comando ps lo interpretará de la
forma actual (ps aux), es decir, mostrando todos los procesos sin importar los que
trabajen desde un tty o no.

Algunos switches útiles para ps:


Si ejecutamos ps sin ningún switch, nos mostrará los procesos ejecutándose en nuestro
shell.

ps a: mostrará todos los procesos que pertenezcan a un terminal, sin importar si


pertenecen a este shell o no.

ps a nos dividirá la pantalla en al menos 5 columnas básicas (algunos comandos


mostrarán más información adicional), estas son:

• PID
• TTY: Terminal desde donde se está corriendo el proceso
• STAT: Estado del proceso
o S: Sleeping
o R: Runnable (o Running) el proceso puede correr o está corriendo
o W: sWapped, está en disco
o N: niced, el proceso tiene más baja prioridad
o Z: Zombie, el proceso murió sin reportarle información al padre
o D: Uninterruptable sleep, posiblemente esperando por disco. Este
proceso NO PUEDE SER MATADO CON NINGUNA SEÑAL
o T: Stopped,
o < Ejecución artificialmente cambiada
• TIME: El tiempo de procesador (en minutos:segundos) que el proceso ha
consumido, este es un tiempo que normalmente no debe ser muy grande, a no
ser que la máquina sea muy accesada y lleva muchas semanas o meses corriendo
sin reiniciarse. Por ejemplo, en este servidor que tengo con más de 50 días sin
reiniciarse, el proceso que consume más tiempo (50 minutos y 24 segundos de
procesador) es:
o 743 ? S 50:24 syslogd -m 0
• COMMAND: Es el comando mediante el cual se ejecutó el proceso (puede
estar truncado).

ps ax: mostrará todos los procesos independientemente de si tienen un terminal


asignado o no, independientemente de si pertenecen a este shell o no. Para mi es uno de
los más útiles.

ps aux: lo mismo que el anterior, pero nos mostrará además información del usuario
que corre el proceso y variada información como la memoria consumida por cada
proceso.

Por ejemplo: ps aux


USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
.
.
root 2016 0.0 0.1 1576 592 ? Ss 10:43 0:00 syslogd
-m 0
root 2020 0.0 0.1 2800 468 ? Ss 10:43 0:00 klogd
-x
rpc 2041 0.0 0.1 3392 592 ? Ss 10:43 0:00 portmap
rpcuser 2061 0.0 0.1 1752 768 ? Ss 10:43 0:00
rpc.statd
root 2094 0.0 0.2 5328 1008 ? Ss 10:43 0:00
rpc.idmapd
root 2160 0.0 0.1 2860 816 ? S 10:43 0:00
/usr/sbin/smartd

Nos indicará en la primera columna que el usuario bajo el que ejecuta el proceso
portmap se llama rpc y bajo el que ejecuta el proceso rpc.statd se llama rpcuser, los
otros procesos son ejecutados a nombre de root

Además nos indicará ciertos valores extras como son:

•%CPU: Porcentaje de la cpu que consumen


•%MEM: Porcentaje de la memoria que consumen
•VSZ: Tamaño virtual del proceso, esto es, el uso de memoria por parte
del código (librerías y binario) así como datos, uso del stack
•RSS: Es el uso de memoria sin contar con el uso de ciertas funciones del
kernel, tabla de procesos, etc.
•START: Es la hora en que el proceso comenzó

ps axf (también auxf) nos mostrará en forma de árbol los procesos del sistema, con
distinción de qué proceso engendró a quién(es). Con la u, aumentará la cantidad de
información mostrada.

pstree: Es otra forma de obtener una estructura arbórea reducida de los procesos del
sistema.

[root@eperez ~]# pstree


init─┬─acpid
├─atd
├─bonobo-activati
├─clock-applet
├─crond
├─cups-config-dae
├─cupsd
├─2*[dbus-daemon-1]
├─dbus-launch
├─eggcups
├─events/0─┬─aio/0
│ ├─kacpid
│ ├─kblockd/0
│ ├─khelper
│ └─2*[pdflush]
├─firefox───run-mozilla.sh───firefox-bin───netstat
├─gaim
├─gam_server
├─gconfd-2
├─gdm-binary───gdm-binary─┬─X
│ └─gnome-session
├─gnome-keyring-d
├─gnome-panel
├─gnome-settings-
├─gnome-terminal─┬─bash───6───ssh
│ ├─bash───pstree
│ └─gnome-pty-helpe
├─gnome-vfs-daemo
├─gnome-volume-ma
├─gpm
├─hald
├─khubd
├─2*[kjournald]
├─klogd
├─kseriod
├─ksoftirqd/0
├─kswapd0
├─mapping-daemon
├─metacity
├─6*[mingetty]
├─mixer_applet2
├─named
├─nautilus
├─notification-ar
├─pam-panel-icon───pam_timestamp_c
├─portmap
├─rpc.idmapd
├─rpc.statd
├─2*[sendmail]
├─smartd
├─ssh-agent
├─sshd
├─syslogd
├─thunderbird───run-mozilla.sh───thunderbird-bin
├─udevd
├─vmnet-bridge
├─wnck-applet
├─xfs
└─xinetd
Nos dará un bonito resumen de los procesos y de qué depende cada uno. El número
delante de sendmail indica que a ese nivel hay dos procesos de sendmail levantados.

top:
top, es uno de los comandos más interesantes y usados para monitorear procesos, sobre
todo por su interactividad, una vez ejecutemos top, debemos tener presente que cada
tecla que apretemos, para top tendrá un significado, top entra por defecto en un lazo
infinito mostrando cada 3 segundos una lista de los procesos ordenados por el número
de proceso (de menor a mayor).

El top nos es de gran ayuda detectando qué procesos consumen al momento mayor
memoria o procesador y nos permite tomar acciones para mejorar este consumo.

El top es un proceso a su vez y consume también procesador, por lo que si tenemos un


servidor medianamente cargado no debemos mantenerlo constantemente cargado pues
contriubuirá un poquito a cargar el procesador.

un ejemplo de top:
12:45:35 up 50 days, 12:08, 1 user, load average: 2.13, 2.94, 3.06
221 processes: 219 sleeping, 1 running, 1 zombie, 0 stopped
CPU states: cpu user nice system irq softirq iowait
idle
total 21.2% 0.0% 17.0% 0.0% 2.4% 27.4%
131.4%
cpu00 8.1% 0.0% 10.1% 0.0% 1.9% 13.1%
66.5%
cpu01 13.1% 0.0% 6.9% 0.0% 0.5% 14.3%
64.9%
Mem: 2055440k av, 2005688k used, 49752k free, 0k shrd,
147416k buff
1374096k actv, 266100k in_d, 30932k in_c
Swap: 2008084k av, 20972k used, 1987112k free
887724k cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU
COMMAND
1 root 19 0 388 360 336 S 0.0 0.0 4:32 1 init
2 root RT 0 0 0 0 SW 0.0 0.0 0:00 0
migration/0
3 root RT 0 0 0 0 SW 0.0 0.0 0:00 1
migration/1
4 root 15 0 0 0 0 SW 0.0 0.0 0:00 1
keventd
5 root 34 19 0 0 0 SWN 0.0 0.0 0:00 0
ksoftirqd/0
6 root 34 19 0 0 0 SWN 0.0 0.0 0:00 1
ksoftirqd/1
7 root 15 0 0 0 0 SW 0.0 0.0 26:51 1
kswapd
8 root 15 0 0 0 0 SW 1.3 0.0 292:27 1
kscand
9 root 15 0 0 0 0 SW 0.0 0.0 0:00 1
bdflush
10 root 15 0 0 0 0 SW 0.0 0.0 2:31 0
kupdated
11 root 25 0 0 0 0 SW 0.0 0.0 0:00 0
mdrecoveryd
15 root 15 0 0 0 0 SW 0.3 0.0 54:51 0
kjournald
418 root 15 0 0 0 0 SW 0.0 0.0 0:00 1
kjournald

El top normalmente trabaja mostrando dos tipos de información, la ventana sumaria y la


ventana de tareas.
La ventana sumaria es la compuesta por las primeras líneas (depende de la cantidad de
procesadores):
12:45:35 up 50 days, 12:08, 1 user, load average: 2.13, 2.94, 3.06
221 processes: 219 sleeping, 1 running, 1 zombie, 0 stopped
CPU states: cpu user nice system irq softirq iowait
idle
total 21.2% 0.0% 17.0% 0.0% 2.4% 27.4%
131.4%
cpu00 8.1% 0.0% 10.1% 0.0% 1.9% 13.1%
66.5%
cpu01 13.1% 0.0% 6.9% 0.0% 0.5% 14.3%
64.9%
Mem: 2055440k av, 2005688k used, 49752k free, 0k shrd,
147416k buff
1374096k actv, 266100k in_d, 30932k in_c
Swap: 2008084k av, 20972k used, 1987112k free
887724k cached

La primera línea nos indica que la hora del servidor es "12:45:35" y que el
servidor ha estado activo durante 50 días, 12 horas y 8 minutos. Actualmente
el sistema tiene un sólo usuario conectado y la carga es de 2.13 al momento
actual, 2.94 a 5 minutos y 3.06 a 10 minutos.

La segunda línea nos indica que el servidor tiene 221 procesos corriendo, de
los cuales 219 están durmiendo, uno corriendo y un zombie.

De la tercera a la sexta línea, se nos indican diferentes aspectos de los dos procesadores
que tiene el sistema, tales como:

•Qué porcentaje del procesador se usan por procesos de usuario (no root,
no del sistema) (user)
•Qué porcentaje del procesador se usan por procesos que tienen un cambio
de prioridad (nice)
•Qué porcentaje del procesador se usan por procesos del sistema (system)
•Qué porcentaje del procesador se usa para manejar irq, softirq
•Qué porcentaje del procesador se usa en procesos que están esperando
por disco
•Qué porcentaje del procesador está sin ocupar (idle)

De todos estos valores, el más importante, el más peligroso es el iowait, porque indica
que la máquina tiene un severo problema de entrada salida, posiblemente, seguramente
de acceso al disco, si este valor supera digamos el 30 a 50%, es un valor que
definitivamente hay que considerar cambiar mediante trabajo de optimización de disco.

Las tres últimas líneas nos indica básicamente lo mismo que el comando free -k, es
decir, información sobre el uso de la memoria RAM de la máquina y la memoria
SWAP.

De aqui en adelante, trabajamos básicamente con lo que se llama ventana de tareas, esto
es una descripción ordenada inicialmente por el número de procesos en que se nos
indicarán ciertos datos sobre cada uno de los procesos relevantes como son:
•pid
•usuario del proceso
•prioridad (es un valor asignado por el kernel, ver slices en tema anterior)
•nice level
•tamaño del proceso y datos
•RSS
•SHARE: Memoria compartida con otros procesos
•Estado
•%CPU
•%MEM
•Tiempo consumido por el procesador
•CPU bajo la que se está ejecutando el proces
•Nombre del proceso.

Estos detalles los podemos ajustar con diferentes comandos que existen dentro del top:

•P: organiza los procesos por uso de CPU


•M: Organiza los procesos por uso de la memoria
•N: Organiza los procesos por PID (de menor a mayor)

Otros comandos útiles:

•q: sale del top


•s: Cambia la tasa de refrescamiento (de 3 segundos a cualquier valor que
pongamos)
•[ESPACIO]: Refresca automáticamente ahora
•W: Escribe los cambios en la configuración a disco; de lo contrario
cualquier cambio que hagamos con los comandos de orden o de tasa de
refrescamiento no tendrán validez para la próxima vez que ejecutemos el
top
•k: mata un proceso, tenemos que indicarles el número de proceso a
eliminar y el tipo de señal que usaremos (por defecto sugieren 15)

Más comandos pueden ser obtenidos mediante: man top

Matando procesos:
Una de las formas más cómodas de matar un proceso es desde el comando top, desde el
top podemos, viendo previamente el número del proceso, indicarle con la letra k, el pid
del proceso que deseamos eliminar y este comando (top) se ocupará de matarlo.

Claro, no siempre estamos con el top ejecutando, por lo que el comando más opcionado
para matar un proceso para matar un proceso es el comando kill

kill [-SEÑAL] <pid1> [<pid2>...<pidN>]


kill requiere de al menos un parámetro y este es el número del proceso que deseamos
matar. De dónde sacar el número de proceso?: Ver ps y top

De no decirle la señal que usaremos, el kill trabajará con la señal 15 (TERM).

•kill -15 1845 es similar a:


•kill 1845 pues ambas matarán al proceso 1845 con la señal 15
•kill -9 1845, lo matará de forma brusca con la señal KILL (9)
•kill -10 1845 enviará la señal 10 al proceso 1845, el bash por ejemplo no
obedece a la señal 15, es decir con la simple señal 15 no se deja matar, al
parecer está hecho para evitar un error al matarlo, el bash se muere en
caso de recibir la señal 10.
•kill -9 1023 1024 1025 matará con la señal 9 los procesos 1023, 1024 y
1025

kill es muy útil cuando vemos que tenemos que matar un proceso en específico. Ahora,
es un poco difícil si tuviéramos que matar varios procesos a la vez (varios es un número
mayor de 10 o 100 por ejemplo).

Cómo podemos hacer para matar varios procesos a la vez?

bueno, el comando killall viene a nuestra ayuda, tiene las mismas características del kill
en lo que respecta a las señales, excepto que no se pone el pid, sino que se indica el
nombre del proceso a matar:

•killall httpd matará con la señal 15, TODOS los procesos httpd del
sistema
•killall -10 bash matará con la señal 10 a TODOS los procesos bash que
estén corriendo en el sistema.
•killall -9 ping matará con la señal 9 a todos los potenciales procesos ping
que existan en el sistema.
•killall sendmail matará todos los procesos sendmail que existan en el
sistema.

Es decir, de esta forma logramos muy fácilmente matar un nombre de proceso


determinado sin tener que describirle ni el número de proceso ni la cantidad de
procesos, matará ya sea un proceso nombrado de esta forma o cientos o miles de
procesos que se nombren así.

Siempre debemos ser muy cuidadosos a la hora de matar un proceso, pues siempre hay
que pensar que no somos los únicos que trabajamos con un servidor sino que nuestras
acciones pueden estar afectando (o beneficiando) a cientos o miles de usuarios que
dependen de este servidor para sus labores normales.

Tarea:
Detectar cuántos procesos bash hay en el sistema, tratar de matarlos primeramente con
kill -15 (no 10!!) y posteriormente matarlos con killall enviándole la señal 10. Qué
diferencias hay?

Cambios de prioridad a los procesos


nice, es el comando que nos permite correr un proceso (comando) con un cambio en su
nivel de niceness.

nice: sin ninguna otra opción, nos dirá el nivel de nice conque estamos corriendo (nice
hereda este valor del shell).
nice bash ejecutará el shell bash, pero lo hará con un nivel de prioridad de 10 (más bajo
que 0), por ejemplo, verifiquemos:
nice bash
nice
Esto lo que hará será ejecutar el bash pero con nivel de nice incrementado por 10, y el
comando nice solo, nos indicará que el shell tiene una prioridad de 10 (correcto)
nice también se puede invocar con el parámetro -n, el cual indicará claramente qué
variación respecto al valor actual de nuestro shell tendrá el proceso que ejecutemos.

Por ejemplo, suponiendo que nuestro shell tiene un nivel de nice de 0, al ejecutar:
nice -n 5 bash
Lo que hará será ejecutar el basj con un nivel de prioridad 5 (0+5).
Si ahora desde este mismo shell con prioridad 5, ejecutáramos:
nice -n -10 bash
Lo que haríamos sería llamar al bash, pero quitarle 10 niveles de prioridad (5-10=-5)
por lo que haríamos correr al bash con una escala negativa, es decir con una prioridad
más alta que el común de los procesos (prioridad 0). Podemos verificarlos ejecutando
solamente: nice

Los usuarios normales no pueden llamar al nice con un valor menor al valor de su shell.
Es decir, si tenemos un usuario cualquiera (digamos: eperez), y el nice de este usuario
es de 0, entonces no podremos llamar a ningún proceso con un nice menor de 0, si el
nice del usuario es 10, entonces no podremos llamar a ningún proceso conun nice menor
a 10. Básicamente no podemos desde un usuario normal, ajustar la prioridad (-n) a
ningún valor negativo.

Verifiquémoslo:
su - eperez (me convierto en el usuario eperez)
nice (nos dirá que 0)
nice -n -1 bash (intento ponerme con una prioridad menor a la original mía, me negará)
nice -n 5 bash (me dejará disminuir mi prioridad, a 5)
nice (en efecto me indicará 5)
nice -n -2 bash (intento nuevamente bajarme de 5 a 3, me dirá que no).
RENICE:
renice me permite, dado un número de proceso, cambiarle su prioridad
renice <prioridad> [-p pid ....] [-g grp ....] [-u user ...]

Los usuarios no root, es decir los usuarios normales del sistema sólo pueden hacer un
renice de los procesos que les pertenecen y no pueden hacer un renice a un valor menor
al del shell conque ellos corren.

Como root podría poner:


renice -10 -u rpc (aumentaríafor en 10 la prioridad de todos los procesos bajo el
usuario rpc)
renice +5 -u rpcuser (disminuiría en 5 la prioridad de todos los procesos bajo el
usuario rpcuser)
renice -5 -p 1846 (aumentaría la prioridad del proceso 1846 en 5)
Tarea: Como un usuario no privilegiado (curso por ejemplo) cambiar la prioridad de su
propio shell.
NOHUP:
nohup es un comando que viene de la palabra: No Hangup, es muy útil para cuando
pretendemos ejecutar un comando que no se cuelgue en caso de que salgamos del shell.

En efecto, al ejecutar un comando con & este seguirá escribiendo al terminal en que
estamos, en caso de salir por cualquier concepto (cerrando la ventana, cayéndose la
conexión, etc), este comando que se está ejecutando eventualmente será eliminado por
el kernel.

El comando nohup nos permite que los procesos ignoren las señales KILL y TERM de
esta forma evitando que sean matados cuando salgamos del sistema y puedan seguir
procesándose.

El comando nohup permite además que toda la información de salida en vez de ir a la


salida estándar (monitor) lo que hará será guardar toda la salida en el archivo nohup.out
para que la podamos analizar posteriormente.

Un ejemplo del comportamiento de este comando:


[root@eperez ~]# nohup ping 198.6.1.1 &
[1] 5435
[root@eperez ~]# nohup: appending output to `nohup.out'

Se mantendría ejecutando el ping en el proceso 5435 aún cuando salgamos del sistema,
y si hacemos un
tail -f nohup.out
Podremos ir viendo la salida de ping aún cuando regresemos en unas horas.

Un proceso ejecutado con nohup acaba cuando él decida que es tiempo (por ejemplo si
usamos wget para bajar un sitio lo podemos dejar con nohup y al otro día verificar que
todo esté ok) o si es un proceso que no acaba (el ping por ejemplo), podemos matarlo
mediante kill.

Tarea:El comando:
watch free -m

nos permite ejecutar cada 3 segundos el comando free -m, de forma tal que podemos ir
viendo cómo se comporta la memoria.

Ejecutar este comando desde nohup.

Otra utilería muy muy usada en linux es el vmstat

vmstat permite realizar un monitoreo de la actividad completa del sistema, que va desde
chequeos de procesos, memoria RAM, SWAP, accesos a disco y cpu. Lo que nos puede
dar de forma tabulada una idea general de cómo se comporta el sistema en un
determinado momento.

El vmstat tiene varios switches para ejecutarse, sin embargo basémonos en esta
recomendación para ejecutarlo, si desean conocer más sobre otros switches, podemos
hacerlo viendo la página manual (man vmstat)
El comando que usaremos será:
vmstat -S m 5

Lo que indicará que realice un chequeo del sistema cada 5 segundos y que muestre los
valores en megabyted (de lo contrario lo mostrará en kb)

Para los usuarios que tengan rhel3, la forma antigua de ejecutar el vmstat era:
vmstat -m 5

En cualquiera de las dos variantes, la información mostrada es prácticamente la misma.

Veamos ahora qué significado tiene cada columna, este es un ejemplo que sólo muestra
la primera línea:

[root@eperez ~]# vmstat -S m 5


procs -----------memory---------- ---swap-- -----io----
--system-- ----cpu----
r b swpd free buff cache si so bi bo
in cs us sy id wa
1 0 0 113 23 199 0 0 87 24
1060 503 11 1 85 3

Primero que todo indicar que la primera línea de datos que se muestra en el vmstat
indica un promedio desde que el sistema fué encendido, es decir, los valores actuales,
los valores que indican claramente cómo se comporta el sistema en ESTOS momentos,
salen a partir de la segunda línea de información.

En este caso estamos mostrando solamente la primera línea, es decir, los valores
promediados desde que la máquina arrancó.

procs:
se divide en dos parámetros:

• r: runneable processes, o procesos que están corriendo o esperando ser


procesados. Normalmente el valor de r debe ser igual o menor a la cantidad de
procesadores que tengamos. En mi caso es 1, y por lo tanto para mi
uniprocesador está bien. No debe tomarse como un valor exactísimo, es decir, en
mi caso hasta 2 o 5 en ciertos momentos estaría bien. Lo que no estaría bien es
un valor constantemente en 4 o en 5.
• b: bloqued, procesos bloqueados, normalmente son procesos que están
esperando por e/s, es decir disco. No es natural tener procesos en b, para
servidores MUY altamente usados, es natural tener algunosprocesos en b, pero
no es normal que el b sea mayor que r. Como siempre, no es una receta a seguir,
solamente indico que si b se mantiene constantemente con muchos procesos,
esto es signo de que algo anda mal, lento, en el disco y debemos tomar acciones
pertinentes.

memory:
se divide en 4 parámetros:
• swpd: indica la cantidad de memoria que está swapeada. Normalmente el
sistema linux usa la swap, y no es signo de alarma que la memoria tenga partes
swapeadas, pero sí lo sería si la swap comienza a incrementarse en cada chequeo
a lo largo del tiempo o que la swap constantemente está variando (unas veces
crece, otras decrece) pues es indicador de que se está recayendo constantemente
en ella y esto afecta el performance del sistema.
• free: Es la memoria no usada por el sistema.
• buff: Es la memoria destinada a almacenar buffers
• cache: Es la memoria destinada a cachear accesos a disco y páginas de procesos
en general, es útil para mejorar el performance del sistema.

La memoria libre realmente se puede considerar la suma de free+buff+cache, pues el


sistema puede disponer fácilmente de buff y caché para sus datos no descartables.

La memoria free es normalmente bien baja, ya que el sistema siempre trata de usar el
resto de la memoria libre para cachear.

Si la memoria cache es pequeña, debemos considerar que estamos con un sistema recién
arrancado, o el sistema se está quedando sin memoria (es decir, no puede cachear
mucho porque casi toda la ram la está dedicando a datos no descartables).

swap:
Lo podemos dividir en:

• si: cantidad de mb que estamos swapeando hacia disco


• so: cantidad de mb que estamos trayendo desde la swap.

En todo caso no es normal que el sistema esté constantemente si/so, a veces puede
ocurrir y es natural, lo que no es normal es que el sistema todo el tiempo esté mostrando
datos de swap. Este valor debe estar mayormente en 0 con algunos pequeños picos de
acceso.

io
Lo podemos dividir en:

• bi: bytes in, medido en mb que entran a los discos. En sistemas de mensajería el
bi siempre es un poco alto pues normalmente hay datos entrando a disco.
• bo: bytes out, medido en mb que salen de los discos. En sistemas de mensajería,
pero más visible en sistemas de web, este valor de bo es un poco alto, bastante
alto ya que constantemente se están leyendo datos del disco.

Estos valores, sobre todo bo, puede ser un buen indicador de que el sistema necesita
incrementar la caché. Pero no es nada malo, pues el disco está para eso, para ser
accedido. Ahora, hay que saber determinar cuando un disco no es lo suficientemente
rápido para almacenar o mostrar toda esa cantidad de información.

Estos valores son muy variables, en un sistema de mensajería bo normalmente tiene


picos y es cuando las máquinas de los clientes hacen pop para recoger los mensajes.
system
Se divide en 2 columnas:

• in: número de interrupciones por segundo


• cs: número de cambios de contexto.

Estos dos valores no los vamos a analizar pues a mi entender no aportan datos
interesantes.

cpu
se divide en 4 columnas, las cuales son porcentajes de:

• us: tiempo dedicado por el procesador ejecutando código que no es del kernel
(tiempo dedicado al usuario)
• sy: tiempo del sistema (ejecutando código del kernel)
• id: tiempo en que el procesador no está haciendo nada (idle)
• wa: tiempo esperando por e/s (disco, waiting)

El más interesante realmente es el wa, si el tiempo esperando por el procesador supera


el 30 debemos tomar esto como una alarma, el sistema está perdiendo mucho tiempo
esperando por los discos y debemos mejorar nuestro sistema de I/O. Si supera
CONSTANTEMENTE los 50 ese sistema TIENE que ser optimizado o cambiado el
sistema de I/O por algo mejor.

Aquí un ejemplo real de un servidor de hosting con un procesador:


procs -----------memory---------- ---swap-- -----io---- --system--
----cpu----
r b swpd free buff cache si so bi bo in cs us
sy id wa
0 0 143 43 123 480 0 0 6 6 1 6 5
5 5 7
1 0 143 44 123 480 0 0 6 169 404 792 5
2 92 1
0 0 143 41 123 480 0 0 3 84 415 545 6
3 91 0
0 0 143 42 123 480 0 0 10 88 374 394 4
2 94 0
0 0 143 42 123 480 0 0 32 182 426 972 6
3 89 2
0 0 143 43 123 480 0 0 8 312 458 398 45
4 51 1
1 0 143 28 123 481 0 0 39 133 496 733 14
6 77 3
1 0 143 31 124 486 0 0 1069 163 453 1137 11
5 80 4
0 0 143 31 124 479 0 0 587 781 578 885 58
7 24 11
1 0 143 39 124 479 0 0 16 194 506 466 36
5 57 2
1 0 143 38 124 479 0 0 18 571 555 223 61
24 5 10
0 0 146 33 124 462 0 0 61 808 741 1270 63
16 22 0
0 0 146 37 124 462 0 0 42 130 391 214 31
3 66 0
0 0 146 40 124 462 0 0 48 220 333 300 10
3 81 6
0 0 146 43 124 462 0 0 48 26 402 491 14
5 80 1
0 0 146 45 124 462 0 0 32 162 409 149 3
2 93 2
0 1 146 47 124 463 0 0 85 191 388 658 55
5 34 6
2 0 146 42 124 465 0 0 713 306 631 711 42
16 27 15
0 0 146 42 124 465 0 0 93 164 390 248 15
7 75 3
0 0 146 45 124 465 0 0 37 307 329 379 6
3 88 3
0 0 146 47 124 466 0 0 14 74 297 1317 15
4 80 1
procs memory swap io system
cpu
r b swpd free buff cache si so bi bo in cs us
sy id wa
1 0 146 50 124 466 0 0 11 178 406 490 8
3 88 1
1 0 146 53 124 466 0 0 10 133 347 162 4
1 94 2
0 0 146 56 124 466 0 0 29 82 425 664 4
3 92 0
0 0 146 58 124 466 0 0 27 146 315 207 11
2 85 2
0 0 146 60 124 468 0 0 415 185 355 420 15
4 78 3
1 0 146 52 124 468 0 0 42 133 415 218 7
2 88 2
0 0 146 61 124 469 0 0 7 94 312 484 4
1 94 2
2 0 146 56 124 469 0 0 12 146 372 402 6
2 90 2
0 0 146 53 124 469 0 0 6 169 339 382 10
3 86 1
4 1 146 63 124 469 0 0 30 206 448 703 24
4 69 3
1 0 146 65 124 470 0 0 138 257 415 302 50
20 22 8
2 0 146 59 124 470 0 0 36 98 342 839 9
4 86 1
0 1 146 61 124 470 0 0 55 302 552 298 10
3 74 13
0 0 146 57 124 470 0 0 6 154 326 236 7
2 90 1
0 0 146 63 124 470 0 0 16 27 337 713 11
2 86 1
0 0 146 64 124 470 0 0 1 148 318 121 2
1 97 0
0 1 146 34 125 470 0 0 64 130 362 389 60
7 23 9
Tarea, realizar un análisis de este gráfico. Emitir su opinion.

Algunas veces nos topamos conque un binario no puede ser sobreescrito o que una
partición no puede ser desmontada porque alguien le está accediendo, quién está
accediendo a esa partición o archivo?
El comando lsof es sumamente poderoso, en esta sección sólo daremos ciertos
elementos, pero en realidad es muy muy grande y poderoso. Para analizar más el
comportamiento de lsof por favor referirse a la página manual (man lsof) o referirse a la
internet

lsof es una herramiente muy útil en todas las circunstancias, ya sea para chequeos
diarios del sistema como para auditorías de seguridad.

Veamos algunos ejemplos de lsof:


lsof
este comando solamente me mostrará todos los archivos abiertos, conexiones de red
(sockets) abiertos así como pipes y todo elemento que use linux para comunicarse. Es
una cantidad de información muy grande.

lsof `which httpd`


nos dirá todos los procesos que estén ejecutando el binario del httpd (which lo que hace
es decirnos el camino exacto de httpd).

Otra variante de lo anterior: lsof /usr/sbin/httpd

lsof /etc/passwd
Me indicará quién está accediendo a /etc/passwd

lsof /dev/hda3
Dirá qué procesos están accediendo a la partición /dev/hda3

lsof -t /usr/sbin/sendmail
nos indicará solamente los números de proceso que están accediendo al binario de
sendmail.

lsof -c bash
nos indicará qué archivos están abiertos por procesos que comiencen con "bash"

lsof +p 4025
qué archivos están siendo accesados por el proceso 4025

lsof -i :80
indicará qué procesos están accediendo al puerto 80 de nuestra red.

Servicios:
Mantener la seguridad de un sistema no es una tarea de un sólo día, y se
basa fundamentalmente en variados aspectos que debemos tener en
cuenta, en clases anteriores hemos logrado

Sin embargo, las situaciones anteriores aunque importantes, también deben


ser complementadas con acciones que iremos estudiando a lo largo del
curso.

En este caso, trataremos algo muy importante como es el manejo de


servicios en linux. Su sistema posiblemente requiera tener activo el servidor
web, por lo tanto deberemos activar el servicio apache, pero siempre
debemos manejar un control completo de qué servicios debemos apagar
porque no usamos y qué servicios debemos mantener arriba.

Los servicios de Linux son demonios o servidores que ejecutan ciertas


tareas, más adelante estudiaremos en detalle una gran cantidad de estos
servicios, y cada uno de estos demonios o servidores activan o abren
puertos hacia la internet. Yo veo los puertos como ventanas abiertas hacia
la internet, y por supuesto no es lo mismo controlar ua casa que tenga
abierta 50 o 60 ventanas a controlar los accesos de intrusos en una casa
con 5 ventanas, al menos el intruso tiene más posibilidades de ser
capturados.

Los servicios son programas hechos por seres humanos, pueden contener y
contienen errores, en clases siguientes trataremos algunas formas que usa
redhat para controlar accesos no autorizados además como otras formas
para prevenir accesos a través de fallas. Pero sin embargo, no hay nada
mejor como tener la total certeza de que no entre un atacante por un
servicio con falla y la mejor forma de que alguien no entre a través de un
servicio es? Exacto!: Apagar el servicio. Al apagarlo ya no nos preocupará
tanto si el servicio tiene fallas o no, sencillamente no está corriendo y por lo
tanto no podrá ser explotado.

Antes de comenzar a configurar los servicios (apagarlos y encenderlos) debemos


entender qué son los niveles de ejecución de Linux.

Un nivel es un estado o un modo, que es definido por los servicios listados en


/etc/rc.d/rcX.d, donde X es el número del nivel.

En RedHat los siguientes niveles (runlevels):

• 0 — Halt
• 1 — Mono Usuario sin red
• 2 — no usado actualmente
• 3 — Multiusuario con red (full multiuser)
• 4 — no usado actualmente
• 5 — Multiusuario con red y ambiente X
• 6 — Reboot

Si al comenzar la máquina, vemos una pantalla de login en modo texto (negra con letras
blancas) entonces casi seguramente estamos trabajando en el runlevel 3.

El único runlevel que tiene ambiente gráfico por defecto (login gráfico) es el runlevel 5,
los demás sencillamente se ocupan de no cargar el ambiente gráfico pero de manejar los
servicios que le hemos indicado.

El runlevel por defecto puede ser cambiado modificando el archivo /etc/inittab, que
contiene una línea casi al inicio que dice algo así:

id:5:initdefault: Esto lo que


significa (en mi
caso) que el nivel de arranque por defecto de mi sistema es el 5. Si deseáramos que
nuestro sistema arrancase en el runlevel 3, entonces sencillamente cambiaríamos el 3
por el 5. Este cambio no hará efecto de forma inmediata, /etc/inittab es lo que ejecuta el
proceso init al arrancar el sistema, por lo tanto hasta que no reiniciemos la máquina no
veríamos el cambio.

Si deseáramos cambiar inmediatamente de nivel, podríamos usar el comando telinit


seguido del nivel al que queremos llegar

telinit 3
Tanto para ejecutar telinit como para cambiar /etc/inittab se debe estar como el usuario
root. telinit no cambia el archivo /etc/inittab, sino que sencillamente cambia el runlevel
que actualmente ejecutamos sin afectar para nada el arranque previsto para el sistema en
posteriores momentos, es decir, si reiniciáramos el sistema, este arrancaría en el
runlevel previsto en /etc/inittab independientemente de que hayamos ejecutado telinit o
no.

Nosotros también usamos


y realiza la misma función del telinit, al menos así pensamos.

init 3

Otra característica del /etc/inittab es la posibilidad de definir las consolas virtuales que
tenemos.

Las consolas virtuales son a las diferentes pantallas que podemos acceder cuando
presionamos ALT-F1 hasta el ALT-F6, si estamos en el ambiente gráfico primero
tenemos que presionar CTRL-ALT-F1 para movernos a la primera consola y de ahi sí
podemos actuar con ALT-FX

Para volver al ambiente gráfico basta con presionar ALT-F7

En resumen, por defecto tenemos 6 consolas virtuales que son atendidas a su vez por 6
servicios de mingetty:

# Run gettys in standard runlevels

1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

Cada proceso del mingetty se pasa las 24 horas del día consumiendo tiempo
de cpu, memoria, en fin, recursos del sistema esperando que alguien entre
al terminal en cuestión.O sencillamente podríamos borrar esas líneas (yo prefiero
comentarlas por si algún día me arrepiento o necesito, pues las descomento y ya).

Cualquier cambio que realice en el init, lo podemos hacer efectivo llamando:

init q
Que leerá nuevamente el inittab y actuará acorde: bajando los servicios de getty para los
terminales del 3 al 6 en este caso

Veamos un poco más la organización de los servicios dentro de /etc:

Existen dos directorios fundamentales para el manejo de servicios:

• /etc/init.d : Es el directorio donde se almacenan en sí los scripts que manejan la


actividad de los servicios. En las versiones de RedHat (CentOS) esto es un
enlace directo al directorio real que está localizado en /etc/rc.d/init.d
• /etc/rc.d: Es el directorio que contiene al menos los 7 niveles de ejecución en
forma de directorios. Dentro de cada uno de estos niveles de ejecución están
descritos los procesos que se activarán dentro de cada nivel. Son sencillamente
accesos directos a /etc/init.d

En /etc/rc.d/rc3.d por ejemplo, tendremos una serie de enlaces directos hacia el


directorio /etc/init.d que indicarán si este enlace (servicio) se ejecutará al arrancar el
sistema (si comienza con una S) o al apagarse el sistema (si comienza con una K) y un
número que indicará el orden de arranque y parada (S10 va primero que S80 por
ejemplo) posteriormente un texto que nos dice a qué script específicamente apunta. Por
ejemplo:
ls /etc/rc.d/rc3.c/
K01yum K50tux S09pcmcia S55named
K02NetworkManager K50vsftpd S10network S55sshd
K03rhnsd K73ypbind S12syslog S56rawdevices
K05saslauthd K74nscd S13irqbalance S56xinetd
K08vmware K74ntpd S13portmap S80sendmail
K10dc_server K85mdmpd S14nfslock S85gpm
K10psacct K89netplugd S15mdmonitor S90crond
K12dc_client K90bluetooth S18rpcgssd S90vmware
K15httpd K94diskdump S19rpcidmapd S90xfs
K20nfs K99microcode_ctl S19rpcsvcgssd S95anacron
K24irda K99readahead S25netfs S95atd
K25squid K99readahead_early S26apmd S97messagebus
K30spamassassin S05kudzu S28autofs S98cups-config-
daemon
K35smb S06cpuspeed S40smartd S98haldaemon
K35winbind S08iptables S44acpid S99local
K50netdump S09isdn S55cups
Me indica todos los servicios que arrancarán al arrancar el nivel 3 o que pararán al parar
el nivel 3.

En el caso de iptables (S08iptables), arrancará (S) después que el servicio kudzu (S08
es mayor que S05, kudzu por lo tanto arranca primero).

Una forma de evitar que un script arranque (o pare) puede ser eliminando el acceso
directo del nivel que deseo, por ejemplo podría rm /etc/rc.d/rc3.d/S26apmd y así evitaría
que el servicio apmd arrancara automáticamente con el nivel 3.

Dentro de /etc/init.d podemos ver una serie de archivos que no son más que los scripts
que contienen la información sobre inicio y parada de los diferentes servicios o
demonios. En cada máquina estos pueden variar, en dependencia de lo que hayamos
decidido instalar en ella, en mi caso tengo estos servicios:
[root@eperez ~]# cd /etc/init.d/
[root@eperez init.d]# ls
acpid functions messagebus portmap
spamassassin
anacron gpm microcode_ctl psacct squid
apmd haldaemon named rawdevices sshd
atd halt netdump readahead syslog
autofs hidd netfs readahead_early tux
bluetooth httpd netplugd rhnsd vmware
cpuspeed iptables network rpcgssd vsftpd
crond irda NetworkManager rpcidmapd winbind
cups irqbalance nfs rpcsvcgssd xfs
cups-config-daemon isdn nfslock saslauthd xinetd
dc_client killall nscd sendmail ypbind
dc_server kudzu ntpd single yum
diskdump mdmonitor pand smartd
dund mdmpd pcmcia smb

Posteriormente haremos una breve descripción de los servicios más interesantes de


linux. De momento veamos una descripción interna de un script:

si vemos por ejemplo el script del servicio sendmail (/etc/init.d/sendmail) podremos


notar que las primeras líneas, aunque comentadas, nos son de gran utilidad para
determinar en qué consiste este servicio:
#!/bin/bash
#
# sendmail This shell script takes care of starting and stopping
# sendmail.
#
# chkconfig: 2345 80 30
# description: Sendmail is a Mail Transport Agent, which is the
program \
# that moves mail from one machine to another.
Es un script normal hecho en bash, como posteriormente veremos en el curso cómo
hacer algunos scripts en bash obviemos la primera línea que es la que indica que correrá
en un subshell (/bin/bash)

Inmediatamente después tenemos una serie de líneas con la descripción del script, se
llama sendmail y es el script que se encarga de levantar y parar el servicio se sendmail.

Inmediatamente después vemos una línea muy interesante que es los valores de
arrranque y parada
chkconfig: 2345 80 30

Esto le indicará a las utilerías para manejar el arranque y la parada (chkconfig y ntsysv)
cuáles serán los modos de arranque por defecto (2 3 4 y 5) así como qué posición tendrá
en los enlaces directos (S80sendmail posiblemente, por el 80) y qué valores tendrá al
apagarse (K30sendmail posiblemente, por el 30).

Posteriormente a esta línea, nos dan una breve descripción para los efectos que
querramos de qué labor realizará el servicio. En este caso nos indicará que el sendmail
es un MTA o mail transport agent que es el programa que se encarga de enviar los mails
de una máquina a otra.
Ahora, editar manualmente estos enlaces, con el objetivo de borrar un servicio de la
lista de arranque de un modo, es un poco complicado, podemos caer en errores como el
hecho de poner una s en vez de S, o un número mal puesto o poner un servicio delante
de otro que requiere para trabajar (cómo echar a andar el sendmail si la red todavía no
anda?).

Es por esto que en la siguiente sección veremos algunas utilerías para manejar más
cómodamente estos servicios.

Existen varias formas de controlar los servicios del sistema, como hablamos
anteriormente, podemos arrancarlos o no, si borramos o creamos los enlaces
correspondientes en /etc/rc.d/rcX.d, sin embargo es un poco difícil de manejar servicios
por esa vía, por lo que nosotros veremos dos opciones mucho más cómodas para
manejar servicios:

• ntsysv: Es una herramienta gráfica que nos permitirá configurar qué servicios
queremos arrancar o apagar en el runlevel que estamos. Es una forma muy fácil
de echar a andar o apagar servicios, sin embargo en mi opinion consume un
poco de recursos al tener que levantar un pequeño ambiente gráfico además que
sólo trabaja para el runlevel actual y editar otros runlevels se hace un poquito
complicado.
• chkconfig: Es una utilería bien simple que igual nos permitirá agregar o quitar
servicios del runlevel en que estamos, pero además nos permitirá agregar más
servicios a la lista de servicios o eliminarlos de la lista así como nos permitirá un
trabajo un poco más detallado de diferentes runlevels.

A la final, ambas utilerías lo que hacen es editar diferentes archivos y enlaces directos
que están disponibles en /etc/rc.d y /etc/init.d

Cómo usamos el chkconfig?, tenemos varios switches interesantes en este caso el --list:
chkconfig --list
nos permite listar, todos los servicios actualmente instalados en el sistema y por cada
runlevel podemos ver su estado (off/on)
[root@eperez ~]# chkconfig --list
netfs 0:off 1:off 2:off 3:on 4:on 5:on 6:off
xinetd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
irda 0:off 1:off 2:off 3:off 4:off 5:off 6:off
named 0:off 1:off 2:on 3:on 4:on 5:on 6:off
vsftpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
ypbind 0:off 1:off 2:off 3:off 4:off 5:off 6:off
smartd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
mdmonitor 0:off 1:off 2:on 3:on 4:on 5:on 6:off
pcmcia 0:off 1:off 2:on 3:on 4:on 5:on 6:off
messagebus 0:off 1:off 2:off 3:on 4:on 5:on 6:off
NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off
cpuspeed 0:off 1:on 2:on 3:on 4:on 5:on 6:off
sendmail 0:off 1:off 2:on 3:on 4:on 5:on 6:off
nfs 0:off 1:off 2:off 3:off 4:off 5:off 6:off
irqbalance 0:off 1:off 2:off 3:on 4:on 5:on 6:off
syslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
cups 0:off 1:off 2:on 3:on 4:on 5:on 6:off
acpid 0:off 1:off 2:off 3:on 4:on 5:on 6:off
yum 0:off 1:off 2:off 3:off 4:off 5:off 6:off
httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
ntpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
tux 0:off 1:off 2:off 3:off 4:off 5:off 6:off
dc_client 0:off 1:off 2:off 3:off 4:off 5:off 6:off
apmd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
rpcsvcgssd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
smb 0:off 1:off 2:off 3:off 4:off 5:off 6:off
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
microcode_ctl 0:off 1:off 2:off 3:off 4:off 5:off 6:off
rpcgssd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
gpm 0:off 1:off 2:on 3:on 4:on 5:on 6:off
spamassassin 0:off 1:off 2:off 3:off 4:off 5:off 6:off
sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
isdn 0:off 1:off 2:on 3:on 4:on 5:on 6:off
nscd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
readahead 0:off 1:off 2:off 3:off 4:off 5:on 6:off
netdump 0:off 1:off 2:off 3:off 4:off 5:off 6:off
netplugd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
haldaemon 0:off 1:off 2:off 3:on 4:on 5:on 6:off
kudzu 0:off 1:off 2:off 3:on 4:on 5:on 6:off
anacron 0:off 1:off 2:on 3:on 4:on 5:on 6:off
cups-config-daemon 0:off 1:off 2:off 3:on 4:on 5:on
6:off
autofs 0:off 1:off 2:off 3:on 4:on 5:on 6:off
nfslock 0:off 1:off 2:off 3:on 4:on 5:on 6:off
vmware 0:off 1:off 2:off 3:off 4:off 5:off 6:off
squid 0:off 1:off 2:off 3:off 4:off 5:off 6:off
rpcidmapd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
winbind 0:off 1:off 2:off 3:off 4:off 5:off 6:off
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
readahead_early 0:off 1:off 2:off 3:off 4:off 5:on 6:off
portmap 0:off 1:off 2:off 3:on 4:on 5:on 6:off
dc_server 0:off 1:off 2:off 3:off 4:off 5:off 6:off
psacct 0:off 1:off 2:off 3:off 4:off 5:off 6:off
rhnsd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
mdmpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
rawdevices 0:off 1:off 2:off 3:on 4:on 5:on 6:off
saslauthd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
bluetooth 0:off 1:off 2:off 3:off 4:off 5:off 6:off
diskdump 0:off 1:off 2:off 3:off 4:off 5:off 6:off
xfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
xinetd based services:
echo: off
time: off
rsync: off
eklogin: off
krb5-telnet: off
kshell: off
time-udp: off
gssftp: off
cups-lpd: off
echo-udp: off
klogin: off
daytime-udp: off
chargen: off
daytime: off
chargen-udp: off
Por ejemplo el servicio anacron está apagado para los niveles 0, 1 y 6, y está encendido
para 2 3 4 y 5.

Si quisiéramos ver una lista no tan extendida, sino sencillamente los valores para un
sólo servicio podríamos hacerlo indicándole el nombre del servicio:
[root@eperez ~]# chkconfig --list sendmail
sendmail 0:off 1:off 2:on 3:on 4:on 5:on 6:off

Otro switch interesante es el --add y el --del


nos permite configurar un servicio nuevo en todos los niveles declarados en su
script de inicio.

chkconfig --del servicio

nos permitirá hacer lo mismo pero al revés, eliminar todos los enlaces directos de los
directorios /etc/rc.d/rcX.d para que no levante ni sea matado al terminar el sistema.

Ahora el switch más interesante: --level

--level se usa para cambiar el estado de un servicio en diferentes runlevels a la vez. Se


ejecuta así:
chkconfig --level 2345 sendmail on
Esto indicará que en los niveles 2,3,4 y 5 al servicio sendmail debe activarlo.

por supuesto podemos usar off para desactivarlo y podemos usar cualquier combinación
de niveles que deseemos, pero lo más común es usarlos todos a la vez (2345), si
quisieramos sólo trabajar con 3 y 5, podríamos hacerlo con chkconfig --level 35
sendmail on

Ahora, hasta el momento hemos hablado de cómo apagar y levantar servicios pero
refiriéndonos a los niveles de arranque, es decir, hemos hablado de cómo configurar el
sistema para cuando se apague o encienda.

Esto no es windows, Linux prácticamente no hay que reiniciarlo nunca, y en verdad lo


digo. Técnicamente en comportamientos normales, Linux sólo exige ser reiniciado
cuando ocurre una condición: Se actualiza el kernel. Es decir, cuando se hace cualquier
labor de reconfiguración del sistema, o cuando se realiza la actualización del sistema, no
es necesario reiniciar linux, todo debe correr de forma casi inmediata, excepto cuando
actualizamos el kernel, el kernel sí exige (de momento) que sea reiniciado el sistema
linux para que el nuevo kernel comience a trabajar. Esto es un evento que ocurre una
vez cada algunos meses, a veces con antelación a veces se atrasa, pero es un evento que
no es algo frecuente como en windows.

Entonces, cómo podemos hacer para apagar un demonio o levantarlo, de forma


inmediata?, bueno, tenemos dos formas, la primera es ejecutar directamente el script
que está en /etc/init.d:
service sendmail stop

por ejemplo este comando pararía sendmail, lo apagaría, nadie podría ser
capaz de enviar mails a través del servidor.

La otra variante es usar el comando service:


Reiniciaría la red (sin tener que reiniciar el sistema!), es decir, yo técnicamente podría
hacer cambios en la configuración de IP de mi red y con emitir este comando ya todo
trabajaría.

Ahora, qué es eso de restart, stop, etc? Para mí son las acciones, es cómo podemos
llamar a un script e indicarle qué debe realizar.

• start: Arrancaría el servicio


• stop: Apagaría el servicio
• restart: Reiniciaría el servicio (stop+start)
• condrestart: Si el servicio está encendido, reiniciarlo.
• reload: Recargaría el archivo de configuración del servicio
• status: Indicaría el estado del servicio (Is running, list de PIDs, etc)

Aunque potencialmente pueden existir otras acciones, estas son las básicas para cada
servicio.

Tarea: Progar estas acciones con el comando service.

Es de hacer notar que el comando service (o /etc/init.d/demonio) no apaga ni enciende


permanentemente un demonio: en cuanto el sistema es reiniciado el sistema
obedecerá a lo que le hemos indicado con los comandos chkconfig, es decir, con lo que
le tengamos indicado en los directorios /etc/rc.d/rcX.d). El comando service es para
inmediatamente apagar o encender un servicio sin esperar a reiniciar el sistema. Pero no
indica que quedará encendido o apagado por siempre, sino que solamente mientras el
sistema esté encendido así se quedará el comando.

Marcaremos con negrita los demonios que deseamos activos. Los que no estén en
negritas, por favor apagarlos como tarea (chkconfig --level 2345 demonio off; service
demonio stop)

Por qué los apagaremos? Muy básico, muchos servicios tienen tremenda utilidad, pero
no todos los servicios tienen que estar corriendo todo el tiempo en el sistema, primero
porque consumen recursos (cpu, memoria) y más importante, pueden ser la puerta de
entrada para atacantes lograr ganar accesos a nuestro sistema. Siempre hay que pensar:
Qué servicios usaremos realmente? Y los que no usaremos, por favor apagar para evitar
lo anteriormente expuesto. Total, si posteriormente lo requerimos, podemos volverlos a
activar.
• acpid – Escucha y despacha eventos ACPI al kernel, para más información
sobre el acpi, ver aquí

• anacron – Ejecuta trabajos del cron que no han sido ejecutados por estar
apagado el server

• apmd – Se usa para monitorear el uso de la batería y guardarlo en los logs. Para
configurarlo se puede hacer en /etc/sysconfig/apmd

• atd – Ejecutará comandos que han sido programados usando el comando at

• autofs – Monta filesystems en demanda (posiblemente cdrom, floppy, a mi no


me gusta, prefiero montar manualmente los filesystems)

• bluetooth – Servicios bluetooth (búsqueda, descubrimiento, autenticación),


bluetooth es una tecnología bastante nueva que permite la comunicación entre
equipos de forma inalámbrica. Bluetooth para linux funciona bastante bien, pero
es un poco inseguro, las formas de trabajo del BT, además en el curso no
veremos este tipo de comunicación.

• cpuspeed – Es un demonio que se encarga de reducir los ciclos del


procesador en caso de que el sistema esté con baja carga, de esta forma
ahorra corriente. Solamente es efectivo para procesadores que lo soporten
(por ejemplo mi amd sempron no lo soporta). En todo caso es un demonio
que corre sólo y no es necesario tocarlo. Si no tamos que el sistema se cuelga
en momentos de inactividad (por las noches?), sugiero primero que todo
apagar el cpuspeed a ver si esto ayuda a salir de los problemas.

• crond – ejecuta tareas programadas mediante el sistema cron (en la


siguiente clase hablaremos de él)

• cups – Encargado de encender o apagar el Common Unix Printing System.


• cups-config-daemon – configura el demonio de impresión
• dc_client, dc_server – sistema de distribución de carga de sesiones SSL/TLS
• diskdump – Guarda la información de un crash del sistema
• dund – bluetooth dialup networking.
• functions – funciones para ser usadas por la mayoría de los scripts de
/etc/init.d
• gpm – Soporte del mouse para el ambiente texto. Si mueven el mouse en el
modo texto, podrán ver que hay un cuadrito que se mueve, es el puntero del
mouse. Con esta utilería podemos copiar/pegar texto entre consolas. Si
estamos en un servidor remoto, sin conexión permanente al teclado/mouse,
sugiero deshabilitarlo.
• haldaemon – apagar
• halt – si se manda a ejecutar en un runlevel, procederá a apagar el sistema.
• hidd – human interface devices (provee via bluetooth acceso al teclado, mouse,
etc)
• httpd – servidor web, apache.
• iptables – sistema de firewall de redhat, hecho en iptables. Usaremos un sistema
propio que no el de redhat porque es muy complicado. Apagarlo.
• irda – Demonio para el manejo de conexiones infrarojas. Si no tenemos una
laptop o conexión IR, apagar. Sugiero apagarlo en servidores.
• irqbalance – Es un demonio que se encarga de distribuir las llamadas a
interrupcciones del sistema entre los diferentes procesadores. Si nuestro
sistema es uniprocesador, este demonio no tiene mucho sentido.
• isdn – Manejo de ISDN, no se usa en el país. Sugiero apagarlo.
• killall – Este script se encarga de matar todos los procesos en un runleven, debe
ser ejecutado solamente en 0 y en 6, de lo contrario si lo activamos en otro
runlevel, al llegar a este runlevel matará todos los procesos.
• kudzu – Es un demonio que se ejecuta al arrancar el sistema y detecta
cualquier hardware nuevo instalado, y nos pide que tomemos alguna acción
respecto al hardware nuevo detectado (o al hardware eliminado). Si nuestro
servidor no varía en su hardware, mejor es deshabilitarlo y sólo ejecutarlo
manualmente (kudzu) cuando hayamos puesto algún hardware. El kudzu
no afecta el funcionamiento del sistema, sólo que demora un poco más el
arranque pues en cada arranque se molestará durante unos segundos
(menos de 5) en verificar qué hay de nuevo.
• mdmpd mdmonitor – herramienta de monitoreo de raids de software. En
posteriores cursos hablaremos cómo crear un raid por software
• messagebus - demonio que maneja mensajes sobre eventos del sistema
• microcode_ctl - Es un demonio que se ocupa de actualizar el procesador
intel con parches liberados por intel. Intel nunca indica qué corrección va
en cada parche, pero los parches ayudan a mejorar el performance del
procesador por lo que es bueno tenerlo activado. El demonio se actualiza a
través del sistema de actualizaciones por lo que es transparente cualquier
nueva actualización. Este demonio sólo se ejecuta al arrancar el sistema y
no consume muchos recursos. no soporta otros procesadores que no sean
intel, puede ir apagado en amd
• named - Demonio que tiene la función de actuar como servidor de DNS, en
cursos posteriores haremos mucho énfasis en el trabajo con dns. Este
demonio por sí sólo permite que nuestra máquina actúe como dns de caché,
lo que permitirá que ella misma resuelva nombres sin tener que acudir a los
dns del proveedor.
• netdump
• netfs - Es el sistema ocupado de montar y desmontar otros tipos de FS (de
red) como el NFS, samba, NCP (netware), etc. Como usaremos samba y nfs,
sugiero dejarlo activado.
• netplugd - demonio que se encarga de supervisar y apagar (o encender)
interfaces no conexiones de red no estáticas. De momento no activar. Es para
poder manejar caídas o desconexiones de interfaces temporales como ppp
(modem, dialup), etc.
• network - Es el demonio que se encarga de apagar/encender las interfaces
de red del sistema.
• NetworkManager - Demonio que se ocupa de monitorear diversas conexiones de
red e informarle al sistema sobre la más adecuada para su uso. Es algo para mi
experimental y debe ser apagado.
• portmap, nfslock, nfs - demonios que permiten compartir directorios,
partes del disco, entre sistemas unix. Lo veremos más adelante, por favor
dejar activado.
• nscd - Name Switch Cache Daemon, se ocupa de cachear respuestas a
peticiones sobre usuarios y grupos para sistemas de autentificación como
ldap, nis, hesiod. Apagar de momento
• ntpd - Demonio que permite a nuestro servidor actuar como un servidor para
sincronizar la hora. Apaguémoslo, no trabajaremos linux como un servidor de
tiempo, sin embargo más adelante si veremos cómo sincronizar la hora de
nuestro linux contra servidores de tiempo en internet.
• pand - el demonio de BT para la red personal. Apaguémoslo.
• pcmcia - es un demonio que permite instalar dispositivos pcmcia en nuestras
máquinas. Por defecto viene apagado, como nuestros servidores no tienen
dispositivos pcmcia, es bueno asegurarse que esté apagado
• psacct - demonio para llevar la contabilidad de los procesos, estadísticas y
demás. Este proceso consume muchos recursos por lo que debe mantenerse
apagado.
• rawdevices - permite a ciertas aplicaciones (oracle en particular) acceder a
dispositivos en crudo (raw, no formateados), pero sin embargo ya se
considera depreciado pues las aplicaciones no deben hacer peticiones a
través del rawdevice sino haciendo llamadas directas al sistema. De
momento mantener encendido.
• readahead, readahead_early - permite predecir y cargar en memoria
programas que van a ser usados. Indican que es muy bueno para el
ambiente gráfico. Verificar que este demonio sólo se ejecuta en el ambiente
gráfico, no es un demonio sino que se ejecuta al comenzar el sistema.
Mantener activo en el modo 5
• rhnsd - Se ocupa de conectarse a la red de actualizaciones de centos (funciona
para redhat también) y verificar si existen actualizaciones. En los sistemas
redhat es importante dejarlo activo para que verifique constantemente la licencia
contra los servidores de redhat. Para centos podemos apagarlo ya que usaremos
yum
• rpcgssd, rpcidmapd, rpcsvcgssd - permiten el trabajo con NFS versión 4,
dejarlo activado de momento.
• saslauthd - permite manejar las autenticaciones de usuarios (en texto claro)
dejarlo activo de momento, puede sernos útil en sendmail.
• sendmail - MTA que estudiaremos, se ocupa de recibir y enviar mensajes
desde y hacia nuestros clientes, nuestros dominios. Lo usaremos mucho
durante en el curso.
• single - Al ejecutarse, lleva al sistema al modo 1 (single, monousuario)
• smartd - demonio que permite obtener datos del sistema S.M.A.R.T, un sistema
de monitoreo presente en discos tipo IDE. No afecta al performance pero no lo
veremos, así que podemos desactivarlo
• smb - demonio que se ocupa del manejo de conexiones de máquinas
windows hacia nuestro servidor. Comúnmente conocido como samba,
permite hacer actuar nuestro servidor linux como un servidor de archivos
de windows. Dejémoslo activado pues lo usaremos posteriormente en el
curso.
• spamassassin - permite cargar el demonio del spamd, para realizar chequeos
antispam de los mails que llegan a nuestro sistema. No lo usaremos de esta
forma (demonio) sino que posteriormente en el curso aprenderemos a llamarlo
cada vez que necesitemos analizar un lote de mensajes. Desactivar.
• squid - servidor muy popular en internet, bastante fácil de configurar que
permite cachear peticiones que hacen las máquinas de nuestra red interna
hacia la internet, ahorrando de esta forma ancho de banda. El squid
también permite balancear carga entre servidores web. Activarlo pues lo
veremos en el curso.
• sshd - Demonio que se encarga de las conexiones seguras hacia nuestro
servidor. Es uno de los sistemas base más utilizados para acceder
remotamente a nuestros servidores. Dejarlo activado en las siguientes
semanas veremos cómo conectarnos por ssh
• syslog - demonio que se ocupa de recibir de parte de todos los procesos del
sistema las solicitudes para que almacene en los históricos. Es un demonio
muy usado, siempre detrás, trabajando guardando los logs. Dejémoslo
activado pues es básico para el funcionamiento de los históricos del sistema.
• tux - Es un servidor web que viene insertado (embebido) dentro del kernel, muy
pequeño y eficiente, pero sólo maneja páginas estáticas. En la parte de
servidores web del curso posiblemente pondremos enlaces y documentación
sobre el uso del tux. Normalmente debe ir desactivado ya que es un poco
complicado el echarlo a andar junto con el apache (httpd), aunque
definitivamente en algunas circunstancias es muy útil por su eficiencia.
• vsftpd - Servidor de ftp, dejarlo activado pues lo usaremos posteriormente
en el curso. Este servidor de ftp es muy seguro y fácil de configurar y es
muy popular en el mercado al momento.
• winbind - servicio que nos permite autenticar usuarios en nuestro sistema linux.
Estos usuarios están guardados en un dominio de un servidor NT. Esto nos
permite consolidar los servidores de autenticación, pudiendo tenerlos en un NT.
Quién se atrevería?, al menos yo no me atrevería a confiar la autenticación a un
servidor NT, y como microsoft constantemente cambia de conceptos, no lo
veremos al momento. Desactivar.
• xfs - se ocupa de servir tipos de fuentes (fonts) al ambiente gráfico, dejarlo
activado en el modo 5. Si no tuviéramos ambiente gráfico instalado en nuestro
servidor (sería lo recomendable por las razones de ahorro de recursos y
prevención de ataques) podríamos apagarlo completamente.
• xinetd - superdemonio, demonio de demonios, se ocupará de autenticar algunos
pequeños servicios. Personalmente no veo su utilidad al momento, por lo que
prefiero que lo desactivemos.
• ypbind - Sistema de autenticación centralizado para servidores unix. Muy
popular en su época. LDAP en estos momentos demuestra ser mucho más
eficiente que yp (yellow pages), por lo que no lo usaremos (al yp). desactivar.
• yum - Sistema de actualizaciones en línea, que además permite instalar
nuevo software sin necesidad de CD. Es decir, toma los paquetes rpm de la
red de centos y lo instala en nuestro sistema. Este demonio nos permitirá
actualizar automáticamente todas las madrugadas nuestro sistema linux,
sin de preocuparnos por hacerlo. Por supuesto, si es que hubieran
actualizaciones, si no las hay sencillamente no hará nada esa noche.
• El inicio del proceso de arranque varía dependiendo de la plataforma de
hardware usada. Sin embargo, una vez que se encuentra el kernel y se carga por
el gestor de arranque, el proceso de arranque por defecto es idéntico a través de
todas las arquitecturas. Este capítulo se basa principalmente en la arquitectura
x86.
1.2.1. La BIOS
• Cuando un ordenador x86 se carga, el procesador busca al final de la memoria
del sistema por Basic Input/Output System o el programa BIOS y lo ejecuta. La
BIOS controla no sólo el primer paso del proceso de arranque, sino que también
proporciona una interfaz de bajo nivel para dispositivos periféricos. Por este
motivo se escribe tan sólo en modo lectura, memoria permanente y está siempre
disponible para el uso.
• Otras plataformas usan programas diferentes para ejecutar tareas a bajo nivel
equivalentes a aquellas de la BIOS en el sistema x86. Por ejemplo, los
ordenadores basados en Itanium usan el Shell Interfaz de Firmware extendible
(Extensible Firmware Interface, EFI).
• Una vez que se haya cargado, la BIOS chequea los periféricos y localiza un
dispositivo con el que arrancar el sistema. Habitualmente, en primer lugar
comprueba cualquier disquete y unidades de CD-ROM presente por los medios
de arranque, y a continuación si esto falla, echa un vistazo a las unidades de
disco duro del sistema. En la mayoría de los casos, el orden de búsqueda de las
unidades para arrancar es controlado por una configuración de la BIOS y busca
por el dispositivo maestro IDE en el bus IDE primario. La BIOS carga en
memoria cualquier programa que resida en el primer sector de este dispositivo,
llamado Registro de arranque principal o Master Boot Record (MBR). La MBR
sólo tiene 512 bytes de tamaño y contiene las instrucciones de código de
máquina para el arranque del equipo, llamado un gestor de arranque, así como
también la tabla de particiones. Una vez que la BIOS haya encontrado y cargado
el gestor de arranque en memoria, le deja el control del proceso de arranque a
éste.

1.2.2. El gestor de arranque


• Esta sección revisa los gestores de arranque para la plataforma x86, GRUB.
• Un gestor de arranque para la plataforma x86 se divide en al menos dos etapas.
La primera es un código binario de máquina pequeña en el MBR. Su única
función es la de localizar el gestor de arranque de la segunda etapa y cargar la
primera parte de éste en memoria.
• GRUB tiene la ventaja de ser capaz de leer particiones ext2 y ext3 y cargar su
archivo de configuración — /boot/grub/grub.conf — al momento de
arranque.
• Una vez que la segunda etapa del gestor de arranque está en memoria, presenta
al usuario con una pantalla gráfica mostrando los diferentes sistemas operativos
o kernels que para los que ha sido configurado para arrancar. En esta pantalla el
usuario puede usar las flechas direccionales para escoger el sistema operativo o
kernel con el que desea arrancar y presione la tecla [Intro]. Si no se presiona
ninguna tecla, el gestor de arranque carga la selección predeterminada luego de
un período de tiempo de espera (también configurable).
• Una vez que el gestor de arranque de la segunda etapa haya determinado qué
kernel arrancar, localizará el binario del kernel correspondiente en el directorio
/boot/. El kernel binario es llamado usando el siguiente formato —
/boot/vmlinuz-<kernel-version> (donde <kernel-version> corresponde a
la versión del kernel especificada en las configuraciones del gestor de arranque).
• El gestor de arranque luego coloca una o más de las imágenes apropiadas de
initramfs en la memoria. Luego, el kernel descomprime estas imágenes desde la
memoria a /boot/, un sistema de archivos virtual basado en RAM, a través de
cpio. El initrd es usado por el kernel para cargar controladores y módulos
necesarios para arrancar el sistema. Esto es muy importante si posee unidades de
disco duro SCSI o si está el sistema utiliza el sistema de archivos ext3.
• Una vez que el kernel y la imagen initramfs se cargan en memoria, el gestor de
arranque pasa el control del proceso de arranque al kernel.
1.2.2.1. Gestores de arranque para otras arquitecturas
• Una vez que se carga el kernel y pasa el proceso de arranque al comando init,
los mismos acontecimientos suceden en cada arquitectura. La única diferencia
entre el proceso de arranque de cada arquitectura está en la aplicación que se usa
para encontrar y cargar el kernel.
• Por ejemplo, la arquitectura Itanium utiliza el gestor de arranque ELILO, las
arquitecturas eServer pSeries de IBM utilizan YABOOT y los sistemas IBM
eServer zSeries e IBM S/390 usan el gestor de arranque z/IPL.
• Consulte el Manual de instalación de Red Hat Enterprise Linux específico para
estas plataformas para obtener información sobre la configuración de sus
gestores de arranque.

1.2.3. El kernel
• Cuando se carga el kernel, éste inicializa y configura la memoria del ordenador
y los diferentes hardware conectado al sistema, incluyendo todos los
procesadores, subsistemas de entrada/salida y dispositivos de almacenamiento.
A continuación buscará la imagen comprimida de initramfs en una ubicación
predeterminada en memoria, la descomprimirá directamente a /sysroot/ y
cargará todos los controladores necesarios. A continuación inicializa los
dispositivos virtuales relacionados con el sistema de ficheros, tal como LVM o
software RAID antes de completar los procesos initramfs y de liberar toda la
memoria que la imagen del disco ocupó anteriormente.
• El kernel luego crea un dispositivo root, monta la partición root como sólo
lectura y libera cualquier memoria no utilizada.
• Llegados a este punto, el kernel está cargado en memoria y operativo. Sin
embargo, como no hay aplicaciones de usuario que permitan la entrada
significativa de datos al sistema, no se puede hacer mucho más.
• Para configurar el entorno de usuario, el kernel inicia el programa /sbin/init.

1.2.4. Programa /sbin/init


• El programa /sbin/init (también llamado init) coordina el resto del proceso
de arranque y configura el ambiente del usuario.
• Cuando el comando init arranca, se vuelve el padre o abuelo de todos los
procesos que comienzan automáticamente en el sistema. Primero, ejecuta el
script /etc/rc.d/rc.sysinit, que establece la ruta del entorno, activa el swap,
verifica los sistemas de archivos y se encarga de todo lo que el sistema necesita
tener hecho al momento de la inicialización. Por ejemplo, la mayoría de los
sistemas usan un reloj, por lo tanto, el rc.sysinit lee el archivo de
configuración para iniciar el hardware del reloj. Otro ejemplo es si hay procesos
especiales en los puertos seriales que deben ser inicializados, rc.sysinit
ejecutará el archivo /etc/rc.serial.
• El comando init luego ejecuta el script /etc/inittab, el cual describe cómo
se debería configurar el sistema en cada nivel de ejecución SysV init. Los niveles
de ejecución son un estado, o modo, definido por los servicios listados en el
SysV directorio /etc/rc.d/rc<x>.d/, donde <x> es el número de nivel de
ejecución. Para más información sobre los niveles de ejecución SysV init,
consulte la Sección 1.4.
• A continuación, el comando init configura la biblioteca de funciones fuente,
/etc/rc.d/init.d/functions, para el sistema, que establece el modo en
cómo iniciar o matar un programa y cómo determinar el PID del programa.
• El programa init inicia todos los procesos de fondo buscando en el directorio
apropiado rc para el nivel de ejecución especificado por defecto en
/etc/inittab. Los directorios rc están numerados para corresponder al nivel
de ejecución que representan. Por ejemplo, /etc/rc.d/rc5.d/ es el directorio
para el nivel de ejecución 5.
• Cuando se arranca el nivel de ejecución 5, el programa init consulta el
directorio /etc/rc.d/rc5.d/ para determinar qué procesos iniciar o parar.
• A continuación un ejemplo de listado del directorio /etc/rc.d/rc5.d/:
K05innd -> ../init.d/innd
K05saslauthd -> ../init.d/saslauthd
K10dc_server -> ../init.d/dc_server
K10psacct -> ../init.d/psacct
K10radiusd -> ../init.d/radiusd
K12dc_client -> ../init.d/dc_client
K12FreeWnn -> ../init.d/FreeWnn
K12mailman -> ../init.d/mailman
K12mysqld -> ../init.d/mysqld
K15httpd -> ../init.d/httpd
K20netdump-server -> ../init.d/netdump-server
K20rstatd -> ../init.d/rstatd
K20rusersd -> ../init.d/rusersd
K20rwhod -> ../init.d/rwhod
K24irda -> ../init.d/irda
K25squid -> ../init.d/squid
K28amd -> ../init.d/amd
K30spamassassin -> ../init.d/spamassassin
K34dhcrelay -> ../init.d/dhcrelay
K34yppasswdd -> ../init.d/yppasswdd
K35dhcpd -> ../init.d/dhcpd
K35smb -> ../init.d/smb
K35vncserver -> ../init.d/vncserver
K36lisa -> ../init.d/lisa
K45arpwatch -> ../init.d/arpwatch
K45named -> ../init.d/named
K46radvd -> ../init.d/radvd
K50netdump -> ../init.d/netdump
K50snmpd -> ../init.d/snmpd
K50snmptrapd -> ../init.d/snmptrapd
K50tux -> ../init.d/tux
K50vsftpd -> ../init.d/vsftpd
K54dovecot -> ../init.d/dovecot
K61ldap -> ../init.d/ldap
K65kadmin -> ../init.d/kadmin
K65kprop -> ../init.d/kprop
K65krb524 -> ../init.d/krb524
K65krb5kdc -> ../init.d/krb5kdc
K70aep1000 -> ../init.d/aep1000
K70bcm5820 -> ../init.d/bcm5820
K74ypserv -> ../init.d/ypserv
K74ypxfrd -> ../init.d/ypxfrd
K85mdmpd -> ../init.d/mdmpd
K89netplugd -> ../init.d/netplugd
K99microcode_ctl -> ../init.d/microcode_ctl
S04readahead_early -> ../init.d/readahead_early
S05kudzu -> ../init.d/kudzu
S06cpuspeed -> ../init.d/cpuspeed
S08ip6tables -> ../init.d/ip6tables
S08iptables -> ../init.d/iptables
S09isdn -> ../init.d/isdn
S10network -> ../init.d/network
S12syslog -> ../init.d/syslog
S13irqbalance -> ../init.d/irqbalance
S13portmap -> ../init.d/portmap
S15mdmonitor -> ../init.d/mdmonitor
S15zebra -> ../init.d/zebra
S16bgpd -> ../init.d/bgpd
S16ospf6d -> ../init.d/ospf6d
S16ospfd -> ../init.d/ospfd
S16ripd -> ../init.d/ripd
S16ripngd -> ../init.d/ripngd
S20random -> ../init.d/random
S24pcmcia -> ../init.d/pcmcia
S25netfs -> ../init.d/netfs
S26apmd -> ../init.d/apmd
S27ypbind -> ../init.d/ypbind
S28autofs -> ../init.d/autofs
S40smartd -> ../init.d/smartd
S44acpid -> ../init.d/acpid
S54hpoj -> ../init.d/hpoj
S55cups -> ../init.d/cups
S55sshd -> ../init.d/sshd
S56rawdevices -> ../init.d/rawdevices
S56xinetd -> ../init.d/xinetd
S58ntpd -> ../init.d/ntpd
S75postgresql -> ../init.d/postgresql
S80sendmail -> ../init.d/sendmail
S85gpm -> ../init.d/gpm
S87iiim -> ../init.d/iiim
S90canna -> ../init.d/canna
S90crond -> ../init.d/crond
S90xfs -> ../init.d/xfs
S95atd -> ../init.d/atd
S96readahead -> ../init.d/readahead
S97messagebus -> ../init.d/messagebus
S97rhnsd -> ../init.d/rhnsd
S99local -> ../rc.local
• Como puede ver, ninguno de los scripts que inician y cierran los servicios están
localizados en el directorio /etc/rc.d/rc5.d/. Casi todos los ficheros en
/etc/rc.d/rc5.d/ son enlaces simbólicos apuntando a los scripts localizados
en el directorio /etc/rc.d/init.d/. Los enlaces simbólicos se usan en cada
uno de los directorios rc de manera que los niveles de ejecución puedan ser
reconfigurados al crear, modificar y eliminar los enlaces simbólicos sin que
afecte a los scripts actuales a los que se refiere.
• El nombre de cada enlace simbólico comienza con K o S. Los enlaces K son
procesos eliminados en ese nivel de ejecución, mientras que aquellos que inician
por S son procesos a iniciar.
• El comando init en primer lugar detiene todos los enlaces simbólicos de K en el
directorio mediante la ejecución del comando /etc/rc.d/init.d/<command>
stop, en el que <command> es el proceso a matar. A continuación inicia todos
los enlaces simbólicos S al ejecutar /etc/rc.d/init.d/<command>. start.
• Cada uno de los enlaces simbólicos se numera para dictaminar el orden de
inicio. Usted puede cambiar el orden en el que los servicios inician o paran al
cambiar este número. Mientras más bajo es el número, más rápido se arrancará.
Los enlaces simbólicos con el mismo número se inician de modo alfabético.
• Después que el comando init ha progresado a través del directorio adecuado rc
para el nivel de ejecución, el script /etc/inittab bifurca un proceso
/sbin/mingetty para cada consola virtual (prompt de inicio de sesión) del nivel
de ejecución. Los niveles de ejecución del 2 al 5 tienen seis consolas virtuales,
mientras que el nivel de ejecución 1 (modo usuario único) tiene tan sólo uno y lo
niveles de ejecución del 0 al 6 no tienen ninguno. El proceso /sbin/mingetty
abre las rutas de la comunicación para los dispositivostty, establece sus modos,
imprime el indicador de inicio de sesión, toma el nombre y contraseña del
usuario, e inicia el proceso de inicio de sesión.
• En el nivel de ejecución 5, /etc/inittab ejecuta un script llamado
/etc/X11/prefdm. El script prefdm ejecuta su gestor de pantalla de X preferido
— gdm, kdm, o xdm, dependiendo de los contenidos del archivo
/etc/sysconfig/desktop.
• Una vez que haya terminado, el sistema operará en el nivel de ejecución 5 y
mostrará la pantalla de inicio de sesión.

4
Respaldos, herramientas para crear respaldos, trabajo con los discos.
Utilerías para programar tareas

El uso de utilerías para el manejo de unidades de almacenamiento es algo totalmente


necesario a la hora de trabajar con un servidor linux.

Va más allá de montar particiones o sacar respaldos, existen muchísimas utilerías que
permiten también optimizar los accesos a disco así como herramientas para particionar o
reparticionar discos, chequearlos, formatearlos, etc.

Ahora, no solamente debemos pensar en unidad de almacenamiento como un disco


duro, también las unidades de almacenamiento comprenden por ejemplo las unidades de
floppy, dispositivos USB para mass storage (almacenamiento) y sobre todo las cintas
para realizar respaldos.

En las siguientes secciones veremos todas estas utilerías, su uso y potenciales


implementaciones para facilitar nuestro trabajo.

Tipos de disco:
Linux es capaz de manejar varios tipos de disco.

• Discos mecánicos
• Dispositivos no mecánicos
• Unidades de cinta
• Discos extraibles (floppies).
Discos mecánicos:
Los discos mecánicos son aquellos que se componen de uno o varios platos donde se
escribe la información, estos platos rotan a cierta velocidad y uno o varios brazos
mecánicos se ocupan de acceder a los platos rotatorios y leer o escribir la información.

Existen varios tipos de discos mecánicos, normalmente conocidos por su controladora y


tasa de transferencia. Entre los más populares al momento están:

1. Discos IDE
2. Discos SCSI
3. Discos SATA

Básicamente la tecnología mecánica subyacente es muy similar, sólo que ellos se


diferencian por la forma en que la información es transferida del disco hacia el
procesador y memoria.

Los discos SCSI tienen la virtud de ser extremadamente rápidos en términos de


capacidad de rotación así como que la tasa de transferencia puede llegar al
momento a 320MB/s lo que hace que para aplicaciones que requieren de mucha
E/S estos discos sean extremadamente apetecidos. También estos discos no
consumen interrupciones del procesador por lo que los independiza del uso o no
que se esté dando al procesador y acelera todo el proceso.

El punto negativo de estos discos es el costo, un disco scsi vale lo que rinde, y
rinde mucho.

Los discos más conocidos al momento y más usados por el mundo en general
son los discos IDE, estos tienen tasas de transferencia de alrededor de 33MB/s
hasta 133mb/s, pero no todo es la tasa de transferencia, realmente estos discos
consumen interrupciones del procesador por lo que generan cuellos de botella
relacionados con el uso de la CPU. Además que usan cable paralelo para la
transferencia de datos y esto está llegando a sus límites, es decir, debido a las
altas tasas de transferencia ya se pueden producir fácilmente una gran cantidad
de fallas porque los datos no están sincronizados, etc.

En estos momentos ha aparecido en el mercado un tipo de discos que digamos es


un intermedio, un compromiso entre los discos scsi y discos ide. Estos son los
discos SATA (serial ATA, algunos los leen así mismo SATA, otros lo leen
como ESE ATA, prefiero SATA leido tal y como se escribe).

Este tipo de discos, al momento logra velocidades de aproximadamente 150mb/s


lo que lo hace un 5% más rápido que los discos ATA más rápidos (no todos los
discos ATA son de 133mb/s tampoco). Se piensa que para este año los discos
SATA logren velocidades de 300mb/s de transferencia y para el 2008 se logren
velocidades de 600mbit/s.

SATA no solamente es más rápido que los discos ATA, sino que es
comparablemente igual de rápido que los discos scsi más comunes y en poco
tiempo serán tan o más rápidos que los SCSI más rápidos. Usa una tecnología
que técnicamente consume mucha menos energía y sobre todo el costo es
relativamente igual al de un disco ATA normal

En estos momentos ya muchas personas no compran discos ATA porque el


precio es igual que los SATA sin embargo el desempeño de los SATA es mucho
mejor. Es más, muchas empresas que necesitan soluciones rápidas y arreglos de
discos de bajo costo ya no sólo tienen que pensar en arreglos de discos SCSI
(que son buenos y caros) sino que pueden usar arreglos de discos SATA.

RHEL (centos4) tiene un buen soporte para discos SATA. Las versiones
anteriores no tenían soporte o este era muy limitado (RHEL3). Pero entendemos
que la mayoría de las controladoras SATA son perfectamente detectadas por
RHEL4.

Dispositivos no mecánicos:
Estos son nuevas o viejas técnicas de almacenamiento que se han ido abaratando
con el tiempo. Son las llamadas Compact Flash (CF) que son discos duros que
soportan cientos de miles de escrituras sin dañarse así como cantidades casi
infinitas de lecturas.

Estos discos tienen la peculiaridad de que consumen muy baja energía, al no


tener motores que muevan sus partes móviles, además de que son
extremadamente compactas. Además, al no tener partes móviles, estos
dispositivos no se rompen debido a caídas o fallas en sus mecanismos. Son
dispositivos que una vez funcionando trabajarán por mucho tiempo mientras sus
componentes de grabación estén en la capacidad de seguir almacenando nuevos
datos.

Aunque los compact flash es como les conozco, también existen en muchas
variantes tales como: SD, Pendrives, etc.

Son muy usados en cámaras digitales pues almacenan información sin depender
de golpes y caídas y son pequeños.

Estos dispositivos tienen una desventaja y es que normalmente son un poco más
caros que sus contrapartes mecánicas. Es una tecnología que recién está entrando
al mercado (unos dos o tres años) por lo que está en constante evolución y los
precios están tendiendo a bajar constantemente. Al momento conozco de
dispositivos no mecánicos (eléctricos) de almacenamiento de 4 y 8GB, no me
sorprendería ver discos más grandes en los próximos meses o años.

Esta tecnología se usa mucho para sistemas embebidos, que requieren de partes
no móviles y de bajo consumo.

Los sistemas linux soportan lecturas y escrituras a estos sistemas de forma


totalmente natural. Linux ve estos dispositivos como si fueran un dispositivo
scsi y se puede leer y escribir en ellos como mismo se escribe en cualquier disco
mecánico.

Unidades de cinta
Es una de las tecnologías más viejas que existen para almacenar información sin
embargo sigue siendo usada por muchas empresas. Mayormente los dispositivos
de cinta están estandarizados y se manejan a través de un dispositivo del sistema
linux llamado: /dev/st0

Las unidades de cinta son muy útiles para guardar respaldos, ya que son capaces
de almacenar realmente grandes cantidades de información y el costo por GB
asociado con ellas es más bajo que el mantener un disco para hacer respaldos.
Además las cintas pueden cambiarse y moverse de lugar a conveniencia lo que
normalmente permite guardar los respaldos en otros lugares separados de los
servidores.

Las unidades de cinta tienen varias desventajas, la mayor de ella es que no


mantienen un filesystem, es decir los datos se escriben en ellas uno detrás del
otro y normalmente es necesario saber qué se ha escrito para poderlo recuperar.
Además son muy lentas comparadas con las escrituras en un disco así como que
algunas personas indican que estas tienden a fallar con el tiempo.

Más adelante veremos cómo usar las unidades de cinta.

Discos extraíbles
Son básicamente los discos floppies, esos antiguos aliados que al momento están
quedando en desuso, pero también podemos ver como discos extraíbles a sus
nuevos hermanos, los discos CDROM y DVD que permiten almacenar
muchísima información comparado con los floppies.

Es mi parece que los CDrom, aunque un medio muy bueno para almacenar la
información son definitivamente más fallosos que los discos mecánicos o no
mecánicos así como que las unidades de cinta. Sobre todo porque tienen
expuesta la información directo a las inclemencias del tiempo (sol, lluvia, agua,
arañazos, etc). Pero definitivamente es una forma confiable de trasladar la
información y hasta de almacenarla.

Linux también es capaz de manejar estos dispositivos extraíbles. En general


virtualmente cada dispositivo de almacenamiento es manejable mediante linux.

Debemos recordar que linux no sólo maneja mucha variedad de hardware


referente a los dispositivos extraíbles sino que también entiende los diferentes
formatos conque estos pueden estar inicializados, de forma tal que podemos
desde linux leer particiones FAT12, FAT16, FAT32, NTFS, así como de una
gran variedad de sistemas unix existentes en el mercado.

Mientras que la mayoría de los pasos necesarios para añadir o eliminar unidades de
almacenamiento dependen más en el hardware del sistema que en el software, hay
aspectos del procedimiento que son específicos a su entorno operativo. Esta sección
explora los pasos necesarios para añadir o eliminar almacenamiento que son específicos
a RHEL (CentOS), por supuesto asumiremos que la unidad que está siendo agregada
está correctamente instalada a nivel de hardware.

Añadir almacenamiento
El proceso de añadir almacenamiento a un sistema Linux es relativamente directo. He
aquí los pasos:

• Particionar
• Formatear la partición(es)
• Actualizar /etc/fstab

Particionar

Una vez instalado el disco duro, es hora de crear una o más particiones para hacer el
espacio disponible a Linux.

Hay más de una forma de hacer esto:

• Usando el programa de línea de comandos fdisk


• Usando parted, otro programa utilitario de línea de comandos

Aunque las herramientas pueden ser diferentes, los pasos básicos son los mismos. En el
ejemplo siguiente, se incluyen los comandos necesarios para efectuar estos pasos
usando fdisk:

• Defina a qué unidad de almacenamiento procederemos a particionar.


Podemos usar el comando:

fdisk -l

• Es muy importante no cometer errores en este proceso, el


fdisk una vez grabados los cambios es destructivo y si nos
equivocamos de unidad de almacenamiento los datos se
pueden perder.
• Al determinar la unidad de almacenamiento a la que nos referiremos,
procedemos a llamar el fdisk indicándole a qué partición queremos
llegar:
fdisk /dev/hda

• Revise la tabla de particiones de la unidad para verificar que la unidad a


particionar es, en realidad, la correcta. En nuestro ejemplo, fdisk muestra la
tabla de partición usando el comando p:
Command (m for help): p

Disk /dev/hda: 255 heads, 63 sectors, 1244 cylinders


Units = cylinders of 16065 * 512 bytes

Device Boot Start End Blocks Id System


/dev/hda1 * 1 17 136521 83 Linux
/dev/hda2 18 83 530145 82 Linux swap
/dev/hda3 84 475 3148740 83 Linux
/dev/hda4 476 1244 6176992+ 83 Linux

• Borre cualquier partición no deseada que pueda existir en la nueva unidad de


disco. Esto se hace usando el comando d en fdisk:
Command (m for help): d
Partition number (1-4): 1
• El proceso se repetirá para todas las particiones no deseadas presentes el el
disco.
• Cree la(s) nueva(s) partición(es), asegurándose de especificar el tamaño deseado
y el tipo de sistemas de archivos. Usando fdisk, esto es un proceso de dos pasos
— primero, cree la partición (usando el comando n):
Command (m for help): n
Command action
e extended
p primary partition (1-4)

Partition number (1-4): 1


First cylinder (1-767): 1
Last cylinder or +size or +sizeM or +sizeK: +512M

• Segundo, configure el tipo de sistema de archivos (usando el comando t):


Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): 82

• El tipo de partición 82 representa una partición Linux swap.


• Guarde sus cambios y salga del programa de particionamiento. Esto se hace en
fdisk ejecutando w:

Command (m for help): w

Formatear la partición

El formateo de particiones bajo Linux se hace usando el programa de utilidades mkfs.


Sin embargo, mkfs en realidad no hace el trabajo de escribir la información específica
del sistema de archivos en el disco; en cambio pasa el control a uno de los muchos
programas que crean el sistema de archivos.

Este es el momento de observar la página man de mkfs.<fstype> para el sistema de


archivos que ha seleccionado. Por ejemplo, vea la página man de mkfs.ext3 para
revisar las opciones disponibles durante la creación de un sistema de archivos ext3. En
general, los programas mkfs.<fstype> suministran valores por defecto razonables para
la mayoría de las configuraciones; sin embargo, he aquí algunas de las opciones que los
administradores de sistemas cambian más a menudo:

• Configuran una etiqueta de volumen para su uso posterior en /etc/fstab


• En discos duros muy grandes, configuran un porcentage más pequeño de espacio
reservado para el super-usuario
• Configuran un tamaño de bloque no estándar y/o bytes para las configuraciones
de inodos, que deben soportar tamaños de archivos muy grandes o muy
pequeños
• Verifican por bloques dañados antes de formatear
Personalmente prefiero llamar directamente a la utilería de formateo deseada. Por
ejemplo, si quisiera formatear una partición con el FS tipo ext3, ejecutaría el comando:

mkfs.ext3 /dev/hda3
ATENCION: ESTE COMANDO DESTRUIRÁ TODA LA INFORMACIÓN
CONTENIDA EN LA PARTICIÓN /dev/hda3

El comando mkfs.ext3 permite especificar algunos parámetros adicionales (ver la


página manual para una lista extensa de opciones). De los cuales los más usados son:
-m# : Porciento del disco reservado para el super usuario. El valor por defecto es el 5%,
es decir, el 5% del disco se reservará para el superusuario del sistema y no podrá ser
usado por ningún otro usuario. Normalmente se hacía para evitar que un disco se llenara
y que el superusuario mientras tanto no pudiera hacer operaciones de respaldo, copia de
información etc. Realmente al momento es algo bien poco común. Si un disco se llenara
al menos la información se puede sacar al vuelo hacia otra máquina por la red y no se
requiere limitar el espacio en disco... pues de esta forma sólo el 95% del disco estaría
disponible para usarse por todos los usuarios. Normalmente especifico 0, 0% reservado
para el super usuario.

-N#: número de inodos que serán creados para esta partición. Los inodos se calculan
normalmente en una relación de 1 inodo por cada 4kb de espacio en disco. De forma tal
que un disco de 80GB consumirá algo así como 80 * 1024M *1024K / 4k, o lo que es lo
mismo: 83886080 / 4 = unos 21 millones de inodos.
realmente se usarán 21millones de inodos para mi disco? Bueno, esto depende de las
características de nuestro sistema, puede que sean mucho menos, puede que sean mucho
más. En todo caso, la tabla de inodos también consume espacio, lo que hace que
mientras más inodos creemos para una partición determinada, menos espacio podremos
dedicar a almacenar información. Por ejemplo, si tenemos una flash de 128mb, nuestro
linux formatearía la flash con 32768 inodos (128 * 1024k / 4k), guardaremos en esta
flash 32768 archivos? Lo dudo realmente. Lo normal es que una flash guarde digamos
10, 100, 2000 archivos... entonces para qué gastar espacio creando inodos que nunca
usaremos? Es aqui que entra la N, podemos decirle al mkfs que formatee nuestra
partición con 1000 inodos por ejemplo. Y todo el resto del espacio en disco lo podemos
aprovechar para guardar más información. Me parece bueno.

Un ejemplo del uso de switches:

mkfs.ext3 -m0 -N128 /dev/hda1

Qué hicimos aquí? Pues simple, le hemos indicado que no guarde ningún
espacio en disco para el superusuario (es decir todo el disco lo podrán usar
tanto usuarios como superusuarios) y que sólo cree 128 inodos!!! Pero y
esto?!, qué tal /boot? Qué tal la partición que dedicamos a /boot, cuántos
archivos se guardan en ella? Cuéntenlos, normalmente no pasan de 15...
128 aún es un número grande para mi /boot, y tengo la oportunidad de
aprovechar hasta el último byte en espacio en disco en vez de
desperdiciarlo con inodos que posiblemente nunca usaré.
-c : Manda al sistema a formatear la partición pero le pide que chequee clusters malos y
los marque. Es un proceso muy lento, y normalmente no lo uso. Cuando digo lento es
algo así como que puede demorar 12 a 48 horas el terminar de realmente chequear
contra clusters malos.

mkfs.msdos me permite crear una partición con formato fat16 (util para las flash) y
mkfs.vfat me permite crear particiones fat32 que podrán ser leídas por windows. Es
decir SÍ, podemos formatear particiones de DOS desde linux sin mayor inconveniente y
sin tener que instalar windows.

Una vez creados los sistemas de archivos en todas las particiones apropiadas, la unidad
de disco estará configurada adecuadamente para su uso.

Luego, siempre es bueno volver a verificar su trabajo manualmente montando la


partición(es) y asegurándose de que está en orden. Una vez que todo está verificado, es
el momento de configurar su sistema Linux para que monte automáticamente el nuevo
sistema de archivos durante el arranque.

Actualizar /etc/fstab

Como se describió anteriormente, primero debe añadir las líneas necesarias a


/etc/fstab para asegurarse de que se monte el nuevo sistema de archivos cuando
arranque el sistema. Una vez actualizado /etc/fstab, pruebe su trabajo ejecutando un
comando "incompleto" de mount, especificando solamente el dispositivo o punto de
montaje. Algo similar a alguno de los comandos siguientes es suficiente:

mount /home
mount /dev/hda3

(Reemplace /home or /dev/hda3 con el punto de montaje o dispositivo para su


situación específica.)

Si la entrada correspondiente en /etc/fstab es correcta, mount obtiene la información


faltante desde el archivo y completa la operación de montaje.

En este punto puede estar confiado de que /etc/fstab está configurado correctamente
para montar automáticamente el nuevo almacenamiento cada vez que el sistema arranca
(aunque si se puede permitir un reinicio rápido, no hace daño — simplemente para estar
seguros).

Eliminar Almacenamiento

El proceso de eliminar almacenamiento desde un sistema Linux es relativamente


directo. He aquí los pasos específicos:

• Elimine las particiones de disco desde /etc/fstab


• Desmonte las particiones activas del disco
• Borre los contenidos de la unidad de disco

Las secciones siguientes cubren estos tópicos en más detalles.


Elimine las particiones de disco desde /etc/fstab

Usando el editor de texto de su preferencia, elimine la(s) línea(s) correspondiente(s) a


la(s) partición(es) de disco desde el archivo /etc/fstab. Puede identificar las líneas
correctas por alguno de los métodos siguientes:

• Haciendo corresponder los puntos de montaje con los directorios en la segunda


columna de /etc/fstab
• Haciendo corresponder el nombre del archivo de dispositivo con el nombre de
archivo en la primera columna de /etc/fstab

Terminar el acceso con umount

Luego, se deben terminar todos los accesos. Para particiones con sistemas de archivos
activos en ellas, esto se hace con el comando umount. Si una partición swap existe en el
disco, se debe desactivar con el comando swapoff o se debe reiniciar el sistema.

Desmontar las particiones con el comando umount requiere que usted especifique el
nombre de archivo de dispositivo, o el punto de montaje.

umount /dev/hda2
umount /home

Solamente se puede desmontar una partición si esta no se encuentra en uso. Si la


partición no se puede desmontar mientras se encuentra en el nivel de ejecución normal,
arranque en modo de rescate y elimine la entrada de la partición de /etc/fstab.

Cuando utilice swapoff para desactivar el swapping en una partición, debe especificar
el nombre de archivo de dispositivo representando la partición swap:

swapoff /dev/hda4

Si no puede desactivar el swapping usando swapoff, arranque en modo de rescate y


elimine la entrada de la partición desde /etc/fstab.

Borre los contenidos de la unidad de disco

Borrar los contenidos desde una unidad de disco bajo Linux es un procedimiento
directo.

Después de desmontar todas las particiones del disco, ejecute el comando siguiente
(conectado como root):

badblocks -ws <device-name>


Donde <device-name> representa el nombre del archivo de la unidad de disco que
desea borrar, excluyendo el número de la partición. Por ejemplo, /dev/hdb para la
segunda unidad ATA.

Se muestra la salida siguiente mientras se ejecuta badblocks:

Writing pattern 0xaaaaaaaa: done


Reading and comparing: done
Writing pattern 0x55555555: done
Reading and comparing: done
Writing pattern 0xffffffff: done
Reading and comparing: done
Writing pattern 0x00000000: done
Reading and comparing: done

Tenga en mente que badblocks en realidad está escribiendo cuatro patrones de datos
diferentes a cada bloque en la unidad de disco. Para las unidades grandes, este proceso
puede tomar un largo tiempo — a menudo varias horas.

ESTE PROCESO ES DESTRUCTIVO, precisamente el fin que se persigue es el de


destruir totalmente la información del disco con el objetivo de que futuros usuarios no
puedan obtener ningún dato potencialmente sensitivo en él.

El proceso de destrucción nos parece bastante seguro sin embargo hacemos notar que su
empresa o compañía puede tener otros procesos de destrucción de datos diferentes de
los nuestros. El uso de nuestro proceso no debe bajo ningún motivo obviar el
procedimiento dictado a seguir para el caso de su empresa o compañía y el ignorar este
proceso por parte de usted le puede traer severas consecuencias.

Otra forma de eliminar la información en una partición es usando el comando shred:

shred -n 2 -v /dev/hda

ejecutará dos iteracciones (-n 2) copiando datos aleatorios en toda la partición. De no


especificarse -n, se ejecutarán 25 iteracciones. Así que posiblemente ni el más rudo de
los programas de recuperación hará que los datos se recuperen, pues no quedará ni la
sombra, ni el último álito de vida de los datos al ser concienzudamente sobreescrito todo
/dev/hda (en este caso, usar el dispositivo que uds quieren borrar!!) por varias veces.

shred también sirve para eliminar la información de un archivo:


shred /root/miarchivo

hará lo mismo pero con los datos de "miarchivo"

Miren un ejemplo de la salida de shred sobre un archivo:

[root@eperez ~]# shred -v freetemp1071.zip


shred: freetemp1071.zip: pass 1/25 (random)...
shred: freetemp1071.zip: pass 2/25 (924924)...
shred: freetemp1071.zip: pass 3/25 (222222)...
shred: freetemp1071.zip: pass 4/25 (555555)...
shred: freetemp1071.zip: pass 5/25 (bbbbbb)...
shred: freetemp1071.zip: pass 6/25 (249249)...
shred: freetemp1071.zip: pass 7/25 (492492)...
shred: freetemp1071.zip: pass 8/25 (333333)...
shred: freetemp1071.zip: pass 9/25 (000000)...
shred: freetemp1071.zip: pass 10/25 (ffffff)...
shred: freetemp1071.zip: pass 11/25 (6db6db)...
shred: freetemp1071.zip: pass 12/25 (b6db6d)...
shred: freetemp1071.zip: pass 13/25 (random)...
shred: freetemp1071.zip: pass 14/25 (666666)...
shred: freetemp1071.zip: pass 15/25 (111111)...
shred: freetemp1071.zip: pass 16/25 (eeeeee)...
shred: freetemp1071.zip: pass 17/25 (777777)...
shred: freetemp1071.zip: pass 18/25 (cccccc)...
shred: freetemp1071.zip: pass 19/25 (444444)...
shred: freetemp1071.zip: pass 20/25 (db6db6)...
shred: freetemp1071.zip: pass 21/25 (aaaaaa)...
shred: freetemp1071.zip: pass 22/25 (999999)...
shred: freetemp1071.zip: pass 23/25 (dddddd)...
shred: freetemp1071.zip: pass 24/25 (888888)...
shred: freetemp1071.zip: pass 25/25 (random)...

Qué hice aqui? Simple, ejecuté el shred en 25 pasos, en cada uno


sobreescribió todos los bytes del archivo seleccionado con diferentes
patrones, es decir, cambió básicamente la estructura del disco duro varias
veces de forma tal que en realidad no pueda se leído entre líneas (hay quien
lo hace) y no se pueda obtener nada útil.

Aunque ya habíamos tratado anteriormente de ellas, nunca está de más


recordar una de las utilerías más importantes a la hora de la verdad (esa
hora en que realmente tenemos que ponernos a trabajar y que es cuando el
sistema no levanta).

El fsck nos permite revisar diferentes tipos de particiones con solamente


llamarle indicándole a qué partición nos referimos:
fsck /dev/hda1
por ejemplo chequeará la partición 1 del disco IDE máster primario (hda)

fsck /dev/sdb5 realizará lo mismo pero para la partición 5ta del 2do disco
scsi en una cadena SCSI.

fsck normalmente arregla todas las situaciones, pero si alguna situación no


la pudiera arreglar, consideremos que el disco hay que reformatearlo, ha
muerto.

fsck normalmente pregunta si queremos realizar todos y cada uno de los


arreglos. Sugiero que SIEMPRE digamos que sí a cada una de sus
preguntas.

Si no quisiéramos responder y constantemente (a veces con cientos de


veces) podemos llamar al fsck con el switch -y, por ejemplo:
fsck -y /dev/hdb5
Existen muchas vías para acceder a diskettes desde linux.

• montando el diskette como mismo se monta una partición: Usando esta forma,
podemos acceder a la información del diskette desde un directorio, esta forma
tiene una ventaja adicional y es que no sólo funciona para diskettes formateados
para DOS sino para cualquier otro tipo de formato que acepte un diskette. Y
tiene una desventaja, como todos los elementos que montamos en nuestro árbol
de directorio, no es saludable el sacar el diskette sin antes desmontarlo.
• Usando un emulador: Podemos instalar y llamar al DOSEMU, que es un
emulador de DOS y desde el dosemu acceder al diskette trabajar con él, es un
poco difícil pues instalar el dosemu es demorado (ya que no viene preinstalado
ni viene en los cds de centos) además que es toda una tremenda herramienta sólo
para leer un diskette.
• usando las mtools: Mtools es una colección de herramientas (comandos) de DOS
que permiten trabajar con filesystems DOS (normalmente floppy), estos
comandos tratan por todos los medios de emular la funcionalidad del DOS pero
sin mantener restricciones absurdas. Por ejemplo, en DOS no es posible pero
con las mtools sí es posible el mover un subdirectorio desde un subdirectorio
hacia otro.

Las mtools son trivialmente fáciles, y podemos obtener una buena ayuda si llamamos a
su página informativa:
info mtools

Pero normalmente podemos asumir que son los mismos comandos que dos sólo que con
la letra m delante:

mdir a:
mformat a:
mcopy /root/archivo a: (copiará desde linux hacia el floppy)
mdel a:archivo
mmove

y así varios comandos posibles

Lo interesante también es que el floppy no tenemos que montarlo, así que podremos
extraerlo cuando querramos.
En linux existen varias formas de comprimir la información. Estos diferentes comandos
se dividen en dos tipos:

1. Compresión sin pérdida: el que hace que la información no se pierda entre


compresión y descompresión.
2. Compresión con pérdida: el que sí pierde información al comprimirla.

Se llama así a cualquier procedimiento de codificación que tenga como objetivo


representar cierta cantidad de información utilizando una menor cantidad de la misma,
siendo imposible una reconstrucción exacta de los datos originales.
La compresión con pérdida solo es útil cuando la reconstrucción exacta no es
indispensable para que la información tenga sentido. La información reconstruida es
solo una aproximación de la información original.

Suele restringirse a información analógica que ha sido digitalizada (imágenes, audio,


video, etc...), donde la información puede ser parecida, y al mismo tiempo, ser
subjetivamente la misma.

Su mayor ventaja reside en las altas razones de compresión que ofrece en


contraposición a un algoritmo de compresión sin pérdida.

Para ver ejemplos de sistemas de compresión con pérdida (lossy compression), ver en
wikipedia.

ahora, a nosotros en este momento nos interesa saber sobre el tema de la compresión sin
pérdida (lossless compression). En el cual todo dato que logremos comprimir, podremos
descomprimirlo y obtener toda su información original.

Este tipo de compresión es muy útil para cuando realizamos respaldos y copias entre
sistemas, y es la que más nos preocupa ahora.

Para esto podemos usar el comando gzip, gzip es uno de los mejores compresores del
mercado, superado por el bzip2, pero gzip es mucho más rápido que el bzip2 por lo
tanto mucho más usado.

Ambos están presentes en linux. El comando para comprimir un archivo con gzip sería:

intentará comprimir el archivo con un árbol de compresión de 9 pisos de profundidad, por


lo que logrará una mayor compresión, a un costo de un mayor consumo de recursos y por
lo tanto demora en la compresión.

Por defecto gzip comprime con un nivel 6 y la diferencia entre 6 y 9 es poco apreciable en
el orden de un 1 a 5% más de compresión de un archivo. Pero el costo de usar 9 en
recursos es muy alto, por lo que sólo deberemos usar el -9 si sabemos que la máquina
dispone de recursos y no será afectado el proceso.

Por ejemplo uso el -9 para hacer copias permanentes (de esas que no abriré en muchos
meses) pero nunca lo uso para hacer copias diarias de mis respaldos pues eso demora
mucho.
igual no conservaría la copia del archivo.

gzip tiene otros switches interesantes que igual pueden aplicarse al bzip2:gzip archivo
gzip -d archivo.gz
gzip -9 archivo

el gzip no conserva el archivo original, es decir, al terminar de comprimir


"archivo" lo borrará y en el disco nos quedará un "archivo.gz" el cual será
una copia comprimida de éste.

Para el bzip2 podemos usar el mismo formato:Esto abrirá un archivo


comprimido con gzip. También podemos usar
gunzip archivo.gz
para descomprimir.

gzip -t archivo.gz
Probará la integridad (test) de un archivo comprimido para saber si está bien copiado. Si
no se obtiene respuesta al ejecutar -t, esto es que el archivo está bien. Si dice algo
relativo a crc error, el archivo está mal comprimido y no podremos recuperarlo.

cat archivo | gzip -c - > archivo.gz


Este comando lo que hará será un cat (vaciado de un archivo) y lo pasará a la entrada
estándar del gzip. Este lo tomará de la entrada estándar (-) y lo mandará hacia la salida
estándar (-c) y en la salida estándar lo redirigiremos a un archivo.

Esta es una forma de conservar el archivo original mientras lo comprimimos.

TAREA: Comprimamos un archivo con gzip y con bzip2 sin perder el original. Y
verifiquemos cuál de los dos comprimidos es mejor.
[root@eperez ~]# mkdir t
[root@eperez ~]# cat Deber1.doc | gzip -9c - > tmp/Deber.doc.gz9
[root@eperez ~]# cat Deber1.doc | gzip -c - > tmp/Deber.doc.gz
[root@eperez ~]# cat Deber1.doc | bzip2 -c - > tmp/Deber.doc.bz2

[root@eperez ~]# cd tmp


[root@eperez tmp]# ll
total 24
-rw-r--r-- 1 root root 6806 Aug 16 19:19 Deber.doc.bz2
-rw-r--r-- 1 root root 6335 Aug 16 19:19 Deber.doc.gz
-rw-r--r-- 1 root root 6273 Aug 16 19:19 Deber.doc.gz9
En fin, el que gana en mi caso es el gzip -9 (era de esperar). El bzip2 no fue bueno
porque es un archivo muy pequeño (Deber1.doc realmente tiene 57k). El algoritmo
bzip2 es muy bueno para archivos grandes o medianamente grandes. Pero para
pequeños no se diferencia del gzip.

aunque gzip y bzip2 permiten comprimir varios archivos a la vez, no lo uso


normalmente y explicaré más tarde otra forma más precisa de comprimir directorios y
multiples archivos en un sólo paquete.

Muchas veces necesitamos realizar copias completas de un disco duro, bit por bit, los
objetivos son variados :

• Necesidad de clonar un disco hacia otra máquina


• guardar una imagen de un disco para análisis forénsico
• replicaciones en masa del mismo sistema: supongamos que estamos vendiendo
500 máquinas con linux y que queremos ponerle la misma información a todas.
Aparte de que sería sumamente egoísta de su parte el no invitarme a participar
en esta licitación tan grande, sería muy lento el proceso de instalar cientos o
decenas de máquinas con linux.
• Necesitamos realizar una copia exacta de un CD, para quemarlo posteriormente.
• Necesitamos realizar una copia exacta de un floppy pues requerimos usar un
floppy y este que contiene un sistema muy especial es el único que tenemos para
formatear.

Qué comando podemos usar? Bueno, linux tiene un comando que se ocupa de realizar
copias en crudo (raw) de discos completos o particiones.

Se llama dd

El dd requiere básicamente de dos parámetros, uno es el dispositivo o archivo de


entrada y otro es el dispositivo o archivo de salida.

Por ejemplo, cómo realizamos una copia exacta de la partición /dev/hda1:

dd if=/dev/hda1 of=/root/imagenhda1.img

Por supuesto, /root no debe estar en /dev/hda1 sino pienso que se caería en
un ciclo infinito. Siempre if y of (yo lo leo como input file, output file) deben
estar en particiones diferentes.

el dd en este caso demorará un poco, en dependencia de la cantidad de


información que tenga hda1 y en dependencia de la velocidad de lectura y
escritura del sistema.
Aquí estamos trayendo la imagen que anteriormente sacamos hacia la partición hda1.

Las imágenes las podemos comprimir para ahorrar espacio en disco, de esta forma la
podremos guardar en menor espacio y sólo abrirlas si las necesitáramos.

Ahora, al crear una imagen, puede que la partición de destino no tenga el espacio
suficiente, qué podemos hacer?

Podemos intentar comprimir los datos que saca dd, de forma tal que lo que escribamos a
disco vaya comprimido y ahorremos espacio.
[root@eperez ~]# dd if=/dev/hda1 | gzip -c - > boot.img.gz
208782+0 records in
208782+0 records out
dd if=/dev/hda1 : hazte una imagen de /dev/hda1. Como no especificamos of, entonces
el dd sacará los datos de la imagen por la salida estándar. Con el comando | capturamos
esta salida y se la pasamos a:
gzip -c - > boot.img.gz : comprime lo que recibas de la entrada estándar (-) y mándalo
(>) hacia un archivo llamado boot.img.gz

Para crear una partición partiendo de una imagen comprimida podríamos usar:
gzip -dc boot.img.gz | dd of=/dev/hda1

Tarea: Comparemos la compresión con bzip2 y gzip2


[root@eperez ~]# dd if=/dev/hda1 | gzip -9c - > boot.img.gz
[root@eperez ~]# dd if=/dev/hda1 | bzip2 -c - > boot.img.bz2
[root@eperez ~]# ll boot*
-rw-r--r-- 1 root root 72863762 Aug 16 19:48 boot.img.bz2
-rw-r--r-- 1 root root 72984867 Aug 16 19:46 boot.img.gz
En mi caso el bzip2 se demoró mucho más que el gzip. y sí comprimió un poquito
mejor (unos 100kb menor) que el gzip.

Cualquier archivo de imagen que hayamos creado con dd desde una partición es posible
montarlo así mismo desde la imagen. Esto podemos hacerlo por medio de un artilugio
que existe en linux llamado loop (lazos). Mediante los lazos podemos montar imágenes
hechas con dd y leer desde ellas, primero hagamos una imagen:
[root@eperez ~]# dd if=/dev/hda1 of=boot.img
208782+0 records in
208782+0 records out

Ahora creemos un directorio donde montaremos esta imagen (lo haré en /mnt/loop) y
posteriormente montemos la imagen en este directorio.
[root@eperez ~]# mkdir /mnt/loop
[root@eperez ~]# mount -o loop ./boot.img /mnt/loop/
Como vemos, hemos llamado al comando mount pero con una opción llamada loop
(lazo) esta es la que nos permite montar imágenes en directorios.

Entremos a /mnt/loop y creemos un directorio, nos dejará, porque es una imagen creada
de un disco y permitirá que la cambiemos.
[root@eperez ~]# cd /mnt/loop/
[root@eperez loop]# ll
total 2587
-rw-r--r-- 1 root root 48299 Jun 8 17:39 config-2.6.9-11.EL
drwxr-xr-x 2 root root 1024 Aug 15 22:58 grub
-rw-r--r-- 1 root root 395477 Jul 22 17:21 initrd-2.6.9-11.EL.img
drwx------ 2 root root 12288 Jul 21 11:28 lost+found
-rw-r--r-- 1 root root 10213 Feb 26 12:39 message
-rw-r--r-- 1 root root 10213 Feb 26 12:39 message.ja
-rw-r--r-- 1 root root 715755 Jun 8 17:39 System.map-2.6.9-11.EL
-rw-r--r-- 1 root root 1435513 Jun 8 17:39 vmlinuz-2.6.9-11.EL
[root@eperez loop]# mkdir t
[root@eperez loop]# ll
total 2588
-rw-r--r-- 1 root root 48299 Jun 8 17:39 config-2.6.9-11.EL
drwxr-xr-x 2 root root 1024 Aug 15 22:58 grub
-rw-r--r-- 1 root root 395477 Jul 22 17:21 initrd-2.6.9-11.EL.img
drwx------ 2 root root 12288 Jul 21 11:28 lost+found
-rw-r--r-- 1 root root 10213 Feb 26 12:39 message
-rw-r--r-- 1 root root 10213 Feb 26 12:39 message.ja
-rw-r--r-- 1 root root 715755 Jun 8 17:39 System.map-2.6.9-11.EL

drwxr-xr-x 2 root root 1024 Aug 16 19:57 t


-rw-r--r-- 1 root root 1435513 Jun 8 17:39 vmlinuz-2.6.9-11.EL

[root@eperez loop]# cd

[root@eperez ~]# umount /mnt/loop

Y de qué nos sirve el usar loops?


• Pues que podemos ver los contenidos de un CD sin tener que quemarlo (usando
imágenes),
• podemos ver los contenidos de una imágen de una partición sin tener que
quemarla.
• Podemos analizar los contenidos de una imagen para realizar un análisis
forénsico, sin tener que ejecutar los contenidos de esta partición y además
podemos ya tener activo el disco sobre el que sacamos la imagen, disminuyendo
el downtime.
• Podemos realizar cambios en la imagen para entonces sí quemarla (digamos que
crear un directorio o agregar archivos, etc).

Clonación de floppies:
Supongamos que queremos guardar una imagen de un floppy para poder usar el medio
físico. Después podríamos recuperar la información de la imagen en otro medio cuando
nos haga falta.

dd if=/dev/fd0 of=floppy.img
Esto sacaría una imagen del floppy, igual la podemos montar con un loop, e igual
posteriormente podríamos crear una copia exacta del floppy:
dd if=floppy.img of=/dev/fd0
Así podemos mantener copias exactas de nuestros floppies y recuperarlas cuando
deseemos hacia cualquier otro floppy.

Igual podemos hacer para clonar un CD


dd if=/dev/cdrom of=cdrom.img

Ahora, los CDs cuando los clonemos podremos igualmente montarlos con loop, pero los
CDs usan un formato llamado iso9660 que no permite escrituras, por lo que sólo
podríamos leer desde el loop mas no escribir.

Y cómo podemos crear nuestros propios CDs?


Para esto podemos usar un comando llamado mkisofs, el cual toma los datos de un
directorio indicado por nosotros, y crea un archivo .img el cual igualmente podremos
montar o quemar.
-J : Crear en formato Joliet (usado normalmente para los CDs de windows)
-v : Ser verbose (hablador), dar bastante información de lo que hace
-o archivo : crear la imagen con este nombre (rh9.img en mi caso)
directorio de donde crear la imagen (en mi caso: rh9/, tomará de este directorio todos
los archivos y directorios de donde creará la imagen)
[root@eperez ~]# mkisofs -J -v -o rh9.img rh9/
Warning: creating filesystem with (nonstandard) Joliet extensions
but without (standard) Rock Ridge extensions.
It is highly recommended to add Rock Ridge
INFO: UTF-8 character encoding detected by locale settings.
Assuming UTF-8 encoded filenames on source filesystem,
use -input-charset to override.
mkisofs 2.01 (i686-pc-linux-gnu)
Scanning rh9/
Unknown file type (unallocated) rh9/.. - ignoring and continuing.
Using KERNE000.RPM;1 for /kernel-smp-2.4.20-31.9.i686.rpm (kernel-
source-2.4.20-43.9.legacy.i386.rpm)
Using KERNE001.RPM;1 for /kernel-source-2.4.20-43.9.legacy.i386.rpm
(kernel-smp-2.4.20-43.9.legacy.i686.rpm)
Writing: Initial Padblock Start Block 0
Done with: Initial Padblock Block(s) 16
Writing: Primary Volume Descriptor Start Block 16
Done with: Primary Volume Descriptor Block(s) 1
Writing: Joliet Volume Descriptor Start Block 17
Done with: Joliet Volume Descriptor Block(s) 1
Writing: End Volume Descriptor Start Block 18
Done with: End Volume Descriptor Block(s) 1
Writing: Version block Start Block 19
Done with: Version block Block(s) 1
Writing: Path table Start Block 20
Done with: Path table Block(s) 4
Writing: Joliet path table Start Block 24
Done with: Joliet path table Block(s) 4
Writing: Directory tree Start Block 28
Done with: Directory tree Block(s) 1
Writing: Joliet directory tree Start Block 29
Done with: Joliet directory tree Block(s) 1
Writing: Directory tree cleanup Start Block 30
Done with: Directory tree cleanup Block(s) 0
Writing: The File(s) Start Block 30
15.00% done, estimate finish Tue Aug 16 18:20:55 2005
29.99% done, estimate finish Tue Aug 16 18:20:52 2005
44.95% done, estimate finish Tue Aug 16 18:20:53 2005
59.96% done, estimate finish Tue Aug 16 18:20:54 2005
74.92% done, estimate finish Tue Aug 16 18:20:53 2005
89.91% done, estimate finish Tue Aug 16 18:20:53 2005
Total translation table size: 0
Total rockridge attributes bytes: 0
Total directory bytes: 212
Path table size(bytes): 10
Done with: The File(s) Block(s) 33193
Writing: Ending Padblock Start Block 33223
Done with: Ending Padblock Block(s) 150
Max brk space used 0
33373 extents written (65 MB)
Hasta el momento lo que habremos hecho será crear una imagen iso9660, que se podrá
quemar en un CD.

Ahora montemos esta imagen que acabamos de quemar para verificarla:


[root@eperez ~]# mount -o loop ./rh9.img /mnt/loop/

Listemos los contenidos


[root@eperez ~]# ls /mnt/loop/
kernel-smp-2.4.20-31.9.i686.rpm
kernel-smp-2.4.20-43.9.legacy.i686.rpm
kernel-source-2.4.20-43.9.legacy.i386.rpm

Exacto! Es precisamente lo que había en mi directorio rh9/

Intentemos crear un directorio (t) dentro de esa imagen:


[root@eperez ~]# mkdir /mnt/loop/t
mkdir: cannot create directory `/media/loop/t': Read-only file system
Correcto, nos dice que no pues la imagen es del tipo iso9660 y es de sólo lectura.

Desmontémosla, pues no debemos tener montadas las imagenes por gusto


[root@eperez ~]# umount /mnt/loop/
TAREA: Crear una imagen iso9660

Ahora procedamos a quemar, para eso usamos el comando cdrecord. Este comando
quema en un CD, los switches son variados, pero estos generalmente funcionan:
-v : verbose, hablador, decir todo lo que va haciendo
speed=4 : Quemar a una velocidad de 4x, si desean más velocidad poner el valor
adecuado (8, 16, etc)
./rh9.img : Es la imagen que creé en el paso anterior (con mkisofs) por supuesto puede
tener cualquier nombre.

[root@eperez ~]# cdrecord -v speed=4 ./rh9.imgY listo, con esto habremos


creado una compilación (imagen, mkisofs) y la habremos quemado con cdrecord.

Ya en secciones anteriores habíamos visto cómo evitar que el sistema consumiera


recursos previniento, limitando, el uso del atime en los filesystems montados.

noatime al montar los filesystems ayuda muchísimo a evitar colas de escritura a disco y
en filesystems tipo ext3 realmente mejora el performance de sistemas con alta E/S
(accesos a disco) en un 30% o más.

ahora, todavía tenemos algunas opciones más que harán que los discos den lo mejor de
sí.

Uno de los parámetros que podemos variar en el kernel es la latencia al acceder a los
discos. Esto se hace variando las características del elevador de E/S del kernel.

Qué es el elevador?
El elevador es una cola en la que las peticiones de E/S son ordenadas en función de su
sector del disco. El objetivo de esta ordenamiento es optimizar las búsquedas en disco
(minimizándolas) con el fin de mejorar el desempeño del disco.

Casi todos los discos duros mejoran al disminuir las búsquedas en el disco. Además se
estima que también la vida útil de un disco sea mayor al no esforzarlo constantemente
con búsquedas de sectores.

Supongamos en nuestro sistema hay tres procesos A, B y C. Asumamos los tres


procesos hacen E/S en este orden:

tiempo |proceso sector accedido


-------|------- ---------------
0 |A 10
1 |B 14
2 |C 12
3 |A 11
4 |B 15
5 |C 13
Sin el elevador, el disco se movería de esta forma:

sector |10
| 11
| 12
| 13
| 14
| 15
|------------------------------------------
tiempo

Pero gracias al elevador que está presente en el sistema operativo linux, el disco se
mueve de la siguiente forma:

sector |10
| 11
| 12
| 13
| 14
| 15
|------------------------------------------
tiempo

Y no ocurre ninguna búsqueda (es decir, el disco no se mueve para alante y para atrás
constantemente escribiendo en sectores) por lo tanto la E/S a disco se completa de una
forma mucho más rápida.

Deficiencia (escasez) del elevador:

escasez en el elevador (elevator starvation) es el término que se usa en el mundo de los


sistemas operativos para el efecto que se produce debido a que el elevador, en su
funcionamiento, puede demorar una petición de E/S por un tiempo demasiado largo,
prácticamente infinito. Esto era lo que siempre sucedia en las versiones del kernel de
linux anteriores a la 2.4 (2.2 por ejemplo).

Asumamos que hay dos procesos A y B. El proceso A está escribiendo a disco


continuamente 2TeraBytes de datos comenzando desde el sector 0. Esta es la forma en
que la cola de E/S a disco se representa en linux debido a la acción del proceso A.
(asumamos por simplicidad que la cola contiene espacio solamente para 10 peticiones
de E/S, la parte izquierda de la cola es por donde el kernel toma los paquetes para
procesarlos)

sector |0 1 2 3 4 5 6 7 8 9
proceso |A A A A A A A A A A

Después de un tiempo, la cola lucirá así:

sector |100 101 102 103 104 105 106 107 108 109
proceso |A A A A A A A A A A

Así poquito a poco la cola se irá vaciando y llenando, saldrá por ejemplo el sector 100 y
entraría un nuevo proceso detrás del 109:
sector |101 102 103 104 105 106 107 108 109
proceso |A A A A A A A A A

Entonces en este punto el proceso B intenta leer un solo sector (solamente 512 bytes!)
en una posición del disco que está a 3TeraBytes de separación:

sector |101 102 103 104 105 106 107 108 109 6442450944
proceso |A A A A A A A A A B

Un tiempo después el controlador de E/S completa también la petición 101:

sector |102 103 104 105 106 107 108 109 6442450944
proceso |A A A A A A A A B

Por lo tanto una nueva petición llegará a la cola, será de A en este caso. Como A va
secuencialmente escribiendo, le tocará poner al 110 en cola. El viejo elevador (el
presente en las versiones del kernel 2.2 y anteriores) nota que 109 < 110 < 6442450944
y por lo tanto inserta la petición para escribir al 110 en el medio (delante de B que está
muy lejos):

sector |102 103 104 105 106 107 108 109 110 6442450944
proceso |A A A A A A A A A B

Entonces, al terminar la petición del sector 102 el sector 111 se encolará en orden:

sector |103 104 105 106 107 108 109 110 111 6442450944
proceso |A A A A A A A A A B

Como podemos ver, el elevador antiguo en las versiones de linux 2.2.x las peticiones
encoladas para el proceso B eran demoradas de forma indefiniday el proceso B se
detenia esperando por E/S completamente hasta que se completara A. Básicamente B
tendrá que esperar hasta que A termine de escribir 2TeraBytes de datos para poder leer
512Bytes del disco. Escribir 2TeraBytes de datos toma unas 29 horas si se hace a unos
20MB/s. Es por esto que linux no respondía bien ante altas peticiones de E/S.

El programador de E/S
Para superar esta dificultad del elevador de E/S, éste fué reescrito haciéndolo un
verdadero programador de E/S que obligue a cierta latencia de las peticiones que han
sido encoladas.

En el kernel 2.4.x cada petición de la cola de E/S se encola con un número de secuencia
del valor de la latencia permitida y éste se decrementa cada vez que se encola una nueva
petición. Este número de latencia es el máximo número de peticiones de E/S que podrán
procesarse antes que esta petición. Una vez llegado al mínimo valor, el kernel tiene la
obligación de procesarlo, evitando de esta forma que las peticiones sean demoradas por
otras más cercanas.

Ahora, durante la versión 2.4 del kernel este fue el scheduler que sirvió a satisfacción,
sin embargo, gracias a la gran comunidad de open source, muchas otras variantes
parecidas a este scheduler existen al momento.

El kernel de RHEL4 viene con 4 schedulers precompilados:


1. Completely Fair Queuing—elevator=cfq (este es el scheduler por defecto)
2. Deadline—elevator=deadline
3. NOOP—elevator=noop
4. Anticipatory—elevator=as

El scheduler por defecto, y el que realmente recomendamos si no se conoce es el CFQ

El scheduler CFQ (Completely Fair Queuing). Como su nombre lo implica trata de


distribuir el ancho de banda disponible para E/S de forma equitativa (fair) para todas las
peticiones E/S. CFQ es muy recomendado para sistemas medianos/grandes
multiprocesadores y para sistemas que requieren balancear la E/S entre diferentes bahías
o puertos de dispositivos de E/S

El Deadline usa un algoritmo de Fecha tope (deadline) para minimiza la latencia de E/S
(espera) para una determinada petición de e/s. El scheduler provee al sistema de un
comportamiento similar al de sistemas en tiempo real y usa una política de round robin
para intentar ser equitativo entre varias peticiones de e/s y para evitar deficiencias en el
scheduler. Prioriza las lecturas sobre las escrituras. Se considera que es muy bueno para
sistemas de Bases de datos.

NOOP es sencillamente un algoritmo FIFO en el que no se hace labor de optimización


de lecturas/escrituras a disco. Este algoritmo ahorra mucho costo de CPU que los otros
gastan en manejar las colas y demás complejidades sin embargo no realiza ninguna
optimización en disco. Es útil sin embargo para sistemas que tienen la seguridad de que
otros manejarán los accesos a disco, como por ejemplo arreglos externos de discos,
HBA o para discos de RAM (ramdisks).

Anticipatory introduce una demora en cada una de las E/S, con el objetivo de esperar a
ver si las siguientes solicitudes son contiguas y pueden disminuir las búsquedas
(desplazamientos) en el disco, con el objetivo de hacerlas más rápidas. Antiguamente
era el algoritmo por defecto, pero redhat ya lo dejó en favor del CFQ. Se considera que
es bueno para dispositivos lentos (discos antiguos), mantiene alta latencia pero ahorra
accesos a disco.

Escogiendo a un elevador para nuestro sistema

La descripción anterior nos debe haber dado una idea de cuál elevador usar, pero
realmente no hay nada como la práctica.

A mi entender el AS es el scheduler más similar al elevador anteriormente explicado


para las versiones del kernel 2.4. Sin embargo, para servidores que requieren de buen
desempeño está demostrado que no sirve. Indican varias fuentes (google) que el AS es
muy bueno para sistemas de desktop, de hecho ahora lo estoy usando y no noto mayor
diferencia en el arranque del sistema.

Si queremos hacer una apuesta segura, debemos dejar el scheduler por defecto, que es el
CFQ. Este sistema definitivamente está demostrando lograr un muy buen desempeño
para todo tipo de aplicaciones y es por mucho (300% aproximadamente) más rápido que
el AS para sistemas multiusuarios donde se requiere baja latencia.
El deadline es muy bueno para sistemas en tiempo real, pero no demuestra una gran
diferencia en contra del CFQ y sin embargo el comportamiento con arreglos externos
(HBA, NFS, etc) es pésimo por lo que no se recomienda en caso de que se usen estos
discos. Sin embargo se podría tomar como opción a analizar en caso de que nuestro
sistema sea de bases de datos puro.

El NOOP reduce en un 25% aproximadamente el consumo de procesador para manejar


E/S, sin embargo también baja en el desempeño de acceso a disco. Si usamos un sistema
que está requiriendo mucha CPU, podemos analizar el noop como alternativa para
mejorar el rendimiento de la CPU. Si usamos un sistema con arreglos externos de disco
que son los que se ocuparán de manejar los elevadores y demás detalles, podemos usar
el noop, pero como alternativa general para su uso normal, no lo recomendamos.

El definir qué scheduler usar no es una tarea de un momento, definitivamente si


queremos comprobar el performance de nuestro sistema debemos cambiar el scheduler a
usar y reiniciar la máquina, comprobar los datos de comportamiento del sistema y
volver a probar con otro scheduler, así durante un tiempo hasta determinar el mejor
scheduler para nuestro sistema.

Repetimos, no existe una receta fija para el uso de schedulers, depende más bien de qué
querramos hacer con nuestro sistema y sus características fisicas particulares así como
uso por parte de los usuarios.

Para cambiar el sheduler, podemos editar /boot/grub/menu.lst

y buscar una línea que dice así:


kernel /vmlinuz-2.6.9-11.EL ro root=LABEL=/ rhgb quiet
puede variar el número del kernel, no preocuparse, la idea es que comience con la
palabra kernel.

Al final de la línea agregar el scheduler de nuestra preferencia, por ejemplo:


kernel /vmlinuz-2.6.9-11.EL ro root=LABEL=/ rhgb quiet elevator=as

En este caso, al reiniciar nuestro sistema, éste levantará con el scheduler AS


(anticipatory).

Si queremos usar el CFQ podemos poner elevator=cfq o sencillamente dejar la línea sin
la variable elevator (como estaba originalmente):
kernel /vmlinuz-2.6.9-11.EL ro root=LABEL=/ rhgb quiet

Tarea:
hagámos unas pruebas cambiando los schedulers en el sistema. Para cada uno de ellos
midamos el impacto de la una utilería que siempre correremos (esto es un escenario
hipotético y la utilería es trivial)

time find / -name "*GPG*" -print|xargs grep prueba

El comando time sacará una estadística del tiempo consumido por el comando find

El comando time devuelve 3 valores:


real: Tiempo total (real) usado para ejecutarse un comando
user: Tiempo usado por el proceso del usuario (el proceso ejecutado)
sys: Tiempo usado por el kernel (sistema)

Para mi el más interesante es el real.

Veamos la tabla que logré en MI CASO:


real user sys
0AS
.
3
7
s
1
.
1
1
1
s
CFQ1m35.43s 1m38.61s 0.367s 1.099s
Deadline 1m43.24s 0.39s 1.156s
NOOP 1m40.06 0.37s 1.168s
Qué podemos extraer de esta tabla?

• El scheduler que menos demoró en esta pequeña prueba fué el AS, demoró unos
3 segundos menos en ejecutar este comando.
• Durante las pruebas, el deadline no respondió tan bien como esperaba,
comparativamente el cfq y el AS respondieron mejor cuando llamé a otros
procesos (firefox, thunderbird)
• El NOOP fué realmente demorado a los efectos de que cualquier acción que
tomé usando firefox y thunderbird demostraron real lentitud.
• Me pareció (impresión personal, no tengo datos reales) de que el AS hizo que la
máquina y las aplicaciones levantaran más rápidos.

En resumen, mi máquina es un desktop, la uso yo sólo para un número finito y


determinado de procesos trabaja mejor con AS, era de esperar pues reportan que el AS
es mucho mejor para máquinas desktop.

Sugiero que se hagan pruebas más exhaustivas a los efectos de manejar los schedulers
para determinar cuál es el adecuado para un servidor determinado.

hdparm

Muchos, muchísimos, seguimos teniendo y seguiremos usando discos IDE para manejar
nuestros servidores y máquinas de desktop.

Ahora veremos cómo hacer para optimizar un poco los accesos a nuestro disco duro.

Simple, las distribuciones de linux vienen por defecto sin hacer mucho esfuerzo en
optimizar los accesos a disco. Y la razón es muy lógica.. los discos son muy variados, y
es virtualmente imposible una receta mágica para que todos los discos den lo mejor de
sí.

Advertencia: Estos cambios pueden hacer que el disco duro deje de


funcionar. Es más, estos cambios pueden eventualmente echar a perder
la
información y hasta dañar totalmente al disco.

Aunque nunca he tenido ningun problema más que el de tener que reiniciar la máquina
porque el disco deje de responder al realizar las pruebas, nunca está de más advertir que
cualquier cambio que haga, lo debe hacer bajo su total responsabilidad

Suponiendo que nuestro disco esté en /dev/hda:


1- verifiquemos los parámetros actuales del disco:
hdparm /dev/hda

/dev/hda:

multcount = 16 (on)

I/O support = 0 (default 16-bit)

unmaskirq = 0 (off)

using_dma = 1 (on)

keepsettings = 0 (off)

nowerr = 0 (off)

readonly = 0 (off)

readahead = 8 (on)

geometry = 39704/16/63, sectors = 40021632, start = 0

Segundo, miremos y anotemos los parámetros de performance de nuestro disco antes de


hacer cuqlquier cambio:
hdparm -tT /dev/hda

aqui están los resultados de mi disco antes de optimizarlo:


Timing buffer-cache reads: 128 MB in 0.36 seconds =357.54 MB/sec

Timing buffered disk reads: 64 MB in 14.33 seconds = 4.47 MB/sec

Estos son los resultados después de optimizado:


Timing buffer-cache reads: 128 MB in 0.33 seconds =390.24 MB/sec

Timing buffered disk reads: 64 MB in 4.63 seconds = 13.82 MB/sec

Si ven, los parámetros que el hdparm mide, se han incrementado, en algunos caso unas
3 veces. (buffered disks reads)
Yo siempre me centro en varios parámetros de estos, por ejemplo el IO support está en
el valor por defecto de 16 bits.. cuando los discos mayormente soportan 32bits, PIOs,
etc. Esto hay que cambiarlo.

unmaskirq está desactivado, sin embargo permite enmascaras las IRQ para que
cualquier otro programa que esté usando la misma IRQ que el disco le dé posibilidad al
disco a usarla también. Sino, el disco como que se traba. Esto debemos activarlo.

using DMA, direct memory access. Si compramos discos con soporte para DMA cómo
no activarlo?

multicount: cuántos sectores se leen con un acceso del cabezal, normalmente aumenta el
performance en un 30%-50%

Ahora comencemos poquito a poco, si el disco deja de responder, lamentablemente hay


que apretar ese botoncito que dice reset:

hdparm -c3 -m16 /dev/hda

Aquí hemos activado 32bits así como multicount a 16.. el multicount lo podemos llevar
hasta 32 a veces.

Procedamos a probar de nuvo nuestro disco:

hdparm -tT /dev/hda

Supongo que hayan anotado previamente los datos del -tT anterior. Comparen y vean si
ha aumentado o no, si no ha aumentado, es que algún parámetro en vez de ayudar al
disco de ustedes, lo afectó.

En mi caso, esto casi dobló los accesos a discos.

Sigamos:

hdparm -X34 -d1 -u1 /dev/hda


/dev/hda:
setting unmaskirq to 1 (on)
setting using_dma to 1 (on)
HDIO_SET_DMA failed: Operation not permitted
setting xfermode to 34 (multiword DMA mode2)
unmaskirq = 1 (on)
using_dma = 0 (off)

En mi caso, no pude activar el DMA, posiblemente porque no lo tengo activado en el


BIOS, es de asegurarse que lo esté, el DMA sí ayuda muchísimo en los accesos. En mi
caso no puedo reiniciar la máquina pues es en la que todos compilamos los paquetes
pero por lo demás, activé unmaskirq y el modo de transferencia lo puse a multiword
DMA modo 2.

A mí personalmente no me mejoró, pero supongo que haya sido porque no pude activar
el DMA, pero si a ustedes le trabaja, mejor, mode2 es PIO2, si el disco de ustedes es
PIOotracosa entonces busquen el parámetro adecuado para mejorar los accesos.
A propósito, posiblemente los discos de muchos hayan dejado de funcionar, porque no
soporta X34 , prueben con:

hdparm -X66 -d1 -u1 -m16 -c3 /dev/hda

Al final de las pruebas, ya muchos tendrán idea de qué parámetros les sirven y cuáles
no, los que les sirvan, los pueden unir en una sola llamada al hdparm y ponerlo en
/etc/rc.d/rc.local para que se ejecute cada vez que linux comience.

Espero les ayude a mejorar un poquito los accesos a discos. Recuerden, el mayor cuello
de botella ahora, son los accesos por el bus de datos a los dispositivos mecánicos, discos
por ejemplo, por lo tanto no hacemos nada con tener una super máquina con 5Ghz de
velocidad, 10 procesadores y un disco mal optimizado

tar
La forma más común de hacer respaldos, ya sea a cinta o a disco o a cualquier medio de
almacenamiento, está siendo el comando tar. En realidad es un comando antiguo,
probado, realmente casi siempre funciona para hacer respaldos.

tar permite realizar copias exactas, manteniento intactos los permisos y características
de los archivos. tar devuelve un archivo que contendrá a su vez toda la información del
directorio o conjunto de directorios que hayamos respaldado. tar devuelve un sólo
archivo por la simple razón de que se usaba y se usa para escribir en cinta. Como las
unidades de cinta no mantienen un filesystem, se hace un poco complicado el almacenar
archivos y directorios pues estos tendrían que conocerse de antemano dónde estarían
localizados, etc.

El tar se ocupa de guardar el orden y posición exacto de cada uno de los archivos y
directorios almacenados en este archivo.tar que creamos y por lo tanto podríamos
fácilmente extraer este archivo y tomar de ahi el orden en que fueron almacenados.

el tar es muy fácil de usar, de hecho yo al inicio hasta comprender su funcionamiento lo


memoricé directamente los dos comandos más importantes. Antes veamos algunos
switches que podemos usar con el tar:

• v - La v siempre viene de verbose (ser hablador), permite que el tar hable


bastante sobre lo que está haciendo
• f - indica el archivo tar que vamos a crear o a extraer
• c - create, crear un archivo (c o x, no ambas)
• x - eXtract, extraer un archivo (c o x, no ambas)
• z - comprimir el tar que estamos creando con gzip (z o j, no ambas)
• j - comprimir el tar que estamos creando con bzip2 (z o j, no ambas)

Ejemplos del tar para crear un archivo:


tar -cf /root/etc.tar /etc
Esto es, crea (c) un archivo .tar hacia (f) /root/etc.tar con todos los contenidos del
directorio /etc, el tar actuará calladito pues no tenemos el v puesto.

Este tar quedará del mismo tamaño prácticamente que el directorio /etc, pues no lo
hemos comprimido sólo lo creamos (c) hacia un archivo (f) llamado /root/etc.tar
Cómo hacer para crear un archivo comprimido? Tenemos dos opciones, la j y la z
(bzip2: j, gzip:z):
tar -zcvf /root/etcyvar.tar.gz /etc /var
Qué hicimos aquí: Creamos un tar (c) comprimido (z) con gzip, le pedimos al tar que
hablara (v, verbose) lo que fuera realizando y que el archivo creado (f) lo pusiera en
/root/etcyvar.tar.gz, también le indicamos DOS directorios a poner dentro del tar (/etc
y /var). Esto creará un sólo archivo (root/etcyvar.tar.gz) conteniendo ambos directorios
(/etc y /var).

Cómo extraer los contenidos de tar? Simple:


tar -zxvf /root/etcyvar.tar.gz
Este comando extraerá (x) un archivo tar comprimido con gzip (z), le pedirá al tar que
hable bastante (v) y el archivo desde donde procederá a extraer (f) es /root/etcyvar.tar.gz

Al extraer, el tar no respeta el /, es decir, el tar ignora, por seguridad ese / de etc y var, a
fin de que no sobreescriba nuestro propio /etc y /var, el tar al extraer extraerá pensando
que el lugar donde procederá a extraer los contenidos es el directorio donde estemos
parado. Así podemos recuperar respaldos hacia cualquier directorio y decidir con calma
qué hacer con lo que hemos recuperado.

Cómo podemos recuperar una parte de lo que guardamos en tar? A veces tenemos un
archivo tar muy muy grande, de digamos 50GB, y sólo queremos recuperar el archivo
/etc/passwd por ejemplo de dentro de todo ese archivote. Cómo podemos hacer para
recupear un archivo que sabemos dónde está? Le indicamos precisamente el directorio y
nombre de archivo a recuperar, pensemos en el archivo etcyvar.tar.gz que creamos
anteriormente:

tar -zxvf etcyvar.tar.gz etc/passwdLe hemos indicado que queremos extraer (x)
información comprimida (z) en un archivo tar (f) llamado etcyvar.tar.gz y que lo que
queremos extraer es un archivo llamado passwd que está dentro de etc (etc/passwd)
fíjense que quité el / del etc, porque el tar no guarda / por seguridad, así al extraer algo
no tenemos que preocuparnos que nos sobreescriba archivos o directorios de dentro de
la raíz.

Lo mismo aplica si queremos extraer un directorio entero:


tar -zxvf etcyvar.tar.gz etc/
extraería TODOS los contenidos del directorio etc, pero no extraería los de var
(recuerden que este etcyvar.tar.gz yo lo creé con los contenidos de /etc y /ver).

Cómo hacemos para guardar los contenidos en una cinta?

La cinta es un dispositivo de bloques de e/s que como ya dijimos no tiene formato


específicamente, lo que hace que tengamos que referirnos a ella sin montarla, es decir,
hablar directamente con el dispositivo.

La cinta se atiende mediante dos posibles dispositivos:


/dev/st0 es el que recomiendo que siempre se use, este dispositivo permite leer y
escribir en la cinta, pero además al terminar de leer/escribir, este dispositivo rebobina la
cinta hacia el inicio.

/dev/nst0 este no lo recomiendo, pero en todo caso, hace lo mismo que /dev/st0 sólo
que no rebobina la cinta al terminar. Esto con el fin de que el que quiera complicarse la
vida pueda tener varios archivos tar en una misma cinta.

Entonces para escribir un tar hacia una cinta, nos aseguramos que tenemos un
dispositivo de cinta instalado en nuestro servidor linux así como que tenemos una cinta
puesta en el dispositivo y ponemos:
tar -cvf /dev/st0 /etc /var

Esto creará un tar (c) e indicará al tar que hable (v) hacia el dispositivo (f) /dev/st0 y en
ese tar incluirá /etc y /var, ya tenemos una forma de hacer respaldos!

Y por qué no comprimo? Bueno, no soy un experto en cintas, pero la enorme mayoría
de las cintas tienen sistemas de compresión de datos al vuelo incluidos en su hardware.
Esto es, nosotros le pasaremos el tar sin comprimir (sin z ni j) a la cinta (/dev/st0) y el
sistema de la cinta se ocupará de comprimir estos datos. Así logramos no gastar tiempo
realizando la compresión nosotros (gastando ciclos de cpu) y le pasamos ese trabajo a la
cinta que lo hará transparentemente.

Si nuestra cinta no realizara compresión al vuelo, entonces no está de más el ponerle z


al comando tar para de una vez comprimir nosotros y que la cinta así mismo guarde los
datos.

Comparando bzip2 con gzip nuevamente:

Analicemos ahora el nivel de compresión de /etc con bz2 y con gz:


[root@eperez ~]# tar -zcf etc.tar.gz /etc
[root@eperez ~]# tar -jcf etc.tar.bz2 /etc
[root@eperez ~]# ll etc*
-rw-r--r-- 1 root root 4828393 Aug 19 11:00 etc.tar.bz2
-rw-r--r-- 1 root root 6731130 Aug 19 10:58 etc.tar.gz
En este caso, /etc es un directorio lleno de archivos de texto mayormente, por lo que
bzip2 tiene muchas más opciones para comprimir, como podemos ver, bzip2 comprimió
a unos 4.8MB mientras gzip sólo logró 6.7MB de compresión.

En resumen realizando comparaciones, el bzip2 es bueno para grandes cantidades de


información de texto pero es muy lento, mientras que gzip es muy rápido y actúa muy
bien para bajos niveles de compresión.

star

Ahora, el comando tar tiene ciertas dificultades ya probadas por nosotros. Y es que al
realizar respaldos muy grandes, tiende a dejar de responder y a veces hasta nos echó la
máquina al piso.

Cuando decimos respaldos muy grandes, estamos hablando de aproximadamente 50 GB


en información sumamente fraccionada (mayormente compuesta por archivos menores
a 5kb) que hay que respaldar en una máquina intel dual Xeon con 2.4GHz de velocidad
y 6GB de memoria así como un arreglo de discos SCSI de 570GB.

Por eso aquí veremos otro comando más moderno llamado star.

Definitivamente hemos comprobado que es un gran porcentaje (posiblemente 25% más


rápido) que el antiguo tar. Y el star es más eficiente en el manejo de memoria y
procesador por lo que los problemas en máquinas que demoraban un mundo o fallaban
haciendo un respaldo con tar los hemos logrado controlar usando star sin mayor
complicación.

Al momento la utilidad star es la más rápida conocida que imita al tar. Se ha


comprobado que puede trabajar a velocidades superiores a 14mbit/s y que ofrece una
tecnolocía de doble buffering que mantiene la unidad de cinta alimentada con datos
constantemente.

El star comenzó a implementarse por el año 1982 y sigue siendo un trabajo en


progreso. Es muy eficiente además con respaldos mayores a 1GB y es capaz de manejar
una enorme cantidad de archivos (inodos) sin mayor uso de memoria (este es un grave
problema del tar cuando hablamos de millones de archivos, tiende a crear grandes zonas
de memoria con todo el árbol de directorio y eventualmente la máquina puede colapsar).

El star tiene cierta compatibilidad con el tar, es capaz de abrir archivos hechos en tar.

Definitivamente por todas estas razones y muchas más, aqui pondremos el


procedimiento para usar el star.

Primero verificar que tengan el comando star en la máquina, en redhat y clones de


redhat, está en un paquete aparte que se llama star, buscar este rpm e instalarlo si es que
no está instalado ya en el sistema. Este paquete no sobreescribe al tar, siguen siendo dos
comandos apartes e independientes.

Seguidamente, hagamos el respaldo, comencemos con el más simple:

star -cv f=/dev/st0 /etc /varCon este comando haríamos un respaldo (c) siendo
hablador (v) hacia el dispositivo (f) de cinta (/dev/st0).

Si queremos comprimirlo usaremos además la z:

star -zcv f=/dev/st0 /etc /var


Esto lo comprimiría con gzip. No conocemos de compresión vía bzip2 de forma directa.
Es decir, el star no sabe usar bzip2 para comprimir.

Si queremos usar un archivo en vez de cinta pondríamos:

star -cv f=/backup/respaldo.tar /etc /var


y listo, crearía (c) el tar en un archivo (f) llamado /backup/respaldo.tar dentro de un
directorio. No lo crearía comprimido (no usamos z).abrirían (x) todos los contenidos de
la cinta (f).

Si deseamos solamente un directorio o archivo en específico, se lo hacemos saber con el


nombre al lado, sin / inicial:

star -xv f=/dev/st0 etc/passwd


este sacaría sólo /etc/passwd y nada más de todo el respaldo, lo que me permitiría
recuperar cierto archivo si conozco su nombre o directorio.

Definitivamente consideramos por la capacidad que puede trabajar el star, que este es el
recomendado para manejar grandes cantidades de archivos dispersos o respaldos
mayores a 1GB, es mucho más rápido en estas circunstancias y seguro les dará menos
problemas de performance.

Realizar respaldos es una de las tareas más penosas de preparar y una de las pocas
consideradas por los administradores. Por qué decimos esto? Porque pocos
administradores se preocupan por mantener respaldos actualizados de sus sistemas, y
menos aún se ocupan de revisar si los respaldos funcionan, y a la hora de la verdad,
cuando el sistema deja de responder, ahi vienen las quejas y los lamentos.

Es por esto que una de las primeras tareas que todo administrador debe realizar es
precisamente preparar algún tipo de sistema de respaldos, de ser posibles automáticos.

Los respaldos son la última línea de defensa en la seguridad, en el tema de seguridad


debemos ser bastantes repetitivos y verán durante el curso como tomamos muchas
precauciones sobre cómo seguir asegurando nuestro sistema, esto por el hecho de que
nunca hay seguridad de más y la seguridad es en capas.

Los respaldos en realidad se usarán cuando las otras medidas de seguridad hayan
fallado, cuando ya no nos quede más que volver a empezar desde cero y comenzar a
reponer datos de nuestros respaldos.

Los respaldos también sirven para ayudar cuando un usuario o cliente de nuestro
servidor ha perdido algún dato valioso y desea que le busquemos en los respaldos una
copia anterior de este.

Pasos para realizar los respaldos:

• El primer paso para realizar los respaldos es definir hacia dónde se escribirán:

1. Hacia otro disco: Es una forma rápida y fácil, tiene de bueno el que podemos
recuperar un respaldo sin tener que perder mucho tiempo pues el disco está
puesto en la misma máquina o en una máquina contigua. Tiene de inconveniente
que cuando el sistema se daña, existe la posibilidad de que también se dañe ese
disco.
2. Hacia una unidad de cinta: Es el proceso más recomendado para empresas
serias y tiene de inconveniente que las cintas son un poco lentas tanto para
respaldar como para recuperar además que de vez en cuando hay que revisar que
estén guardando correctamente la información pues tienden a dañarse.
3. Hacia un CD: Tiene de inconveniente que posteriormente al respaldo hacia un
directorio en el disco, hay que preparar un iso con mkisofs y quemar ese ISO
con cdrecord. Pero es una variante factible.

• El segundo paso será definir cada cuánto tiempo realizaremos los respaldos.

Esto dependerá mucho de las políticas de la empresa donde trabajemos y del tiempo que
demoran los respaldos. Hay muchas empresas que realizan respaldos diarios y guardan
copias de al menos 7 o 15 días de los respaldos, para poder buscar información.

Otras empresas no pueden realizar respaldos diarios pues estos demoran mucho tiempo
(digamos 12 horas) y consumiría muchos recursos el realizar respaldos cada día. Es por
tanto que algunas empresas prefieren realizar respaldos semanales o aún quincenales o
mensuales. Estos dos últimos se realizan sobre todo cuando el sistema no cambia en
mucho tiempo.

Algunos sistemas son sencillamente inmutables en el tiempo, esto es, una vez instalados
no reciben ni guardan en disco información que cambie en el tiempo, por lo que crear
una sóla vez un respaldo con la configuración del sistema normalmente es suficiente
para ellos. Estos sistemas son mayormente sistemas de firewall o proxy que no varían
sus datos de configuración ni de uso durante el tiempo y que en caso de una rotura que
requiera de restablecer un respaldo, sólo con la configuración del sistema nos bastaría.

• El tercer paso sería definir qué directorios y archivos deseamos respaldar.

Esto depende mucho del tipo de sistema que estamos trabajando. Como ejemplo
tabularemos diferentes tipos de sistemas y qué consideramos apropiado respaldas.

Hemos de advertir que esto no debe tomarse como una receta, y si ustedes o su
empresa tienen otras políticas o requieren de otros sistemas a respaldarse, deben
respaldarlos de la forma más conveniente a sus necesidades.
Tipo de sistema Qué sugerimos respaldar?

Mailserver /etc
/var/spool
/var/log
/home
/root
Proxy y/o firewall /etc

Web server /etc


/var/www
/home
/root
BD /etc

/home
/directoriodelaBD
dump (vaciado) de las BD
Tipo de sistema Qué sugerimos respaldar?

Mailserver /etc
/var/spool
/var/log
/home
/root
Proxy y/o firewall /etc

DNS /etc

/home
/var/named

En linux normalmente no se respaldan los binarios, si nos fijamos en la tabla anterior,


siempre hemos escogido los directorios donde se conservan datos valiosos e
irrecuperables para nuestra empresa. Los binarios y librerías del sistema siempre se
reinstalan al reinstalar el sistema, por lo tanto son recuperables, pero no son
recuperables sin un respaldo datos tales como nombres de usuarios, páginas web, bases
de datos, en fin, todo tipo de información específica para nuestra empresa que no está
presente en un sistema linux por defecto.

Si nos fijamos bien uno de los directorios que siempre está presente es /etc, pues es aquí
donde siempre se almacenan las claves y datos esenciales de configuración del sistema
y siempre, a ojos cerrados, debemos siempre incluir /etc en nuestros respaldos para
mantener una copia de toda la info esencial del sistema. Otro directorio que nunca
olvido respaldar, así sea necesario o no, es /home, para mantener de una vez los
directorios de los usuarios ya sean miles o sean unos 2 o 3.. así poder realizar una
recuperación rápida sin tener que crear estos directorios.

• Definir cómo respaldar

Es algo más que importante y es qué utilería usaremos para respaldar, cualquiera de las
dos anteriormente descritas (tar y star) son buenas, igual si tenemos la oportunidad o el
interés podemos echar a andar el rsync que permite sincronizar directorios entre dos
servidores.

Una forma cómoda sería por ejemplo respaldar a otro directorio usando tar:
tar -zcf /otrodiscomontadoaqui/respaldo.tar.gz /etc /home /var/spool
/var/log

Este ejemplo realizaría un respaldo en un disco montado en un directorio (llamado en


nuestro caso: /otrodiscomontadoaqui) de los directorios /etc /home /var/spool y /var/log

Al hacer respaldos no debemos usar v porque puede resultar una cantidad de


información tediosa de leer, confusa y puede conducir a que no notemos diferentes
advertencias que el tar nos quiera comunicar.

• Verificar respaldos
Una vez finalizado de realizar los respaldos debemos verificar que estos se estén
creando correctamente. La forma más usual que tengo de hacerlo es probando que esté
correctamente comprimido o guardado el respaldo (usando -t en el gzip o abriendo
totalmente el respaldo) y sobre todo verificando que todos los contenidos de nuestros
directorios respaldados estén intactos.

Para eso básicamente abro el paquete y verifico todo.

Esta labor debe realizarse de vez en cuando. Siempre es bueno al realizar respalos,
realizar comprobaciones de restauraciones (restores) de vez en cuando para estar
seguros de que nada ha afectado la política de realización de respaldos y poder
reaccionar prontamente ante una falla por algún cambio en el sistema.

Cómo realizar una recuperación?

Supongamos pasó lo peor de lo peor y tenemos que reinstalar el sistema. Cómo


recuperamos los respaldos?

Aquí algunos pasos comunes a seguir para recuperar la información:

1. Tratar antes de reinstalar de guardar una imagen de nuestro sistema dañado


actual, esto lo podemos hacer con dd posiblemente o con un tar. Básicamente
con esto logramos guardar el estado actual del sistema para posterior análisis y
hasta logramos tener un respaldo del ultimo instante en que el sistema estuvo
funcionando.
2. Reinstalar normalmente el sistema linux, asegurarlo, optimizarlo, actualizarlo y
realizar todas las tareas previas e inmediatas posteriores a una instalación. Por
supuesto la instalación debe incluir todos los paquetes que nosotros sabemos
requeriremos para nuestro trabajo normal con el sistema.
3. Traer de otro disco o de la cinta o del CDrom los tar con los respaldos
4. Abrir estos respaldos hacia un directorio temporal (normalmente los abro en
/home/tmp o en /root/tmp, en la partición que tenga más espacio), para esto me
cambio primero al directorio donde abriré los respaldos (cd /home/tmp por
ejemplo) y después los abro para tenerlos todos ahi.
5. Los directorios: /home, /var/spool y /var/www normalmente se pueden copiar
hacia sus destinos de forma inmediata. Es decir, una vez abiertos en
/home/tmp/var/spool, podemos por ejemplo:
cp -a /home/tmp/var/spool/* /var/spool/
6. pues estos directorios no afectan en nada el funcionamiento actual de nuestro
nuevo sistema.
7. Del directorio /etc solamente sugiero que trabajemos con /etc/passwd,
/etc/shadow y /etc/group. Por supuesto si queremos la copia antigua de nuestro
servidor web, trabajaríamos con el directorio de configuración web (/etc/httpd/)
y lo mismo con cada demonio que requiramos (/etc/squid para el squid,
/etc/named* para el named). La idea con /etc es solamente tomar del directorio
recuperado los archivos que necesitemos y de ser posible no sobreescribamos los
archivos recién instalados sino que los unamos o manualmente editemos ( El etc
recuperado deberá estar en /home/tmp/etc pues recuerden siempre nos debemos
cambiar al directorio /home/tmp para abrir los respaldos)
8. Recuperar y poner en su lugar todos los archivos que necesitemos según el caso.
La recuperación en linux es un proceso que no es difícil, aquí no trabajamos con
registros ni ningún tipo de información complicada, sino que sencillamente trabajamos
con archivos de texto los cuales son muy fáciles de reemplazar o de editar para agregar
la nueva información.

Por ejemplo para recuperar los usuarios lo que yo hago es:


editar el archivo passwd que estará en /home/tmp/etc y borrar todos los usuarios
privilegiados (esos que el UID sea menor a 500), de forma tal que quedará un archivo
passwd solamente con los usuarios propios de mi empresa (los que hemos creado y su
UID es igual o mayor que 500). Una vez guardado ese passwd podemos proceder a
unirlo:
cat /home/tmp/etc/passwd >> /etc/passwd

Aquí lo que habremos hecho será agregar (>>) al archivo /etc/passwd los contenidos
de /home/tmp/etc/passwd, que es el archivo al que hemos eliminado los usuarios
privilegiados (esos ya están presentes en /etc/passwd al instalarlo nuevo) y de esta
forma nos queda original y adaptado a nuestro sistema.

Lo mismo debemos hacer con group y con shadow (eliminar los usuarios propios del
sistema y solamente dejar los usuarios que hemos creado nosotros, los usuarios con UID
mayor de 500)

Y listo! ya pasamos el problema mayor, ahora por supuesto pasaremos por algunos
otros problemas pues siempre ocurren al realizar una recuperación, lo normal es que se
nos olvide instalar algún paquete que sí usábamos antes, o que se nos olvide activar o
reconfigurar algún servicio, poco a poco, con el transcurso de los minutos nos iremos
dando cuenta, gracias a nuestras propias averiguaciones o a los usuarios mismos que
vendrán a quejarse.

Un detalle a considerar, siempre es importante que antes de sobreescribir un archivo de


los recién instalados (por ejemplo /etc/passwd o /etc/group o cualquier otro) realizar una
copia de seguridad de este, lo hago copiando el archivo con la extensión .bak:
cp /etc/passwd /etc/passwd.bak

Así, si algo fallara en nuestro nuevo sistema, podemos al menos recuperar


el archivo original que recién habíamos instalado y proceder a tomar otra
variante para reconfigurarlo.

Tareas automáticas
En Linux, las tareas pueden configurarse para que se ejecuten de forma automática en
un período de tiempo concreto y en las fechas indicadas. El sistema Red Hat Linux se
distribuye preconfigurado para ejecutar determinadas tareas del sistema de modo que el
sistema se mantenga actualizado. Por ejemplo, la base de datos slocate se actualiza
diariamente. Un administrador del sistema puede utilizar las tareas automáticas para
realizar copias de seguridad periódicas, controlar el sistema y ejecutar scripts
personalizados, entre otras tareas.
Red Hat Linux contiene cuatro utilidades de tareas automáticas: cron, anacron, at y
batch.

De estas 4 tareas, realmente preferimos y usamos el comando cron por sobre las demás,
lo que no resta importancia a estas.

Cron
Cron es un demonio que sirve para ejecutar tareas programadas según una combinación
de la hora, día del mes, mes, día de la semana y semana.

Cron asume que el sistema está activo de forma continua. Si el sistema no está activo
cuando está programada una tarea, Cron no se ejecuta.

Configuración de una tarea Cron

El fichero de configuración principal de cron, /etc/crontab, contiene las líneas


siguientes:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

Las primeras cuatro líneas son variables que se usan para configurar el entorno en el que
se ejecutan las tareas cron. El valor de la variable SHELL indica al sistema el entorno de
shell que deberá utilizarse (en este ejemplo, el shell de bash) y la variable PATH define la
ruta usada para ejecutar los comandos. El resultado de las tareas cron se envía por
correo electrónico al nombre de usuario definido con la variable MAILTO. Si la variable
MAILTO se define como una cadena vacía (MAILTO=""), no se enviará correo electrónico.
La variable HOME puede utilizarse para establecer el directorio principal que deberá
usarse al ejecutar los comandos o scripts. Sugerimos no tocar ninguna de estas variables
si no se sabe darle un objetivo preciso o si no le es indicado por algún instalador o
programa.

Cada línea del fichero /etc/crontab tiene el formato siguiente:

minute hour day month dayofweek command

• minute — número entero entre 0 y 59


• hour — número entero entre 0 y 23
• day — número entero entre 1 y 31 (debe ser un día válido si se especifica un
mes)
• month — número entero entre 1 y 12 (o nombre corto del mes, por ejemplo, ene,
feb, etc.)
• dayofweek — número entero entre 0 y 7, donde 0 o 7 corresponde a Domingo
(o el nombre corto del día de la semana, por ejemplo, dom, lun, etc.)
• command — el comando a ejecutar (el comando puede ser uno tal como ls
/proc >> /tmp/proc o el comando para ejecutar un script personalizado que
usted haya escrito.)

En cualquiera de los valores antes indicados, se puede utilizar un asterisco (*) para
especificar todos los valores válidos. Por ejemplo, un asterisco para el valor de mes
significa que el comando se ejecutará cada mes dentro de las limitaciones del resto de
los valores.

Un guión (-) entre los números enteros indica un intervalo de números enteros. Por
ejemplo, 1-4 significa los números enteros 1, 2, 3 y 4.

Una lista de valores separados por comas (,) especifica una lista. Por ejemplo, 3, 4, 6,
8 indica esos cuatro números enteros.

La barra (/) puede utilizarse para especificar valores de pasos. El valor de un número
entero se puede omitir dentro de un intervalo si se indica a continuación del intervalo lo
siguiente /<número entero>. Por ejemplo, 0-59/2 puede usarse para definir el resto de
los minutos del campo minuto. Los valores de pasos también pueden utilizarse con un
asterisco. Por ejemplo, el valor */3 puede usarse en el campo de mes para omitir el
tercer mes.

Las líneas que empiezan por almohadilla (#) son comentarios y no se procesan.

Como podrá observar en el archivo /etc/crontab, usa el script run-parts para


ejecutar los scripts en los directorios /etc/cron.hourly, /etc/cron.daily,
/etc/cron.weekly, y /etc/cron.monthly cada hora, diariamente, semanalmente o
mensualmente, respectivamente. Los ficheros de estos directorios deben ser scripts de
shell.

Si las tareas cron deben ejecutarse según una programación distinta a la hora, día,
semana o mes, esto puede agregarse en el directorio /etc/cron.d. Todos los ficheros
de este directorio utilizan la misma sintaxis que /etc/crontab. Remítase al Ejemplo
para más ejemplos.

# record the memory usage of the system every monday


# at 3:30AM in the file /tmp/meminfo
30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
# run custom script the first day of every month at 4:10AM
10 4 1 * * /root/scripts/backup.sh

Ejemplos de Crontab

Los usuarios no root pueden configurar las tareas cron tasks con la utilidad crontab.
Todos los crontabs definidos por el usuario se almacenan en el directorio
/var/spool/cron y se ejecutan utilizando los nombres de los usuarios que los han
creado. Para crear un crontab como un usuario, inicie la sesión como ese usuario y
escriba el comando crontab -e para modificar el crontab del usuario con el editor
especificado por la variable de entorno VISUAL o EDITOR. El fichero usa el mismo
formato que /etc/crontab. Cuando se guardan los cambios en crontab, el crontab se
almacena según el nombre de usuario, y se escribe en el fichero
/var/spool/cron/username.

El demonio cron controla el fichero etc/crontab, el directorio etc/cron.d/ y el


directorio /var/spool/cron cada minuto para cada cambio. Si se encuentra algún
cambio, estos se descargan en la memoria. De este modo, el demonio no necesita ser
reiniciado si se cambia un fichero crontab.

Control de acceso a Cron

Los ficheros /etc/cron.allow y /etc/cron.deny se usan para restringir el acceso a


cron. El formato de los dos ficheros de acceso es un nombre de usuario en cada línea.
No está permitido espacio en blanco en ninguno de los ficheros. El demonio cron
(crond) no tiene que ser reiniciado si los ficheros de control de acceso se modifican.
Los ficheros de control de acceso se leen cada vez que el usuario intenta añadir o borrar
una tarea cron.

El usuario root puede utilizar siempre cron, sin prestar atención a los nombres de
usuarios listados en los ficheros de control de acceso.

Si existe el fichero cron.allow, tan sólo se permitirá a los usuarios presentes en la lista
utilizar cron y el fichero cron.deny se ignorará.

Si cron.allow no existe, todos los usuarios listados en cron.deny no se les permite


usar cron.

Iniciar y finalizar el servicio

Para iniciar el servicio cron, use el comando /sbin/service crond start. Para parar
el servicio, use el comando /sbin/service crond stop. Se le recomienda que inicie
el servicio en el tiempo de arranque. Remítase a la sección de arranque y parada para
más detalles sobre cómo iniciar el servicio cron automáticamente al arrancar el sistema.

¿Qué es Anacron?

Anacron es un programador de tareas periódicas. Este ejecuta comandos en diferentes


intervalos especificados en días. Al contrario de cron, anacron no asume que el sistema
está ejecutándose continuamente, por lo tanto puede ser usado para controlar la
ejecución de tareas diarias, semanales o mensuales, en realidad puede ser usado para
ejecutar tareas durante cualquier periodo cuya unidad mínima sea el día, es decir,
anacron no puede detallar los periodos de ejecución por horas o minutos, sino que su
mínima unidad es el día.

Cada vez que se ejecuta al Anacron, este lee la el archivo de configuración que
especifíca qué trabajos anacron controla y su periodo en días. Si un trabajo no fue
ejecutado en los últimos n días, donde n es el periodo de ejecución del trabajo, entonces
anacron lo ejecuta y guarda un histórico de cuándo fué la última vez que se ejecutó, de
esta forma concerá cuándo ejecutarlo de nuevo. Cuando los comandos a ejecutar
terminan, anacron sale. Es decir Anacron no se queda en memoria.

¿Qué utilidad puede tener el Anacron?

Como hemos estudiado anteriormente, la mayoría de los sistemas Un*x (linux incluido)
tienen formas de prograr la ejecución de tareas que llevan a cabo diferentes trabajos de
mantenimiento como rotación de logs, actualizando la BD del locate, etc. Estos scripts
se manejan normalmente como trabajos que se ejecutarán entre la 1AM y las 7AM. Los
Scripts semanales se manejan para ejecutarse los Domingos. En máquinas que están
apagadas durante las horas de madrugada y/o los fines de semana estos scripts
escasamente corren.

Anacron resuelve este problema. Estos trabajos simplemente serán programados como
trabajos de anacron con periodos de 1, 7 y 30 días, de forma tal que cuando se encienda
la máquina, un tiempo después ellos se ejecuten.

Anacron intenta ser una ayuda sobre todo para usuarios de laptop y para personas que
sólo encienden su computadora unas horas al día.

¿Qué no es Anacron?

No es un intento de hacer algo redundante al cron. No puede ser usado para programar
tareas a intervalos menores a un día. Además tampoco garantiza que un comando se
ejecutará en una hora o día en específico. Anacron hará lo mejor posible para ejecutar
un comando que le hayan indicado pero no podremos precisar una hora o día exacto.

Anacron tampoco es un demonio a tiempo completo, esto es, una vez ejecutado, él
terminará. Anacron se debe ejecutar desde algún script de inicio o mediante tareas
programadas del cron, pues no está permanentemente levantado.

Configuración de las tareas de Anacron

Las tareas Anacron están incluidas en el fichero de configuración /etc/anacrontab.


Cada línea del fichero de configuración corresponde a una tarea y tiene el formato
siguiente:

• period delay job-identifier commandperiod — frecuencia (en


días) con la que se ejecuta el comando
• delay — tiempo de retraso en minutos
• job-identifier — descripción de las tareas, usados en los mensajes Anacron
y como el nombre del identificador de la estampilla del proceso, puede contener
cualquier caracter no en blanco (excepto barras oblicuas)
• command — comando que debe ejecutarse
Por cada tarea, Anacron determina si la tarea ha sido ejecutada dentro del período
especificado en el campo period del archivo de configuración. Si no se ha ejecutado
dentro de ese período, Anacron ejecutará el comando especificado en el campo command
después de esperar la cantidad de tiempo especificado en el campo delay.

Una vez finalizada la tarea, Anacron registra la fecha en el fichero de marca de fecha
que se encuentra en el directorio /var/spool/anacron. Sólo se utiliza la fecha (no la
hora), y se usa el valor de job- identifier como nombre de fichero del fichero de
marca de hora.

Las variables de entorno, como SHELL y PATH , pueden definirse en la parte superior de
/etc/anacron, de forma similar al fichero de configuración de cron.

El aspecto del fichero de configuración por defecto es similar a como se indica a


continuación:

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# These entries are useful for a Red Hat Linux system.


1 5 cron.daily run-parts /etc/cron.daily
7 10 cron.weekly run-parts /etc/cron.weekly
30 15 cron.monthly run-parts /etc/cron.monthly

Figura. Anacrontab por defecto

Tal como puede ver en la Figura, anacron para Red Hat Linux se configura de modo que
queda garantizada la ejecución diaria, semanal y mensual de las tareas cron.

Iniciar y finalizar el servicio

Para arrancar el servicio anacron, use el comando /sbin/service anacron start.


Para detener el servicio, use el comando /sbin/service anacron stop. Se
recomienda arrancar el servicio en el momento del arranque. Remítase a la sección de
arranque y parada para más detalles sobre el inicio del servicio anacron de manera
automática al momento de arranque.

Mientras que cron y anacron se usan para programar tareas, el comando at se usa para
programar una única tarea en un tiempo específico. El comando batch se usa para
programar que se ejecute una sóla tarea cuando la carga del sistema sea menor a 0.8 (ver
top).

Realmente at no me causa mayor impresión, porque sólo permite ejecutar un comando


una vez, el cron puede hacer algo parecido más cómodamente.
Configuración de tareas

Para programar una tarea no repetitiva en un tiempo específico, escriba el comando at


time, en el que time es el tiempo para ejecutar el comando.

El argumento time puede ser uno de los siguientes:

• formato HH:MM — Por ejemplo,04:00 especifica 4:00AM. Si se inserta el


tiempo, se ejecuta en el tiempo específico el día después.
• midnight — Especifica 12:00AM.
• noon — Especifica 12:00PM.
• teatime — Especifica 4:00PM.
• formato del nombre-mes, día y año — Por ejemplo, Enero 15 del año 2002. El
año es opcional.
• formato MMDDYY, MM/DD/YY, o MM.DD.YY — Por ejemplo, 011502 para
el día 15 de Enero del año 2002.
• now + tiempo — el tiempo está en minutos, horas, días o semanas. Por ejemplo,
ahora + 5 days, especifica que el comando debería ser ejecutado a la misma hora
en 5 días.

La hora debe ser especificada en primer lugar, seguido por la fecha opcional. Para más
información sobre el formato del tiempo, lea el fichero del texto /usr/share/doc/at-
<version>/timespec.

Tras haber escrito el comando at con el argumento del tiempo, el prompt at> será
visualizado. Escriba el comando a ejecutar, pulse [Intro] y escriba Ctrl-D. Se puede
especificar más de un comando escribiendo cada comando seguido de la tecla [Intro].
Después de haber escrito todos los comandos, pulse [Intro] para obtener una línea en
blanco y escriba Ctrl-D. Alternativamente, se puede introducir un script de shell en el
intérprete de comandos y escribir Ctrl-D en una línea en blanco para salir. Si se
introduce un script, la configuración de la shell usada será la configuración de la shell
en la SHELL del usuario, la shell de registro del usuario o /bin/sh (el primero que se
encuentre).

Si la configuración de comandos o el script intentan visualizar información, la salida de


datos será enviada vía correo electrónico al usuario.

Configuración de tareas Batch

Para ejecutar una tarea no repetitiva cuando el promedio de carga está por debajo de 0.8,
utilice el comando batch.

Tras haber escrito el comando batch, se visualiza el intérprete de comandos at>.


Escriba el comando a ejecutar, pulse [Intro] y escriba Ctrl-D. Se puede especificar más
de un comando al escribir cada comando seguido de la tecla [Intro]. Tras haber escrito
todos los comandos, pulse [Intro] para acceder a una línea en blanco y escriba Ctrl-D.
Se puede introducir de forma alternativa un script de shell en el intérprete de comandos
y escribir Ctrl-D en una línea en blanco para salir. Si se introduce un script, la shell
usada es la configuración de la she en el entorno SHELL del usuario, la shell de login del
usuario, o /bin/sh (todo lo que se encuentre en primer lugar). Tan pronto como el
promedio de carga está bajo 0.8, se ejecutará la configuración del comando o el script.

Si la configuración de comandos o el script intentan visualizar información, la salida de


datos será enviada vía correo electrónico al usuario.

Visualización de las tareas pendientes

Para visualizar las tareas pendientes at y batch, use el comando atq. Se muestra una
lista de tareas pendientes, con cada línea de trabajo. Cada línea está en el número de
tarea del formato, la fecha, la hora, el tipo de tarea y el nombre de usuario. Los usuarios
tan sólo pueden ver sus propias tareas. Si el usuario root ejecuta el comando atq, se
visualizarán todas las tareas para los usuarios.

Opciones adicionales de la línea de comandos

Opciones adicionales de la línea de comandos para at y batch incluyen:

Opciones Descripción

Envía un email al Lee los comandos o script del shell desde un archivo
usuario cuando se en vez de ser especificados en el intérprete de
ha completado la
comandos.
tarea.-f

-v-m Muestra la hora en la que la tarea será ejecutada.

Tabla 28-1. Opciones de línea de comandos at y batch

Control de acceso a At y Batch

Los ficheros /etc/at.allow y /etc/at.deny pueden ser usados para restringir el


acceso a los comandos at y batch. El formato de ambos ficheros de control de acceso
es un nombre de usuario en cada línea. El espacio en blanco no está permitido en ningún
fichero. El (atd) demonio at no deberá ser reiniciado si los ficheros de control de
acceso son modificados. Los ficheros de control de acceso se leen cada vez que un
usuario intenta ejecutar los comandos at y batch.

El usuario root siempre puede ejecutar los comandos at y batch, sin tener en cuenta los
ficheros de control de acceso.

Si existe el fichero at.allow tan sólo se permitirá a los usuarios listados usar at o
batch y el fichero at.deny será ignorado.

Si at.allow no existe, a todos los usuarios listados en at.deny no se les permitirá usar
at o batch.
Iniciar y finalizar el servicio

Para iniciar el servicio at, use el comando /sbin/service atd start. Para detener el
servicio, use el comando /sbin/service atd stop. Se le recomienda que inicie el
servicio durante el momento de arranque.

mt

mt es una utilería para trabajo con cintas. Aunque no es requerido usarlo al realizar
respaldos, sí es importante conocer qué ayudas nos puede brindar.

mt se debe invocar con el nombre del dispositivo de cinta al que nos estamos refiriendo
(normalmente /dev/st0) y un comando que le deseamos enviar a la cinta.

El comando mt puede demorarse en dar una respuesta y no lo debemos detener si


notamos que no está respondiendo, a veces demora horas.
mt -f /dev/st0 status
mt -f /dev/st0 eject
mt -f /dev/st0 retension
mt -f /dev/st0 erase
mt -f /dev/st0 rewind

Existen otras herramientas como cpio, pero no las analizaremos pues redundaríamos en
el tema y realmente a mi entender el tar es mucho más potente.

¿Cómo se abre un archivo star?

star -xv f=/dev/st0


cdrecord: No write mode specified.
cdrecord: Asuming -tao mode.
cdrecord: Future versions of cdrecord may have different drive
dependent defaults.
cdrecord: Continuing in 5 seconds...
Cdrecord-Clone 2.01-dvd (i686-pc-linux-gnu) Copyright (C) 1995-2004
Jörg Schilling
Note: This version is an unofficial (modified) version with DVD
support
Note: and therefore may have bugs that are not present in the
original.
Note: Please send bug reports or support requests to
http://bugzilla.redhat.com/bugzilla
Note: The author of cdrecord should not be bothered with problems in
this version.
TOC Type: 1 = CD-ROM
scsidev: '/dev/cdrom'
devname: '/dev/cdrom'
scsibus: -2 target: -2 lun: -2
Linux sg driver version: 3.5.27
Using libscg version 'schily-0.8'.
cdrecord:
Warning: using inofficial libscg transport code version (schily - Red
Hat-scsi-linux-sg.c-1.83-RH '@(#)scsi-linux-sg.c 1.83 04/05/20
Copyright 1997 J. Schilling').
Driveropts: 'burnfree'
SCSI buffer size: 64512
atapi: 1
Device type : Removable CD-ROM
Version : 0
Response Format: 1
Vendor_info : 'ATAPI '
Identifikation : 'CD-R/RW 40X12 '
Revision : '1.HB'
Device seems to be: Generic mmc CD-RW.
Using generic SCSI-3/mmc CD-R/CD-RW driver (mmc_cdr).
Driver flags : MMC-2 SWABAUDIO BURNFREE
Supported modes: TAO PACKET SAO RAW/R16 RAW/R96R
Drive buf size : 1630208 = 1592 KB
FIFO size : 4194304 = 4096 KB
Track 01: data 65 MB
Total size: 74 MB (07:25.00) = 33375 sectors
Lout start: 75 MB (07:27/00) = 33375 sectors
Current Secsize: 2048
ATIP info from disk:
Indicated writing power: 5
Is not unrestricted
Is not erasable
Disk sub type: Medium Type B, low Beta category ( (4)
ATIP start of lead in: -11607 (97:27/18)
ATIP start of lead out: 359849 (79:59/74)
Disk type: Short strategy type (Phthalocyanine or similar)
Manuf. index: 18
Manufacturer: Plasmon Data systems Ltd.
Blocks total: 359849 Blocks current: 359849 Blocks remaining: 326474
Speed set to 706 KB/s
Starting to write CD/DVD at speed 4.0 in real TAO mode for single
session.
Last chance to quit, starting real write 0 seconds. Operation
starts.
Waiting for reader process to fill input buffer ... input buffer
ready.
trackno=0
BURN-Free is ON.
Performing OPC...
Starting new track at sector: 0
Track 01: 65 of 65 MB written (fifo 100%) [buf 98%] 4.7x.
Track 01: Total bytes read/written: 68347904/68347904 (33373 sectors).
Writing time: 122.900s
Average write speed 3.6x.
Min drive buffer fill was 89%
Fixating...
Fixating time: 70.034s
cdrecord: fifo had 1077 puts and 1077 gets.
cdrecord: fifo was 0 times empty and 592 times full, min fill was 92%.
este archivo: imagenhda1.img quedará con una copia exacta de hda1 en el momento que
la tomamos. Podemos con confianza borrar hda1, equivocarnos con hda1, o lo que
querramos, podemos reponer esa copia cuando querramos, cómo se repone la info?

dd if=/root/imagenhda1.img of=/dev/hda1
bzip2 archivo
service network restart
chkconfig --add servicio

Como siempre debemos ahorrar recursos de nuestro sistema para que este funcione lo
mejor posible, sugerimos que se comenten al menos 4 de ellos (por ejemplo del terminal
3 al 6) para que el sistema sólo cargue 2 minguetty, y así consumir un poco menos de
recursos.

Quedaría así:

# Run gettys in standard runlevels


1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
#3:2345:respawn:/sbin/mingetty tty3

#4:2345:respawn:/sbin/mingetty tty4

#5:2345:respawn:/sbin/mingetty tty5

#6:2345:respawn:/sbin/mingetty tty6

Vous aimerez peut-être aussi