Académique Documents
Professionnel Documents
Culture Documents
1
Breve introducción al linux, al código GNU
Comparaciones entre código libre y código comercial.
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.
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
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).
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)
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.
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
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
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.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
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 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.
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 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
• sendmail-8.13.2
• httpd-2.0.54
• php-4.3.11
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 ?
Actualizado: 2009/07.
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.
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.
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.
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.
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.
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:
• Soporte técnico
• Actualizaciones frecuentes
• Certificaciones para trabajar en sus productos
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.
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:
Contras:
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.
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.
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.
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,
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.
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.
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.
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.
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.
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.
o en www.LinuxCd.org
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
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
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:
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).
Ahora, deberá cerrar la sesión (de la manera indicada arriba) y volver a ingresar para
que los cambios se realicen.
Seleccione
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.
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.
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.
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.
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.
PCFS es el formato que utiliza el sistema operativo Solaris para equipos X86.
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
|-bin/
|-boot/
|-dev/
|-etc/
|-home/
|-lib/
|-media/
|-mnt/
|-root/
|-sbin/
|-tmp/
|-usr/ sbin/
| bin/
| etc/
lib/
|-var/
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 /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.
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:
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.
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.
/ equivale a \
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.
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.
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.
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
^l : limpia la pantalla
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:
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).
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 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.
Intentar sin la -h (sólo poniendo df) ver que los numeros se representan en k y son más
difíciles de comprender.
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:
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.
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
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)
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).
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.
El comando
reboot
cerrará todas las aplicaciones y procederá a reiniciarla.
shutdown -r now
hará igual trabajo
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.
Inicio de vi
Para usar el editor con algún archivo que se desee crear o modificar se deberá teclear vi
archivo
$ vi prueba
"prueba" [noeol] 4L, 12C indica el numero de lines y caracteres que contiene el archivo.
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.
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.
4.Para insertar una línea abajo de la actual, usar el comando o. Presiona o y teclea
lo siguiente:
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.
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.
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.
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?
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.
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!.
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.
RESPUESTA:
aparece todo lo que se ha realizado en el grafico
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.
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.
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.
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 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.
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.
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
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
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:
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.
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.
• /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 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.
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.
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
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.
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).
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,
por ejemplo:
Éste comando anterior lo que hará será quitar (-) el permiso de escritura (w) al grupo y a
los otros usuarios del archivo prueba.
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
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.
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.
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.
• 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.
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.
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.
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?
¿Qué tal que un día determinado, falle un grupo de sectores o clusters dentro de la
partición donde está /?
/ 512MB
/var 20GB
/home 15GB
/usr 20GB
SWAP 1GB
/tmp 512MB
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.
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.
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.
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.
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).
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):
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ó.
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.
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):
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.
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 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.
Este operador no queremos que tenga acceso al shell, una variante muy cómoda sería:
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.
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.
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.
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.
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:
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:
Aquí la forma (supongo que seguimos ejecutando el tail en primer plano porque
anteriormente lo llamamos con fg):
1.[1]+
Stopped
tail -f /var/log/maillog
Ejercicio:
ejecutar el gnome-calculator desde un shell, detenerla (con ^Z), tratar de usarla y
posteriormente ponerla en background.
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.
• 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 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.
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
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.
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.
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
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:
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 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).
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.
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?
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.
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.
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.
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
Veamos ahora qué significado tiene cada columna, este es un ejemplo que sólo muestra
la primera línea:
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:
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 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:
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 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)
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.
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
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.
• 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í:
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.
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
En resumen, por defecto tenemos 6 consolas virtuales que son atendidas a su vez por 6
servicios de mingetty:
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).
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
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
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
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.
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.
por ejemplo este comando pararía sendmail, lo apagaría, nadie podría ser
capaz de enviar mails a través del servidor.
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.
Aunque potencialmente pueden existir otras acciones, estas son las básicas para cada
servicio.
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
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.
4
Respaldos, herramientas para crear respaldos, trabajo con los discos.
Utilerías para programar tareas
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.
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.
1. Discos IDE
2. Discos SCSI
3. Discos SATA
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.
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
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.
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.
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.
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.
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.
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:
fdisk -l
Formatear la partición
mkfs.ext3 /dev/hda3
ATENCION: ESTE COMANDO DESTRUIRÁ TODA LA INFORMACIÓN
CONTENIDA EN LA PARTICIÓN /dev/hda3
-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.
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.
Actualizar /etc/fstab
mount /home
mount /dev/hda3
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
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
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
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):
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.
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.
shred -n 2 -v /dev/hda
fsck /dev/sdb5 realizará lo mismo pero para la partición 5ta del 2do disco
scsi en una cadena SCSI.
• 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
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:
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:
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
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.
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
Muchas veces necesitamos realizar copias completas de un disco duro, bit por bit, los
objetivos son variados :
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
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.
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
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
[root@eperez loop]# cd
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.
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.
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.
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.
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.
sector |0 1 2 3 4 5 6 7 8 9
proceso |A A A A A A A A A A
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
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 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.
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.
La descripción anterior nos debe haber dado una idea de cuál elevador usar, pero
realmente no hay nada como la práctica.
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.
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.
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)
El comando time sacará una estadística del tiempo consumido por el comando find
• 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.
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í.
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
/dev/hda:
multcount = 16 (on)
unmaskirq = 0 (off)
using_dma = 1 (on)
keepsettings = 0 (off)
nowerr = 0 (off)
readonly = 0 (off)
readahead = 8 (on)
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%
Aquí hemos activado 32bits así como multicount a 16.. el multicount lo podemos llevar
hasta 32 a veces.
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ó.
Sigamos:
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:
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.
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).
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.
/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.
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.
Por eso aquí veremos otro comando más moderno llamado star.
El star tiene cierta compatibilidad con el tar, es capaz de abrir archivos hechos en tar.
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).
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 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.
• 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.
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
/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
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.
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
• 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.
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.
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.
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.
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.
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.
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.
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 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á.
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?
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.
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.
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.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
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.
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).
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).
Para ejecutar una tarea no repetitiva cuando el promedio de carga está por debajo de 0.8,
utilice el comando batch.
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 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
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.
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.
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í:
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6