Está en la página 1de 193

Gua del Estudiante CE 1.

0a
Community Edition
Comunidad OpenSolaris Hispano
es.opensolaris.org
<Instalacin| S! | "onas | "!S| #rand" | $ernel | %& | '(race)
<Instalacin OpenSolaris *00+.0, )
<-rran.ue y parada)
<Ser/ice anagement !acility 0S!1)
<Gestin de discos)
<Gestin de procesos 2 se3ales)
<Gestin de usuarios)
<&irtuali4acin "onas 2 #rand")
<&irtuali4acion %&)
<-lmacenamiento "!S)
<$ernel 5proc)
<Instrumentacin 'trace)
<-lmacenamiento S&)
<Seguridad 6#-C)
<Seguridad I7!ilter)
<Gestin de pa.uetes 0I7S1)
USE IMPROVE EVANGELIZE
Comunidad OpenSolaris Hispano
Licencia
Esta obra est bajo una licencia de Creative Commons. Para ver
una copia de esta licencia, visite
http://creativecommons.org/licenses/by-sa/2.5/ o enve una carta a
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305,
USA.
Usted es libre de:
- Copiar, distribuir y comunicar pblicamente la obra y hacer obras
derivadas.
Bajo las condiciones siguientes:
Reconocimiento. Debe reconocer los crditos de la obra de la
manera especificada por el autor o el licenciador (pero no de una
manera que sugiera que tiene su apoyo o apoyan el uso que hace de
su obra).
Compartir bajo la misma licencia. Si altera o transforma esta
obra, o genera una obra derivada, slo puede distribuir la obra
generada bajo una licencia idntica a sta.
Al reutilizar o distribuir la obra, tiene que dejar bien claro los trminos de la licencia de esta obra.
Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los
derechos de autor
Nada en esta licencia menoscaba o restringe los derechos morales del autor.
Referencias
Todos los nombres propios de programas, sistemas operativos, equipos
hardware, etc., que aparecen en este libro son marcas registradas de
sus respectivas compaas u organizaciones.
2
Comunidad OpenSolaris Hispano
Changelog
Bajo el modelo de licenciamiento actual de tipo CC (Creative
Commons) y con las condiciones de Reconocimiento y Comparticin de
esta licencia ya citadas anteriormente, este apartado pretende ser una
apuesta por la colaboracin y ademas un sistema de control de
versiones / actualizaciones de cada uno de los nuevos anexos que se
pueden aadir de forma libre y abierta.
Actualmente el estado de las diferentes contribuciones al
documento, es el siguiente:
David Galan (http://davidgalan.opensolarisblog.org):
- Introduccin
- Instalacin
- Arranque y Parada
- Service Management Facility (SMF)
- Gestion de Usuarios
- Procesos y seales
- Gestion de discos
- Zettabyte File Systems (ZFS)
- Zonas/Contenedores y BrandZ
Juan Jose Mora (http://jjmora.es):
- Xen Virtual Machine (xVM)
Juan Jose Mora (http://jjmora.es) & Roger Jordan (http://rjblog.es):
- Navegando por el /Proc
- Rendimiento y Tunning
Iban Nieto (http://inieto.ordpress.!om):
- Introduccin a DTRACE
"i!tor M. #ern$nde% (http://v&ernande%g.blogspot.!om):
- Role Based Access Control (RBAC)
- Solaris Volume Manager (SVM)
- IPFilter (IPF)
- Image Packaging System (IPS)
3
Comunidad OpenSolaris Hispano
OpenSolaris
OpenSolaris nace en Junio de 2005 y es el resultado de la
liberacin de la mayor parte del cdigo fuente de Solaris pasando a
ser un proyecto de software libre. Desde este nuevo enfoque nacen
nuevas distribuciones que aportan mejoras al sistema adems de
enriquecerlas con ms software.
Distribuciones OpenSolaris
De las diferentes aportaciones realizadas por comunidades de
usuarios o desarrolladores nacen las siguientes distribuciones:
Solaris 10: es la versin oficial de Sun Microsystems disponible
para arquitectura Sparc y x86. Es estable y robusta estando
diseada para entornos de produccin donde se necesita
estabilidad. Es gratuita y podemos descargarla del sitio web
oficial de Sun.
Solaris Express Community Edition: su nombre en clave es nevada
es una distribucin binaria que se actualiza cada dos viernes, es
una versin que puede no ser compatible con otras versiones ya
que incorpora muchos cambios.
Solaris Express Developer Edition: contiene todas las nuevas
incorporaciones de funcionalidades y software que darn lugar a
la prxima versin estable de Solaris por lo tanto esta
recomendada para entornos de desarrollo o preproduccin. Se
actualiza cada tres o cuatro meses.
4
Comunidad OpenSolaris Hispano
OpenSolaris Developer Preview: mas conocida como OpenSolaris
2008.05 es una distribucin en un solo CD que combina livecd e
instalacin en disco. OpenSolaris 2008.05 esta en sus primeras
fases de desarrollo. Las versiones actualmente liberadas no son
totalmente estables. Incluye un kit para crear tu propia
distribucin y es instalable en una llave USB.
Nexenta OS: es una distribucin totalmente independiente a Sun y
esta basado en GNU libre y de cdigo abierto, integra el kernel
de OpenSolaris y un conjunto de aplicaciones Open Source. Es una
distribucin que comparte la filosofa de a Ubuntu.
Belenix: LiveCD basado en OpenSolaris que esta dando pasos en
convertirse en una distribucin completa. Aporta un conjunto de
software OpenSource. Incluye scripts para crear tu propio livecd
y se puede instalar y arrancar desde una llave USB.
MartUX mBE :es un DVDlive para SPARC y x64/x86 y esta cargado de
paquetes de CommunitySoftWare.
Shillix: es una distro basada en OpenSolaris y es LiveCD para
arquitecturas x86,x64 y EM64T. Esta basada en Nevada Build 17.
OpenGrok
OpenGrok es el motor de bsqueda de cdigo fuente, con OpnGrok
podemos descargar el fuente de OpenSolaris y examinar su cdigo ademas
de poder hacer modificaciones para realizar modificaciones al ya
existente.
Para entrar en OpenGrok entre en la direccin:
http://cvs.opensolaris.org/source
Las comunidades
Las comunidades son puntos de encuentro dentro de OpenSolaris.org
donde puedes encontrar otras personas con las mismas inquietudes sobre
una tecnologa o apliacin. Hay comunidades alrededor de ZFS, DTrace,
SMF, Virtualizacin etc..
Algunas de las comunidades:
Teora e investigacin:
http://www.opensolaris.org/os/community/edu
DTrace! http://www.opensolaris.org/os/community/dtrace
"#S : http://www.opensolaris.org/os/community/zfs
Redes! http://www.opensolaris.org/os/community/networking
"onas! http://www.opensolaris.org/os/community/zones
Documentacin!
http://www.opensolaris.org/os/community/documentation
Controladores de dispositivos!
http://www.opensolaris.org/os/community/device_drivers
$erramientas! http://www.opensolaris.org/os/community/tools
5
Comunidad OpenSolaris Hispano
%mpulsores! http://www.opensolaris.org/os/community/advocacy
Seguridad! http://www.opensolaris.org/os/community/security
Rendimiento! http://www.opensolaris.org/os/community/performance
&lmacenamiento! http://www.opensolaris.org/os/community/storage
'ro(ectos
Los proyectos alojados en www.opensolaris.org albergan las
contribuciones de cdigo, documentos, grficos o productos de varios
autores. Los proyectos disponen de espacio para alojar cdigo.
'articipa
Puedes participar en la comunidad OpenSolaris Hispano de formas
diferentes y da igual tu nivel de experiencia con OpenSolaris.
Si eres principiante puedes desarrollar documentos y
alimentar la Wiki:
http://www.genunix.org/wiki/index.php/OpenSolarisHispano
con el conocimiento que vas aprendiendo, tu aportacin ser
muy til para otros recin llegados.
Si eres desarrollador puedes participar bien proponiendo un
proyecto o unirte a un proyecto de la comunidad para
participar en su desarrollo.
Si eres un usuario experimentado puedes participar
impartiendo charlas, desarrollando documentacin,
alimentado la Wiki y ayudando a otros usuarios.
6
Comunidad OpenSolaris Hispano
%nstalando OpenSolaris
)**+,*-
.ovedades de OpenSolaris
OpenSolaris 2008.05 incorpora importantes novedades sobre sus
antecesores inmediatos. Veamos algunas de ellas:
Solaris Service /anager es una nueva infraestructura que viene a
sustituir al clsico inicio secuencial de Unix System V. Esta
nueva infraestructura permite arrancar los servicios de forma
paralela acorde a sus relaciones de dependencia. Permite al
administrador observar, deshabilitar, arrancar y parar de una
manera sencilla y eficiente.
Solaris Containers es una tecnologa de virtualizacin que
permite la ejecucin de servicios y aplicaciones de forma
totalmente aisladas.
"#S 0Solaris "eta #ile S(stem1 nuevo sistema de archivos de
128bits. Su capacidad de almacenamientos es practicante
ilimitada. Su implantacin y administracin comparada con los
sistemas anteriores muy sencilla. Implementa un nuevo modelo de
ACL sencillo de administrar utilizando los comandos chmod y ls.
DTrace es una potente herramienta que permite a los
administradores observar procesos del ncleo y de los usuarios.
Se compone de ms de 30.000 sensores que aportan informacin
sobre las aplicaciones asociadas a estos.
%mage 'ackaging S(stem es el nuevo sistema de paquetes de
OpenSolaris 2008.05 que permite la instalacin de paquetes de
repositorios de una forma sencilla resolviendo problemas como
dependencias. IPS instalar, actualizar y eliminar aplicaciones.

Comunidad OpenSolaris Hispano
Slim %nstall un nuevo instalador que solo necesita de seis pasos
para instalar OpenSolaris 2008.05 .
Sun 23/ $(pervisor (basado en el trabajo de la comunidad Xen
permitiendo correr Solaris, GNU/Linux y Windows en mquinas
virtuales)
Re4uisitos de %nstalacin
Antes de comenzar la instalacin debemos comprobar si la maquina
destino cumple con los requisitos demandados por OpenSolaris
2008.05 . En la siguiente tabla podemos ver dichos requisitos
mnimos:
&r4uitectura 5+6 /nimo necesarios
Memoria 512MB recomendados.
Espacio en disco 10GB
%niciando OpenSolaris )**+,*-
El proceso de instalacin de OpenSolaris 2008.05 esta basado en
Slim Install que nos permitir instalar el sistema de forma sencilla.
Resumimos la instalacin en:
Arranque del LiveCD de OpenSolaris 2008.05 .
Arrancar el instalador Slim Install e inicia la instalacin.
Reiniciar.
%niciando el LiveCD
Comenzamos el proceso de instalacin arrancando desde CD con el
LiveCD de OpenSolaris 2008.05 , lo primero que veremos ser el gestor
de arranque GRUB.
!
Comunidad OpenSolaris Hispano
OpenSolaris 2008.05 comenzara a iniciarse y solicitar el idioma del
teclado y del escritorio como podemos ver en las siguientes capturas:
"
Comunidad OpenSolaris Hispano
Despus de seleccionar el idioma continua el arranque del sistema
y procede a arrancar el escritorio GNOME donde nos muestra la
licencia.

Una vez aceptada la licencia veremos el escritorio donde tenemos
el sistema totalmente operativo en modo live, ahora tenemos que
iniciar la instalacin. Para ello arrancamos el instalador
identificado en el escritorio como Install OpenSolaris.
#$
Comunidad OpenSolaris Hispano
Ecritorio Live-CD OpenSolaris 2008.05
Al arrancar nos mostrar el proceso de instalacin que consiste
en un volcado a disco de todo el sistema. Los pasos del instalador
son:
1. Pantalla de bienvenida.
2. Seleccionar el disco o particin donde vamos a instalar.
3. Seleccionar la zona horaria.
4. Introducimos la contrasea, creamos un usuario y damos nombre al
sistema.
5. Inicia la instalacin.
6. Finaliza y reinicio.
Veamos una captura de cada uno de los pasos:
##
Comunidad OpenSolaris Hispano
Pantalla de bienvenida, seleccionamos instalar o realizar un Upgrade.
Elegimos en que disco queremos instalar o usar una particin ya
existente.
#2
Comunidad OpenSolaris Hispano
Seleccionamos nuestra zona horaria, fecha y hora.
Seleccionamos el entorno regional.
#3
Comunidad OpenSolaris Hispano
Creamos un usuario de sistema, damos contrasea al root y establecemos
el nombre de la mquina.
Pantalla que muestra informacin de las opciones elegidas.
#4
Comunidad OpenSolaris Hispano
Se inicia el proceso de copiado a disco del sistema.
Cuando finaliza el copiado a disco de todo el sistema reiniciamos
y ya tenemos instalado OpenSolaris 2008.05 . Al reiniciar veremos GRUB
e iniciamos el arranque esta vez ya desde el disco y no del Live-CD:
GRUB
#5
Comunidad OpenSolaris Hispano
Inicia la primera carga de los servicios SMF (nuevo sistema de
arranque por dependencias).
Lo siguiente que veremos ser la pantalla de bienvenida donde
hacemos login con el usuario que hemos creado durante el proceso de
instalacin. Despus de introducir el usuario y contrasea tenemos
disponible el sistema con el escritorio GNOME.
Con la instalacin base dispones de tecnologas como Zonas,
BrandZ, SMF, ZFS y DTrace y xVM Hypervisor (basado en XEN).
#6
Comunidad OpenSolaris Hispano
&rran4ue ( 'arada
%ntroduccin
En este capitulo veremos el proceso arranque y parada de
OpenSolaris 2008.05 , los comandos necesarios para reiniciar y parar
el sistema
'arada ( reinicio del sistema
Cuando finaliza el arranque de la mquina se encuentra en el
nivel de ejecucin multi-user-server o run level 3. En ocasiones hay
que reiniciar el sistema para realizar tareas de mantenimiento como
aadir hardware. A continuacin veremos las diferentes formas de
reiniciar y parar el sistema.
Reinicio de la m74uina!
Si deseamos realizar un reinicio del sistema y queremos emitir
un mensaje personalizado avisando a los usuarios usaremos el comando
shutdown que permite los siguientes parmetros:
shotdown i niveldeejecucin g segundosdeespera mensaje de aviso
Ejemplo del uso de shotdown para reiniciar:
#
Comunidad OpenSolaris Hispano
#/usr/sbin/shutdown -i 6 -g 360 Aviso a los usuarios. El sistema se reiniciar en
60
segundos. Cierre sus aplicaciones.
Con i indicamos el nivel de ejecucin, con g damos 360 segundos
a los usuarios para cerrar sus aplicaciones y ficheros. Cuando
finalicen los 360 segundos el sistema solicita la confirmacin del
reinicio al administrador:
# Do you want to continue? (y or n):
Para reiniciar el sistema tambin podemos ejecutar la orden
reboot:
# /usr/sbin/reboot
El comando reboot ejecuta una parada inmediata e inicia el
sistema en el nivel 3 de ejecucin ahora llamado multi-user-server
'arada de la m74uina!
Para parar el sistema de forma ordenada y despus realizar un
apagado elctrico de la mquina ejecutamos:
#/usr/sbin/shutdown -i 0 -g 360 Aviso a los usuarios. El sistema se reiniciar en
60
segundos. Cierre sus aplicaciones.
Si la ejecutamos el comando en una mquina SPARC se quedara en la
OpenBoot momento en el que podemos realizar el apagado elctrico
ejecutando desde la OpenBoot el comando:
ok power-off
Si es una mquina x86 mostrara el siguiente mensaje:
Svcd.startd: The system is down.
Syncing file systems.done
Pres any key to reboot.
Podemos pulsar cualquier tecla y reiniciar o realizar
directamente el apagado elctrico de la mquina.
Si necesitramos parar la mquina de forma urgente podemos
utilizar el comando halt que realizara una parada inmediata no
ordenada:
# /usr/sbin/halt
Para una parada urgente no ordenada pero con parada elctrica:
# /usr/sbin/poweroff
#!
Comunidad OpenSolaris Hispano
Para reiniciar el sistema podemos ejecutar la orden reboot que
antes proceder al reinicio actualiza el superbloque:
# /usr/sbin/reboot
Gestor de arran4ue GR89 0Grand 8nified 9ootloader1
%ntroduccin a GR89
GRUB es el nuevo gestor de arranque para arquitecturas x86 que
aade nuevas posibilidades de arranque a OpenSolaris 2008.05 . GRUB se
inicia en el MBR ocupando tan solo 512 bytes y este pequeo cdigo
comienza la carga del resto de GRUB ubicado en el disco.
No podemos comparar GRUB con la OpenBoot para arquitecturas SPARC
ya que la OBP se basa en hardware y software, pero sin duda viene a
mejorar las posibilidades de Solaris y su integracin con otros
sistemas operativos como Linux. GRUB es un gran conocido dentro de la
comunidad Linux por lo que facilita aun mas el acercamiento de
administradores Linux a Solaris. GRUB nos ofrece tres interfaces
diferentes para el uso y configuracin de GRUB:
Inter!a" de men#: es la primera que vemos cuando arranca
GRUB y muestra una lista con todas las opciones disponibles
para elegir con que sistema queremos arrancar. (ver figura
4.4)
Inter!a" de edicin: Permite la edicin de las opciones de
arranque establecidas para cada sistema operativo
configurado. Un ejemplo es cambiar de forma temporal el
kernel para realizar pruebas. (ver figura 4.3)
Inter!a" de l$nea de comandos: es una pequea shell que
permite configurar GRUB, realizare pruebas de dispositivos,
red etc..
eprom: OpenSolaris se integra con GRUB con el comando eprom
al igual que lo hace con la OpenBoot en SPARC.
Opciones de arran4ue
Cuando arrancamos la mquina lo primero que nos muestra GRUB es
la Interfaz de men donde podemos elegir el sistema operativo. Esta
interfaz se basa en un fichero de configuracin que permite aadir
nuevos sistemas o modificar los ya existentes. El fichero de
configuracin se encuentra en %boot%grub%menulst .
Cuando finalizamos la instalacin de Solaris el archivo queda de
la siguiente forma:
#---------- ADDED BY BOOTADM - DO NOT EDIT ----------
title Solaris 11 11/06 s10x_u3wos_10 X86
root (hd0,0,a)
kernel /platform/i86pc/multiboot
module /platform/i86pc/boot_archive
#"
Comunidad OpenSolaris Hispano
#---------------------END BOOTADM--------------------
#---------- ADDED BY BOOTADM - DO NOT EDIT ----------
title Solaris failsafe
root (hd0,0,a)
kernel /boot/multiboot kernel/unix -s
module /boot/x86.miniroot-safe
#---------------------END BOOTADM--------------------
Podemos establecer el fichero %boot%grub%menulst los siguientes
parmetros:
de!ault: contiene un valor numrico que se corresponde con
la posicin en la lista que muestra GRUB para seleccionar
una opcin de arranque. Comienza con el valor 0, para
arrancar por defecto con la opcin failsafe estableceramos
el valor a 1.
timeout: son los segundos que esperara para que el usuario
elega una opcin de arranque, si no interviene el usuario
arrancara el sistema establecido por defecto con el valor
de!ault . Con valor -& espera indefinidamente.
Para cambiar estos valores editamos el fichero menulst con
cualquier editor de texto y cambiamos el valor en la lnea donde
aparece de!ault o timeout:
#
# default menu entry to boot
default 0
#
# menu timeout in second before default OS is booted
# set to -1 to wait for user input
timeout 10
2$
Comunidad OpenSolaris Hispano
Service /anagement
#acilit( 0S/#1
%ntroduccin a S/#
OpenSolaris 2008.05 incorpora un nuevo sistema de gestin del
arranque que ofrece nuevas posibilidades y optimiza el arranque del
sistema, este nuevo componente se llama SMF (Service Management
Facility) y forma parte de una nueva infraestructura que viene a
sustituir al clsico inicio secuencial de Unix System V. Esta nueva
infraestructura permite arrancar los servicios de forma paralela
acorde a sus relaciones de dependencia. Una vez arrancado el sistema
el administrador puede observar, deshabilitar, arrancar y parar
servicios de una manera sencilla y eficiente.
Caractersticas de SMF:
Ofrece los mecanismos para establecer relaciones de
dependencia entre servicios. Un servicio no arranca hasta
que estn correctamente arrancadas sus dependencias.
Repositorio que contiene toda la informacin referente a la
configuracin del servicio, modos de arranque, parada,
reinicio y el estado en el que se encuentra.
Log con informacin de eventos de cada servicio.
2#
Comunidad OpenSolaris Hispano
Cambios de niveles de ejecucin a mono usuario, red,
mantenimiento etc..
Beneficios de SMF:
Los servicios al ser objetos pueden ser vistos y
gestionados con sencillos comandos de administracin.
Se puede definir que SMF monitorice un proceso del
servicio y tomar acciones si detecta que el proceso a
muerto o hay un fallo hardware.
Delegar en otros usuarios el poder arrancar o parar
servicios de esta forma no necesitamos utilidades como
sudo o la cuenta de root.
Un servicio definido en SMF no tiene por que estar
necesariamente asociado a un proceso que se este ejecutando en el
sistema, un servicio puede ser el estado de un dispositivo, de una
tarjeta de red o de un sistema de ficheros.
Repositorio 0Repositor( S/#1
Es la pieza principal y en el se almacena la configuracin de
cada servicio tanto en local como en memoria. Tambin contiene el
procedimiento para parar, arrancar y verificar un servicio. Cuando un
servicio se ha iniciado correctamente en el arranque del sistema es
guardada una foto de la configuracin de dicho servicio con el
objetivo de saber cual es la configuracin correcta en caso de tener
que restaurar el servicio.
S/# Restarters! svc,startd
Es el proceso que permite reiniciar un servicio en caso de fallo,
para ello consulta el repositorio para identificar el mtodo definido
para reiniciar el servicio y hacerlo respetando las dependencias
establecidas. Si hemos definido dependencias para un servicio y una de
estas falla SMF Restarters solucionar el problema con la dependencia
para restaurar el servicio.
S/# Service %nstances
Un servicio puede estar compuesto a su vez por otra serie de
servicios a los que se denominan instancias. Un ejemplo seria un
servidor web Apache con el servicio web escuchando por el puerto 80,
otro seguro por el 443 y un tercero por el 8080. Para gestionar el
servicio deberamos crear el servicio web con tres instancias.
Componentes de un servicio S/#
22
Comunidad OpenSolaris Hispano
Un servicio en SMF esta formado por un conjunto de componentes
que interactan entre si. Veamos cada uno de estos componentes:
S/# manifiest: es un fichero XML en el que se definen las
caractersticas de un servicio o una instancia del servicio. Los
ficheros XML con las propiedades de los servicios se almacenan en
%var%svc%mani!est Estos ficheros son cargados en el repositorio SMF.
/ethods: los mtodos son usados por el restarter para interactuar
con el servicio y puede ser un fichero ejecutable: un script o una
palabra clave. Se utilizan para definir los mtodos de arranque,
parada o reinicio de un servicio. Los mtodos son almacenados en
%lib%svc%method.
Service Log #iles! es un servicio que escribe un log con todo los
datos sucesos sobre un servicio, los logs se encuentran en
%var%svc%log.
Service %dentifiers ! cada servicio y cada instancia de servicio
tienen un nombre con el que identificarse con Fault Management
Resource Identifier (FMRI) en el que se especifica como actuar en
caso de fallo en el sistema.
:stados de un servicio S/#
Los servicios pueden tener varios estados en los que podemos ver
si el servicio esta parado, arrancado, degradado o en mantenimiento.
Anteriormente se utilizaba el comando ps e! para ver si un servicio
estaba arrancado, ahora podemos utilizar los comandos de SMF para ver
el estado del servicio adems de poder continuar hacindolo con el
comando ps e! para buscar el proceso.
Estados en los se puede encontrar un servicio SMF:
online: la instancia del servicio esta disponible y se esta
ejecutando correctamente.
o!!line: la instancia del servicio esta disponible pero no esta
ejecutandose.
disabled: la instancia del servicio no esta disponible y no esta
ejecutndose.
maintenance: la instancia del servicio tiene un error y esta
siendo resuelto por el administrador.
degraded: la instancia del servicio esta disponible pero esta
funcionando al lmite de su capacidad.
uninitiali"ed: este es el estado inicial de todos los servicios
antes de iniciar su ejecucin.
legac'(run: este estado solo se utiliza para guardar la
compatibilidad con los viejos niveles de arranque y nos ndica
que el estado en el que se encuentran. Los niveles de arranque
solo pueden ser observados con SMF son se pueden editar.
Dependencias
Cuando definimos un servicio podemos definir dependencias,
estableciendo que no arranque el servidor Apache hasta que no este
arrancado el sistema en multiusuario (run level 3) y la bbdd MYSQL
23
Comunidad OpenSolaris Hispano
iniciada. Para cada servicio podemos establecer desde ninguna a
varias dependencias.
Veamos las propiedades que podemos definir para las dependencias:
re)uire(all: todos los servicios de la dependencia deben estar
online (arrancados) antes de iniciar el servicio.
re)uire(an': es suficiente con que uno de los servicios de la
dependencia se ejecute para que el servicio se inicie.
optional(all: si los servicios de la dependencia estn
disponibles y pueden ejecutarse deben estar online o degraded
antes de la ejecucin del servicio. Si estn en mantenimiento el
servicio no arrancara.
e*clude(all: significa que no todos los servicios de la
dependencia deben estar corriendo para hincar el servicio.
'roceso de arran4ue con S/#
En arranque de Solaris se realiza como en versiones anteriores y
el proceso init continua siendo el primer proceso del sistema leyendo
fichero %etc%initab
initab contiene la siguiente entrada:
smf::sysinit:/lib/svc/bin/svc.startd >/dev/msglog 2<>/dev/msglog </dev/console
Dicha entrada ejecuta el proceso svc.startd que inicia el
proceso svc.configd que es el encargado de conectar con el repositorio
SMF que reside en %etc%svc%repositor'db. El repositorio tiene la
propiedad de auto recuperarse si se producen daos ya que siempre
mantiene una copia de respaldo. (ver figura 3.1)
Los primeros errores producidos durante la ejecucin de SMF bien
del repositorio o con problemas de inicio de un servicio se
escriben en el directorio %etc%svc%volatile (montado en memoria) ya
que todava no esta montado o disponible %var+ una vez sea accesible
%var los logs son escritos en la ruta predeterminada
%var%svc%log
24
Comunidad OpenSolaris Hispano
Figura 3.1
/ilestone Services
Con la llegada de SMF tambin se ha redefinido la forma de poner
la mquina en diferentes niveles de ejecucin. Los niveles de
ejecucin mas conocidos son sigle user y multi user. Ahora se les
denomina milestone. Milestone no es ms que un servicio especial de
SMF que agrupa las dependencias necesarias para establecer un nivel
de ejecucin.
Se han aadido dos nuevos niveles de ejecucin: none que no
ejecuta ningn servicio y all en el que se ejecutan todos los
servicios disponibles.
Las equivalencias al sistema tradicional son las reflejadas en la
siguiente tabla:
SMF Milestone Run Level Run Level
milestone single-user
S
milestone multi-user
2
milestone multi-user-server
3
milestone all
3
milestone none
No
existe
Para pasar de un nivel de ejecucin a otro podemos realizarlo sin
problemas de la manera tradicional con el comando init y el nmero
25
boot
Init (pid 1)
init lee
/etc/initta
svc.startd svc.confif.d
bbdd
configurac
in SMF
svc:/platform

svc:/site
svc:/mileston
e
svc:/sstem
Comunidad OpenSolaris Hispano
del nivel de ejecucin al que queremos pasar o con el comando svcadm
de la siguiente forma:
Pasar a single-user:
# svcadm milestone single-user
A multi-user
# svcadm milestone multi-user
A multi-user-server
# svcadm milestone multi-user-server
Para averiguar en que Runlevel esta ejecutndose el sistema
lanzamos el siguiente comando:
# svcprop svc:/system/svc/restarter:default | grep -i milestone
options_ovr/milestone astring svc:/milestone/multi-user-server:default
Podemos ver que el sistema se encuentra en el nivel de ejecucin
multi-user-server. Si la ejecucin del comando no muestra nada en
pantalla significa que estemos en el nivel de ejecucin all
Un milestone es un servicio tiene definidas dependencias de otros
servicios, por ejemplo el servicio multi-user depende de los servicios
de red. Obervando las dependencias de cada nivel de ejecucin podemos
averiguar que servicios ejecuta el milestone multi-user.
Para ello ejecutamos el comando svcs d servicio para ver sus
dependencias:
Para ver las dependencias del milestone multi-user ejecutamos:
bash-3.00# svcs -d milestone/multi-user
STATE STIME FMRI
disabled 12:52:37 svc:/system/auditd:default
disabled 12:52:37 svc:/application/print/server:default
disabled 12:52:37 svc:/network/ntp:default
disabled 12:52:39 svc:/system/mdmonitor:default
disabled 12:52:39 svc:/system/rcap:default
online 12:52:42 svc:/milestone/name-services:default
online 12:52:54 svc:/system/rmtmpfiles:default
online 12:52:55 svc:/system/power:default
online 12:52:55 svc:/system/name-service-cache:default
online 12:53:01 svc:/milestone/single-user:default
online 12:53:04 svc:/system/filesystem/local:default
online 12:53:04 svc:/system/cron:default
online 12:53:06 svc:/network/rpc/bind:default
online 12:53:09 svc:/platform/i86pc/kdmconfig:default
online 12:53:09 svc:/milestone/sysconfig:default
online 12:53:10 svc:/network/inetd:default
online 12:53:11 svc:/system/utmp:default
online 12:53:24 svc:/network/nfs/client:default
online 12:53:25 svc:/system/filesystem/autofs:default
online 12:53:26 svc:/system/system-log:default
online 12:53:26 svc:/system/system-log:default
online 12:53:26 svc:/network/smtp:sendmail
Como se puede ver el nmero de servicios que ejecuta multi-server
es muy superior al single-user que no requiere de tantos servicios
como podemos ver en el ejemplo:
bash-3.00# svcs -d milestone/single-user
26
Comunidad OpenSolaris Hispano
STATE STIME FMRI
disabled 12:52:32 svc:/system/metainit:default
online 12:52:39 svc:/network/loopback:default
online 12:52:48 svc:/milestone/network:default
online 12:52:49 svc:/system/identity:node
online 12:52:51 svc:/system/keymap:default
online 12:52:52 svc:/system/filesystem/minimal:default
online 12:52:54 svc:/system/cryptosvc:default
online 12:52:55 svc:/system/sysevent:default
online 12:52:56 svc:/milestone/devices:default
online 12:53:00 svc:/system/manifest-import:default
Gestin de los servicios con S/#
A continuacin vamos a ver los comandos que tiene SMF para la
monitorizar el estado de los servicios, obtener informacin de un
servicio y como parar o arrancar servicios. El conjunto de comandos
que nos permite la administracin de SMF son:
svcs: Proporciona informacin sobre el estado de un servicio y
sus dependencias:
svcadm: Permite realizar acciones administrativas como cambiar el
estado de un servicio.
svcc!g: Tiene la funcin de crear nuevos servicios a partir de un
fichero xml y modificar las propiedades de un servicio.
svcprop: Obtenemos y cambiamos valores de la bbdd sobre un
servicio.
Obtener informacin de los servicios 0svcs1
Los servicios SMF estn organizados en grupos con los siguientes
nombres:
,pplication: Contiene los servicios asociados con aplicaciones.
-evice: Usado para las dependencias
.ilestone: Equivalente a los niveles de ejecucin SVR4
/etwor0: Todos los servicios del antiguo inetd.conf
1lat!orm: Servicios especficos de la plataforma.
S'stem: Servicios independientes de la plataforma
Site: Sin uso, reservado para uso futuro.
El siguiente ejemplo muestra el grupo al que pertenece el
servicio de telnet:
# svcs -a | grep telnet
disabled Dec_28 svc:/network/telnet:default
Como se puede observar pertenece a /network
2
Comunidad OpenSolaris Hispano
3er el estado de un servicio
Para ver el estado todos los servicios recurrimos al comando svcs
que en ejemplo lo ejecutamos con la opcin a para que muestre todos
los servicios independientemente de su estado.
# svcs -a
STATE STIME FMRI
legacy_run 10:10:30 lrc:/etc/rcS_d/S50sk98sol
legacy_run 10:10:31 lrc:/etc/rcS_d/S51installupdates
legacy_run 10:10:55 lrc:/etc/rc2_d/S10lu
legacy_run 10:10:56 lrc:/etc/rc2_d/S20sysetup
legacy_run 10:10:56 lrc:/etc/rc2_d/S40llc2
legacy_run 10:10:56 lrc:/etc/rc2_d/S42ncakmod
legacy_run 10:10:56 lrc:/etc/rc2_d/S47pppd
legacy_run 10:10:56 lrc:/etc/rc2_d/S70uucp
legacy_run 10:10:56 lrc:/etc/rc2_d/S72autoinstall
legacy_run 10:10:59 lrc:/etc/rc2_d/S73cachefs_daemon
legacy_run 10:10:59 lrc:/etc/rc2_d/S81dodatadm_udaplt
.....
online 10:10:49 svc:/network/ftp:default
online 10:10:49 svc:/network/finger:default
online 10:10:50 svc:/network/ssh:default
online 10:10:50 svc:/system/dumpadm:default
online 10:10:51 svc:/system/system-log:default
online 10:10:51 svc:/network/login:rlogin
online 10:10:51 svc:/network/shell:default
online 10:10:52 svc:/network/rpc-100235_1/rpc_ticotsord:default
online 10:10:53 svc:/network/smtp:sendmail
En el ejemplo podemos observar el servicio legac'(run utilizado
para guardar la compatibilidad con las practicas administrativas de
versiones anteriores de Solaris. Del servicio legac'(run solo se
puede consultar su estado y no podemos realizar cambios sobre el.
Si aadimos un servicio de la forma tradicional con un script en
el directorio ined.d y el enlace en el rc* correspondiente funcionara
con normalidad vindolo en el SMF como un servicio legac'(run .
En OpenSolaris 2008.05 no es recomendable seguir utilizando el
viejo sistema para aadir servicios al arranque debiendo utilizar SMF.
Tambin podemos observar que los servicios tradicionales como ftp
y ssh estn en estado online.
3er las dependencias de un servicio
Para ver las dependencias de un servicio, es decir que servicios
tienen que estar arrancados para que pueda ejecutarse utilizamos el
comando svcs con la opcin d.
Veamos el ejemplo:
# svcs -d svc:/network/http:apache2
STATE STIME FMRI
online 10:10:12 svc:/milestone/network:default
online 10:10:33 svc:/system/filesystem/local:default
online 10:10:48 svc:/system/filesystem/autofs:default
Figura 3.2
2!
Comunidad OpenSolaris Hispano
En el ejemplo de la figura 3.2 vemos que para que pueda
ejecutarse el servicio web Apache 2 necesitamos que estn levantados
los servicios network, y filesystem.
'rocesos asociados a un servicio!
Para averiguar que procesos estn asociados a un servicio
ejecutamos el comando svcs con la opcin p . El resultado de la
ejecuin produce la siguiente salida:
# svcs -p svc:/network/smtp:sendmail
STATE STIME FMRI
online 10:10:53 svc:/network/smtp:sendmail
10:10:54 334 sendmail
10:10:54 341 sendmail
Figura 3.3
En el ejemplo de la figura 3.3 podemos ver los pid asociados al
servicio sendmail aunque podemos averiguarlo tambien de la forma
tradicional con la orden ps -e! 2 grep sendmail
Obtener informacin detallada de un servicio
SMF puede aportar informacin detallada de un servicio como su
nombre, si esta habilitado, su propio estado y las dependencias.
Ejecutamos svcs con el parmetro l :
# svcs -l svc:/network/http:apache2
fmri svc:/network/http:apache2
nombre Apache 2 HTTP server
habilitada Falso
estado disabled
next_state none
state_time Thu Dec 28 10:10:08 2006
reiniciador svc:/system/svc/restarter:default
dependency require_all/error svc:/milestone/network:default (online)
dependency require_all/none svc:/system/filesystem/local:default (online)
dependency optional_all/error svc:/system/filesystem/autofs:default (online)
Diagnostico de fallos
SMF con el comando svcs puede aportarnos informacin sobre la
causa de porque un servicio no puede arrancar, para ellos utilizamos
el comando svcs con el parmetro *. Para este ejemplo hemos
deshabilitado manualmente el servicio de apache.
Veamos el resultado del diagnostico:
# svcs -x svc:/network/http:apache2
svc:/network/http:apache2 (Apache 2 HTTP server)
Estado: disabled desde Thu Dec 28 10:10:08 2006
Motivo: Un administrador lo ha inhabilitado.
Consulte: http://sun.com/msg/SMF-8000-05
Consulte: httpd(8)
Impacto: Este servicio no est funcionando.
2"
Comunidad OpenSolaris Hispano
La salida del comando nos indica que el servicio fue parado por
un administrador, en que momento lo hizo y el impacto sobre el
servicio.
Tambin nos remite a una url de Sun donde se nos amplia
informacin sobre la causa por la que no esta arrancado el servicio.
Sea cual sea el error siempre nos dar una url para obtener
informacin que nos ayude a diagnosticar y solucionar el problema.
Cambios de estado de un servicio 0svcadm1,
'arada de un servicio
Para parar un servicio utilizamos el comando svcadm con los
parmetros disable y t seguido del nombre de servicio:
svcadm disable -t svc:/network/http:apache2
Verificamos que ha parado con el comando svcs p el cual nos
indicara que el proceso esta en disable y que no hay procesos de
apache2 ejecutndose.
El resultado es el siguiente:
# svcs -p svc:/network/http:apache2
STATE STIME FMRI
disabled 12:20:21 svc:/network/http:apache2
ps -ef | grep -i apache2
root 1549 1444 0 12:22:51 pts/4 0:00 grep -i apache2
La opcin t estipula que es una para temporal si olvidamos
poner el parmetro t en el prximo arranque de la mquina el
servicio no arrancara quedando en disable.
&rrancar un servicio
Para arrancar un servicio utilizamos el comando svcadm con los
parmetros enable y t seguido del nombre de servicio:
# svcadm enable -t svc:/network/http:apache2
Y verificamos que ha arrancado correctamente:
#
# svcs -p svc:/network/http:apache2
STATE STIME FMRI
online 12:31:23 svc:/network/http:apache2
12:31:23 1559 httpd
12:31:24 1560 httpd
12:31:24 1561 httpd
12:31:24 1562 httpd
12:31:24 1563 httpd
12:31:24 1564 httpd
Figura 3.3
3$
Comunidad OpenSolaris Hispano
Tal como podemos ver en la figura 3.3 el servicio ha arrancado
correctamente y podemos ver todos los pid de los procesos en
ejecucin.
Reiniciar un servicio
Hasta el momento si queramos reiniciar un servicio como por
ejemplo ssh acudamos a ejecutar:
/etc/init.d/sshd stop; /etc/init.d/sshd start
Ahora ejecutamos el comando svcs con la opcin restart :

# svcadm restart svc:/network/http:apache2
Y verificamos que los procesos han cambiado de pid:
# svcs -p svc:/network/http:apache2
STATE STIME FMRI
online 12:37:27 svc:/network/http:apache2
12:37:27 1577 httpd
12:37:28 1578 httpd
12:37:28 1579 httpd
12:37:28 1580 httpd
12:37:28 1581 httpd
12:37:28 1582 httpd
3er la configuracin de un servicio
Si deseamos saber los valores de las propiedades de un servicio
disponemos del comando svcprop que extrae dicha informacin del
repositorio. Como ejemplo vamos a averiguar que mtodo esta definido
para arrancar el servicio apache2.
Ejecutamos primeramente el comando svcprop y el nombre del
servicio para obtener una lista de las propiedades definidas:
# svcprop svc:/network/http:apache2
httpd/ssl boolean false
httpd/stability astring Evolving
network/entities fmri svc:/milestone/network:default
network/grouping astring require_all
...
....
general/entity_stability astring Evolving
start/exec astring /lib/svc/method/http-apache2\ start
start/timeout_seconds count 60
start/type astring method
stop/exec astring /lib/svc/method/http-apache2\ stop
stop/timeout_seconds count 60
stop/type astring method
refresh/exec astring /lib/svc/method/http-apache2\ refresh
refresh/timeout_seconds count 60
refresh/type
3#
Comunidad OpenSolaris Hispano
....
.....
restarter/state_timestamp time 1167305847.133954000
general_ovr/enabled boolean true
restarter_actions/restart integer
Figura 3.4
En el ejemplo de la figura 3.4 podemos ver una lista con todas
las propiedades del servicio, para nuestro ejemplo nos centramos en la
lnea que pone:
start/exec astring /lib/svc/method/http-apache2\ start
Esta lnea muestra el fichero que ejecuta el arranque del apache
2 que es %lib%svc%method%http-apache3 pasndole el parmetro start
Podemos ver el contenido del scritp realizando un more sobre
%lib%svc%method%http-apache3
Si queremos obtener datos formateados sobre una de las
propiedades ejecutamos:
svcprop p nombredelapropiedad nombredelservicio
En la figura 3.5 muestra la informacin sobre los valores de la
propiedad start%e*ec y start%timeout(seconds .
# svcprop -p start/exec svc:/network/http:apache2
/lib/svc/method/http-apache2\ start
# svcprop -p start/timeout_seconds svc:/network/http:apache2
60
#
Figura 3.5
inetd como servicio S/#
El proceso inetd ha sido migrado completamente como un servicio
SMF, ya no es necesario editar el fichero %etc%inet%inetdcon! para
establecer valores o habilitar y deshabilitar servicio como telnet,
ftp, tftp etc..
Si deshabilitamos un servicio como telnet ya no es necesario
reiniciar con el comando 0ill el proceso inet.d.
3er servicios de inetd
Para ver todos los servicios del proceso inetd y el estado en el
que se encuentran ejecutamos el comando inetadm y pulsamos intro:
# inetadm
ENABLED STATE FMRI
enabled online svc:/application/x11/xfs:default
enabled online svc:/application/font/stfsloader:default
enabled offline svc:/application/print/rfc1179:default
enabled online svc:/network/rpc/mdcomm:default
32
Comunidad OpenSolaris Hispano
enabled online svc:/network/rpc/meta:default
enabled online svc:/network/rpc/metamed:default
enabled online svc:/network/rpc/metamh:default
enabled online svc:/network/rpc/gss:default
....
......
enabled online svc:/network/ftp:default
disabled disabled svc:/network/comsat:default
enabled online svc:/network/finger:default
disabled disabled svc:/network/login:eklogin
disabled disabled svc:/network/login:klogin
enabled online svc:/network/login:rlogin
disabled disabled svc:/network/shell:kshell
disabled disabled svc:/network/talk:default
Deshabilitar un servicio inetd
Al ser un servicio mas de SMF recurrimos al comando svcadm y el
parmetro disable Ejemplo para no permitir conexiones telnet:
Con la opcin t se volver a habilitar el servicio al reiniciar la
mquina:
# svcadm disable -t svc:/network/telnet:default
Sin la opcin t el cambio es permanente:
# svcadm disable svc:/network/telnet:default
3er el valor de un servicio inetd
En versiones anteriores si queramos cambiar un valor al servicio
ftp editbamos la lnea y cambiamos los valores en el propio fichero.
Con SMF es mas sencillo ya las propiedades estn almacenadas en el
repositorio. Antes de utilizar SMF editbamos la siguiente lnea de
inetd.conf:
ftp stream tcp6 nowait root /usr/sbin/in.ftpd in.ftpd -a
Para conocer el valor que tiene un servicio ejecutamos el
comando:
inetadm l nombredelservicio
Ejemplo de la ejecucin para ver los valores del servicio ftp:
#inetadm -l ftp
SCOPE NAME=VALUE
name="ftp"
endpoint_type="stream"
proto="tcp6"
isrpc=FALSE
wait=FALSE
exec="/usr/sbin/in.ftpd -a"
user="root"
default bind_addr=""
33
Comunidad OpenSolaris Hispano
default bind_fail_max=-1
default bind_fail_interval=-1
default max_con_rate=-1
default max_copies=-1
default con_rate_offline=-1
default failrate_cnt=40
default failrate_interval=60
default inherit_env=TRUE
default tcp_trace=FALSE
default tcp_wrappers=FALSE
Cambiar un valor de un servicio inet,d
Para cambiar un valor de los servicios inet.d utilizamos el
comando inetadm de la siguiente forma:
inetadm m nombreservicio parametroacambiar4nuevovalor
La ejecucin del comando para cambiar el valor wait45,6S7 del
servicio ftp a valor wait489:7 seria:
inetadm -m ftp wait=TRUE
y lo verificamos con:
# inetadm -l ftp
SCOPE NAME=VALUE
name="ftp"
endpoint_type="stream"
proto="tcp6"
isrpc=FALSE
wait=TRUE
exec="/usr/sbin/in.ftpd -a"
user="root"
default bind_addr=""
default bind_fail_max=-1
default bind_fail_interval=-1
default max_con_rate=-1
default max_copies=-1
default con_rate_offline=-1
default failrate_cnt=40
default failrate_interval=60
default inherit_env=TRUE
default tcp_trace=FALSE
default tcp_wrappers=FALSE
Cambios en inetd,conf
El fichero /etc/inet/inetd.conf no puede sufrir cambios ya que
toda la gestin recae sobre SMF pero en caso de producirse un cambio
voluntario o por una aplicacin el sistema nos alertara
en /adm/messages que el fichero ha sido modificado para que el
administrador determine su naturaleza.
34
Comunidad OpenSolaris Hispano
Dec 28 17:11:11 aulaunix inetd[1737]: [ID 702911 daemon.warning] Configuration file
/etc/inet/inetd.conf has been modified since inetconv was last run. "inetconv -i
/etc/inet/inetd.conf" must be run to apply any changes to the SMF
Convertir un servicio de inetd,conf a S/#
En OpenSolaris 2008.05 se han migrado todos los demonios del
fichero %etc%inet%inetdcon!, pero si necesitamos aadir
posteriormente un servicio contamos con la utilidad inetconv.
El procedimiento es el siguiente:
1. Creamos los directorio temporales:
a %tmp%nuevoservicio
b %tmp%destino;.6
2. Creamos en el directorio %tmp%nuevoservicio un fichero llamado
migracioncon! que contenga el nuevo demonio del servicio usando
la sintaxis del fichero %etc%inetdcon! Para nuestro ejemplo hemos
creado el fichero con la siguiente lnea:
tftp dgram udp6 wait root /usr/sbin/in.tftpd in.tftpd
-s /tftpboot
3. Ejecutamos el comando:
# inetconv -i /tmp/nuevoservicio/migracion.conf -n -o /tmp/destinoXML
4. En el directorio /tmp%destino;.6 encontraremos un nuevo fichero con
extensin .XML al que le ha dado el nombre de t!tp-udp<*ml para ser
cargado en el repositorio.
5. Cargamos la nueva configuracin en el repositorio con el comando
svccon!ig
Ejecutamos el comando:
# svccfg import /tmp/destinoXML/tftp-udp6.xml
Verificamos que ha sido cargado con:
# svcs -a | grep -i tftp
online 12:39:09 svc:/network/tftp/udp6:default
Ya podemos gestionar el servicio svc:%networ0%t!tp como un
servicio mas de SMF.
Crear un nuevo servicio S/#
Para crear un nuevo servicio SMF debemos definir un nuevo SMF
manifiest que es fichero XML que contiene los mtodos para arrancar,
parar, reiniciar, definicin de dependencias, documentacin etc..
Recordemos que los servicios SMF estn organizados en grupos con
los siguientes nombres:
,pplication: Contiene los servicios asociados con aplicaciones.
-evice: Usado para dispositivos.
35
Comunidad OpenSolaris Hispano
.ilestone: Equivalente a los niveles de ejecucin SVR4
/etwor0: Todos los servicios del antiguo inetd.conf
1lat!orm: Servicios especficos de la plataforma.
S'stem: Servicios independientes de la plataforma
Site: Sin uso, reservado para uso futuro.
Para crear un servicio SMF debemos de seguir los siguientes
pasos:
1. Establecer el grupo y el nombre para el servicio
2. Definir las dependencias
3. Definir instancias y los mtodos de arranque, parada y
reinicio.
4. Ubicacin de la documentacin
5. Crear el fichero XML
6. Cargar el fichero XML en el repositorio
Vamos a proceder a crear un nuevo servicio SMF de un servidor
web de Sun Microsystems: Sun ONE Web Server 6 para ello recopilamos
la siguiente informacin:
Vamos a crear el servicio dentro del grupo ,pplication y a
su vez dentro de un nuevo subgrupo definido por nosotros
llamado servidoresweb y finalmente el identificador del
servicio ,ula:ni* que se corresponde con el servidor web
Sun One. Quedando se la siguiente forma:
%application%servidoresweb%,ula:ni*
Definimos como dependencia el nivel de ejecucin 3 o multi-
user-server.
Los scripts de arranque, parada y reinicio son:
o /software/binarios/webserversunone/https-
aulaunix.aulaunix.org/start
o /software/binarios/webserversunone/https-
aulaunix.aulaunix.org/stop
o /software/binarios/webserversunone/https-
aulaunix.aulaunix.org/restart
La documentacin la ubicamos en /software/documentacion
Creacin del 5/L
En el ejemplo de la figura 3.6 podemos ver un XML completo en el
que se define el servicio %application%servidoresweb%,ula:ni*
Veamos las partes mas importantes:
En la primera parte del XML vemos que se han creado los
comentarios sobre el servicio y se ha definido un identificador:
<service_bundle type='manifest' name='SunOneWebAulaunix'>
Este identificador debe ser nico y podemos personalizar el texto
acorde al servicio que vamos a dar de alta.
36
Comunidad OpenSolaris Hispano
En el siguiente se establece a que grupo pertenece y se define
un subgrupo para albergar los servidores web:
<service
name='application;servidores<eb;&ula8ni2=
type='service'
version='1'>
El nombre definido con name4 ser el que nos muestre el comando
svcs cuando verifiquemos el estado del servicio. Debe ser un nombre
sencillo y que permita identificar los servicios de forma practica. En
este caso hemos optado por organizar todos los servidores web por
debajo de servidoresweb.
La propiedad de la figura 3.6 create(de!ault(instance nos
permite dos valores false y true con los que indicamos que el servicio
se inicie o se detenga con las paradas y arranques del sistema.
Anteriormente esto lo hacamos con los scripts dentro del run revel
correspondient pondiendo la S deltante del nombre para arrancar o la K
para parar el servicio.
<create_default_instance enabled='false' />
Figura 3.6
Con =single(instance%> estamos definiendo una sola instancia, un
servicio puede estar compuesto a su vez por otra serie de servicios a
los que se denominan instancias. Un ejemplo seria un servidor web
Apache con el servicio web escuchando por el puerto 80, otro seguro
por el 443 y un tercero por el 8080. Para gestionar el servicio
deberamos crear el servicio web con tres instancias. Para nuestro
ejemplo solo vamos el servicio con una sola instancia.
Tenemos que crear las dependencias para que solo arranque el
servicio si estn funcionando correctamente todos los servicios del
nivel de ejecucin 3. Podemos crear tantas dependencias como sean
necesarias haciendo referencia al nombre del servicio:
<dependency name='multi-user-server' type='service' grouping='require_all'
restart_on='none'>
<service_fmri value='svc:/milestone/multi-user-server' />
</dependency>
Ya hemos definido las dependencias y ahora vamos a crear los
mtodos para arrancar, reiniciar y parar. Como vemos en el ejemplo de
la figura 3.6 con la opcin name4 establecemos el valor start para
arrancar, stop para parar y restart para reiniciar.
Los mtodos definidos se ejecutaran cuando llamemos al comando
svcadm de la siguiente forma:
svcs Mtodo
svcadm enable
nombredelservicio
start
svcadm disable
nombredelservicio
stop
svcadm restart
nombredelservicio
restar
t
3
Comunidad OpenSolaris Hispano
El valor de e*ec4 contiene la ruta absoluta al script o binario
que se ejecutara y con time timeout(seconds definimos los segundos que
esperara SMF como limite para el arranque:
<exec_method
type='method'
name='start'
exec='/software/binarios/webserversunone/https-aulaunix.aulaunix.org/start'
timeout_seconds='30' >
</exec_method>
Ya tenemos creados los mtodos y nos queda definir la informacin
sobre la documentacin del servicio en la etiqueta =documentation>
donde establecemos el valor para manpage title con el titulo de la
documentacin y del valor manpath con el path absoluto del lugar
donde se encuentra la mquina.
<documentation>
<manpage title='Documentos Web Server' section='1M'
manpath='/software/documentacion' />
</documentation>
%mportando el servicio en 5/L a S/#
Ya tenemos creado el fichero XML y nos queda cargarlo en el
repositorio para poder ser gestionado. La carga en el repositorio la
realizamos con el comando svcc!g ejecutando la siguiente sentencia:
svcc!g -v import !ichero*ml
# svccfg -v import aulaunix.xml
svccfg: Tomando captura "previous" de
svc:/application/servidoresweb/AulaUnix:default.
svccfg: Actualizacin de propiedades de svc:/application/servidoresweb/AulaUnix de
acuerdo con la instancia "default".
svccfg: svc:/application/servidoresweb/AulaUnix: Actualizando propiedad
"tm_man_Documentos_Web_Server/manpath".
svccfg: Tomando captura "last-import" para
svc:/application/servidoresweb/AulaUnix:default.
svccfg: svc:/application/servidoresweb/AulaUnix:default actualizado.
svccfg: Importacin finalizada con xito.
Y verificamos que ha cargado correctamente ejecutando:
# svcs -l svc:/application/servidoresweb/AulaUnix
fmri svc:/application/servidoresweb/AulaUnix:default
nombre Servicio SMF de ejemplo sobre SunONE
habilitada Falso
estado disabled
next_state none
state_time Tue Jan 02 17:56:41 2007
reiniciador svc:/system/svc/restarter:default
dependency require_all/none svc:/milestone/multi-user-server (online)
3!
Comunidad OpenSolaris Hispano
Podemos ver las propiedades correctamente, el nombre es
svc:%application%servidoresweb%,ula:ni* tal como hemos definido en el
XML y su estado es disabled
El servicio ya esta disponible para gestionarlo con SMF.
Verificamos el mtodo start arrancando el servidor web con el comando
svcadm:
# svcadm enable svc:/application/servidoresweb/AulaUnix
# svcs | grep -i aula
online 10:41:16 svc:/application/servidoresweb/AulaUnix:default
# svcs -p svc:/application/servidoresweb/AulaUnix:default
STATE STIME FMRI
online 10:41:16 svc:/application/servidoresweb/AulaUnix:default
10:41:06 3986 webservd-wdog
10:41:06 3987 webservd
10:41:07 3988 webservd
Podemos verificar el servidor web con ps e! o ejecutando el
comando svcs -p que nos mostrara los procesos y su pid asociados al
servicio.
/odificar ( eliminar un servicio S/#
Para modificar las propiedades de un servicio SMF es suficiente
con modificar el fichero XML con los nuevos datos y realizar la
importacin al repositorio con el comando svcc!g:
# svccfg -v import aulaunix.xml
Para eliminar un servicio del repositorio ejecutamos la orden:
svc!g delete nombredelservicio:
# svccfg delete svc:/application/servidoresweb/AulaUnix
# svcs -a | grep -i aula
#
La figura 3.6 muestra el XML completo del ejemplo que hemos
seguido, puedes encontrar el fichero para descargarlo en:
www.aulaunix.org/ejemplos
<?xml version='1.0'?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<!--
XML de ejemplo de ejemplo creado por David Galan
dgalan@aulaunix.org
www.aulaunix.org
wikilaris.aulaunix.org
blog.aulaunix.org
-->
<service_bundle type='manifest' name='SunOneWebAulaunix'>
<service
name='application/servidoresweb/AulaUnix'
type='service'
version='1'>
3"
Comunidad OpenSolaris Hispano
<create_default_instance enabled='false' />
<single_instance/>
<dependency name='multi-user-server' type='service' grouping='require_all'
restart_on='none'>
<service_fmri value='svc:/milestone/multi-user-server' />
</dependency>
<exec_method
type='method'
name='start'
exec='/software/binarios/webserversunone/https-
aulaunix.aulaunix.org/start'
timeout_seconds='30' >
</exec_method>
<exec_method
type='method'
name='stop'
exec='/software/binarios/webserversunone/https-
aulaunix.aulaunix.org/stop'
timeout_seconds='60' />
<exec_method
type='method'
name='restart'
exec='/software/binarios/webserversunone/https-
aulaunix.aulaunix.org/restart'
timeout_seconds='120'>
</exec_method>
<stability value='Unstable' />
<template>
<common_name>
<loctext xml:lang='C'>
Servicio SMF de ejemplo sobre SunONE
</loctext>
</common_name>
<documentation>
<manpage title='Documentos Web Server' section='1M'
manpath='/software/documentacion' />
</documentation>
</template>
</service>
</service_bundle>
Figura 3.6
Delegar la gestin de S/# a otros usuarios
En algn momento puede surgir la necesidad de delegar la gestin
de un servicio a otro usuario del sistema para poder arrancar, parar y
reiniciar servicios.
4$
Comunidad OpenSolaris Hispano
En nuestro ejemplo vamos a dar permisos al usuario aulaunix para
que pueda gestionar el servidor web. El primer paso es aadir al
servicio el atributo value(authori"ation utilizando el comando
svcprop:
svccfg -s /application/servidoresweb/AulaUnix setprop general/value_authorization =
astring: solaris.smf.manage
Ahora aadimos al fichero /etc/user_attr la siguiente lnea y
grabamos los cambios:

aulaunix::::type=normal;auths=solaris.smf.manage
Con estos dos pasos el usuario aulaunix ya puede gestionar el
servicio web:

# su - aulaunix
bash-3.00$ /usr/sbin/svcadm disable /application/servidoresweb/AulaUnix
bash-3.00$ /usr/sbin/svcadm enable /application/servidoresweb/AulaUnix
Si deseamos quitarle los permisos para que no pueda continuar
gestionando el servicio ejecutamos el comando svcprop para eliminar la
propiedad value(authori"ation:
#svccfg -s /application/servidoresweb/AulaUnix delprop
general/action_authorization
4#
Comunidad OpenSolaris Hispano
Gestin de usuarios
Las cuentas de usuario para el acceso al
sistema no difieren en Solaris de otros
sistemas unix, en el siguiente capitulo
aprenderemos a:
Identificar los ficheros de configuracin de usuarios
Gestin de usuarios (alta, modificacin y borrado)
Gestin de grupos (alta, modificacin y borrado)
Gestionar usuarios en grupos (alta, modificacin y borrado)
Ficheros de inicializacin
#icheros de configuracin
Los ficheros de configuracin contienen la informacin sobre las
cuentas de usuario, los grupos y contraseas. Los ficheros son:
;etc;pass<d
Cada una de las lneas del fichero contiene la informacin de un
usuarios. Cada lnea esta organizada en campos separados por el
carcter dos puntos que hace de separador de campo. Ejemplo de una
lnea del fichero passwd:
aulaunix:x:65535:1:Nombre y apellidos:/export/home/aulaunix:/bin/bash
El formato tiene la siguiente estructura:
42
Comunidad OpenSolaris Hispano
I-login:*::I-:?I-:comentario:home(director':login(shell
Estos campos son:
I-login: es el identificador con el que hacemos login en el
sistema debe de ser nico.
@ontraseAa: la contrasea representada por * es almacenada en el
fichero %etc%shadow
:I-: esta representado por un nmero superior a 0 ya que 0
pertenece al usuario root. Los nmeros del 1 al 99 estn
reservados para usuarios administradores del sistema. Para el
resto de usuarios se utiliza el rango del 100 al 60000. Se
reserva para el usuario nobod' el 60001 y para el usuario
noaccess el 60002.
?I-: nmero mayor de 0 que representa el grupo primario al que
pertenece el usuario.
@omentario: Nombre completo del usuario.
-irectorio home Bhome(director'C: ruta absoluta del directorio
home para el usuario.
Shel Blogin(shell C: Define la shell para el usuario (sh, ksh,
csh, etc..)
;etc;shado<
Contiene las contraseas de las cuentas de usuario, al ser un
fichero que puede comprometer la seguridad del sistema solo el usuario
root debe de tener permisos de lectura para el archivo. El contenido
del archivo es el siguiente:
root:SbEPJrMu/wMTw:6445::::::
daemon:NP:6445::::::
bin:NP:6445::::::
sys:NP:6445::::::
adm:NP:6445::::::
lp:NP:6445::::::
uucp:NP:6445::::::
nuucp:NP:6445::::::
dladm:*LK*:::::::
smmsp:NP:6445::::::
listen:*LK*:::::::
gdm:*LK*:::::::
webservd:*LK*:::::::
postgres:NP:::::::
nobody:*LK*:6445::::::
noaccess:*LK*:6445::::::
nobody4:*LK*:6445::::::
aulaunix:nMF64Wg9ff/HU:13570::::::
43
Comunidad OpenSolaris Hispano
El formato tiene la siguiente estructura:
I-login:pwd:lastchg:min:ma*:warn:inactivo:e*piracion:
Los datos que contiene cada lnea del fichero shadow son:
I-login: identificador de entrada al sistema.
pwd: contrasea del usuario cifrada.
lastchg: das transcurridos entre el 11 de enero de 1970 y
la ultima fecha de modificacin.
min: establece el mnimo nmero de das antes de cambiar la
contrasea.
ma*: establece el mximo numero de das que una contrasea
esta activa.
warn: el nmero de das de antelacin para el aviso al
usuario de la expiracin de la contrasea-
inactive: das que puede estar la cuenta inactiva (sin
entradas al sistema) antes de bloquearse.
e*piracion: Fecha de expiracin de la cuenta.
;etc;group;
Todos los usuarios del sistema tienen que pertenecer a un
grupo principal definido en el fichero %etc%passwd. Adicionalmente un
usuario puede pertenecer ms grupos disponibles en el sistema
denominados grupos secundarios definidos en el fichero %etc%group El
siguiente ejemplo muestra las entradas por defecto en el fichero
group:
root::0:
other::1:root
bin::2:root,daemon
sys::3:root,bin,adm
adm::4:root,daemon
uucp::5:root
mail::6:root
tty::7:root,adm
lp::8:root,adm
nuucp::9:root
staff::10:
daemon::12:root
sysadmin::14:
smmsp::25:
gdm::50:
webservd::80:
postgres::90:
44
Comunidad OpenSolaris Hispano
nobody::60001:
noaccess::60002:
nogroup::65534:
El formato tiene la siguiente estructura:
nonmbredelgrupo:group-password:?I-:listausuarios
Los datos que contiene cada lnea del fichero group son:
nonmbredelgrupo: contiene el nombre del grupo.
group-password: Utilizado en versiones mas antiguas de
unix. Actualmente no es utilizado.
?I-: nmero que identifica al grupo y debe nico en el
sistema.
listausuarios: contiene la lista de usuarios separados por
coma que pertenecen al grupo.
Gestin de usuarios
Crear usuario
El comando empleado para crear usuarios es useradd con las siguiente
sintaxis:
useradd Du uidE g DgidE ? Dgid&+gid3+ FE D-d dirE m Ds shellE Dc
commentE De e*pireE usuario
Los parmetros admitidos son los siguientes:
-u define un uid nico para el usuario.
-g define el grupo primario al que va a pertenecer el usuario.
-? define los grupos secundarios a los que va a pertenecer el
usuario.
-d define el path absoluto para el home del usuario.
-m fuerza la creacin del home del usuario si no existe.
-s define la shell para el usuario, por defecto asigna %bin%sh
-c establece el nombre completo del usuario o cualquier otro
comentario.
-o permite la duplicacin del uid del usuario.
-e fecha de expiracin de la cuenta.
-! tiempo mximo admitido de inactividad para la cuenta Si el
usuario no entra en el sistema en el tiempo establecido la cuenta
se bloquea.
45
Comunidad OpenSolaris Hispano
-0 permite la copia de archivos de inicializacin personalizados
al home del usuario al crearlo.
:jemplo de uso de useradd:
Crear usuario:
El siguiente ejemplo muestra como crear el usuario aula, definir
su UID manualmente e incluirlo en el grupo alumnos definiendo su home
en %e*port%home%aulauni*, definimimos la shell como ksh.
Ejecucin del comando:
# useradd -u 109 -g alumnos -d /export/home/aulaunix -m -s /bin/ksh -c
usuario de pruebas aula
Inmediatamente se aade la siguiente lnea al fichero %etc%passwd:
aula:x:109:100:usuarios de pruebas:/export/home/aulaunix:/bin/ksh
/odificar un usuario
Si ya tenemos un usuario en el sistema y deseamos cambiar alguna
de sus propiedades utilizamos el comando usermod:
Las opciones permitidas son:
-o permite la duplicacin de un UID
-m Mueve el home del usuario
-l Cambio del nombre de inicio de sesin
-! Definimos el nmero de das puede estar inactiva. Si la
cuenta no es usada en el nmero de das especificado se bloquea.
-e Define la fecha de caducidad de la cuenta. Cuando llega
ldicha fecha la cuenta es inutilizable.
:jemplo de uso del comando usermod!
Cambiamos el home del usuario dgalan a /home/nuevopath
#usermod -m -d /export/nuevohome dgalan
Este ejemplo implica que el nuevo home para el usuario dgalan es
%e*port%nuevohome y mueve todos los archivos del viejo directorio al
nuevo.
Vamos a ejecutar el ejemplo anterior pero adems vamos a cambiar
el nombre de inicio de sesin:
46
Comunidad OpenSolaris Hispano
#usermod -m -d /export/nuevohome -l davidgalan
Despus de ejecutar el comando tenemos un nuevo home y un nuevo nombre
de inicio de sesin.
9orrado de usuarios
Borrar un usuario del sistema es muy sencillo utilizando el comando
userdel
userdel -r [usuario a borrar]
La opcin -r elimina el home del usuario si este existe, pero no
borra los archivos que el usuario pueda tener repartidos en otros
directorios de la mquina.
Para eliminar todos los archivos del usuario deberamos de
recurrir a una bsqueda recursiva utilizando el comando !ind.
Buscaramos todos los archivos y directorios pertenecientes al usuario
eliminado.
:jemplo de borrado de usuario!
userdel -r dgalan
Borramos el usuario dgalan y los contenidos de su directorio home.
Cambiar la contrase>a de usuario
Para cambiar la contrasea de un usuario recurrimos al comando
passwd:
passwd DusuarioE
Ejemplo de cambio de contrasea:
bash-3.00# passwd dgalan
Nueva contrasea:
Vuelva a escribir la nueva contrasea:
passwd: la contrasea se ha cambiado por dgalan satisfactoriamente
bash-3.00#
Gestin de grupos
Hemos visto como crear, modificar y eliminar usuarios. Ahora
vamos a realizar el mismo recorrido pero esta vez gestionando grupos,
para ello utilizaremos los comandos:
groupadd
groupmod
groupdel
4
Comunidad OpenSolaris Hispano
&>adir un nuevo grupo al sistema
Para aadir un nuevo grupo al sistema recurrimos al comando
groupadd. El GID y el nombre del grupo han de ser nicos.
:jemplo para a>adir un grupo llamado
operadores:
bash-3.00# groupadd -g 124 admins
Lo verificamos:
bash-3.00# grep admins /etc/group
admins::124:
bash-3.00#
Hemos buscado el nuevo usuario en el fichero de grupos y
efectivamente se aada la nueva entrada de grupo.
/odificar un grupo
Podemos ejecutar cambios en un grupo existente con el comando
groupmod que nos permite modificar el GID o renombrar un grupo.
groupmod d D?I-E n Dnuevo nombre de grupoE
Este primer ejemplo cambia el GID para el grupo opera:
#groupmod -g 125 opera
Y este otro ejemplo cambia el nombre al grupo opera por monitor
#groupmod -n monitor opera
:liminar un grupo
Eliminar un grupo existente es muy facil con el comando groupdel
groupdel [nombre del grupo]
Ejemplo:
bash-3.00# groupdel admins
Cambio de grupos
Siempre que entramos al sistema lo hacemos perteneciendo al grupo
principal, pero un usuario que pertenece a varios grupos puede
necesitar operar en cada uno de ellos en diferentes momentos de su
sesin en el sistema.
Para cambiar de grupo recurrimos al comando newgrp+ veamos un
ejemplo practico:
Hemos entrado al sistema con el usuario dgalan tal como se puede ver
en el siguiente ejemplo:
4!
Comunidad OpenSolaris Hispano
$ id
uid=109(dgalan) gid=1(other)
Para pasarnos al grupo admin ejecutamos:
# newgrp admins
Lo verificamos:
$ id
uid=109(dgalan) gid=1(other) gid=45(admins)
A partir de este momento todos los ficheros y directorio creados
pertenecern al grupo admins.
?@uA hacen los usuarios en el sistemaB
:l comando <ho
Solaris al igual que el resto de sistemas Unix nos facilita una
serie de comandos que nos permite averiguar que usuarios estn
conectados al sistema y desde donde se han conectado.
El primero de estos comandos es who que muestra una lista con
todos los usuarios conectados al sistema mostrando datos como:
usuario
conexin
fecha de entrada
Ejemplo del comando who:
$ who
root console Sep 1 19:41
aula pts/1 Sep 1 19:45 (192.168.1.33)
$
:l comando <
Otro comando a nuestro alcance es w que muestra la lista de
usuarios en el sistema como el comando who pero aadiendo datos como
los procesos y carga de CPU.
Ejemplo del comando w:
$ w
9:05pm en funcionamiento 1:26, 2 usuarios, promedio de carga: 0,01, 0,01, 0,21
User tty login@ idle JCPU PCPU what
root console 7:41pm 1:21 -sh
aula pts/1 7:45pm 1 w
:l comando &inger
Muestra informacin detallada de los usuarios conectados al
sistema y detalles de usuarios de forma individual, es un comando
basado
4"
Comunidad OpenSolaris Hispano
Ejemplo de la salida del comando !inger para todos los usuarios:
finder: no encontrado
$ finger
Login Name TTY Idle When Where
root Super-User console 1:30 Sat 19:41
aula ??? pts/1 Sat 19:45 192.168.1.33
$
Ejemplo de la salida del comando !inger para obtener detalles de un
solo usuario:
Login name: root In real life: Super-User
Directory: / Shell: /sbin/sh
On since Sep 1 19:41:45 on console
1 hour 31 minutes Idle Time
No unread mail
No Plan.
El segundo ejemplo nos aporta informacin como la shell y el home
del usuario as como el tiempo conectado.
5$
Comunidad OpenSolaris Hispano
'rocesos ( se>ales
%ntroduccin
En este capitulo veremos como gestiona Solaris los procesos que
no difiere mucho del resto de unix existentes en el mercado.
Igualmente si provienes de Linux te resultar fcil adaptarte a las
singularidades de Solaris.
Cada programa que se ejecuta en el sistema se corresponde con uno o
varios procesos.
Solaris como cualquier sistema multiusuario permite a cualquier
usuario ejecutar ms de un proceso simultneamente, los procesos de
un mismo usuario pueden comunicarse entre si pero no con los procesos
de otro usuario. El usuario root es el nico que puede comunicarse con
todos los procesos en ejecucin.
Cada proceso est identificado por un PID nico y a su vez
tienen asociado un identificador de usuario (UID) y su grupo (GID).
3er los procesos en ejecucin
Uno de los comandos mas habituales para un administrador de
sistemas es sin duda el comando ps El comando ps permite ver los
procesos en ejecucin en el sistema y obtener informacin de cada uno
de ellos.
Veamos un ejemplo de la ejecucin del comando ps e!:
8%D '%D ''%D C ST%/: TTC T%/: C/D
root 0 0 0 23:51:57 ? 30:42 sched
root 1 0 0 23:51:58 ? 0:00 /sbin/init
root 2 0 0 23:51:58 ? 0:00 pageout
root 3 0 0 23:51:58 ? 0:01 fsflush
daemon 223 1 0 23:52:18 ? 0:00 /usr/sbin/rpcbind
root 7 1 0 23:51:58 ? 0:10 /lib/svc/bin/svc.startd
root 45 1 0 23:52:02 ? 0:00 /sbin/dhcpagent
root 9 1 0 23:51:58 ? 0:19 /lib/svc/bin/svc.configd
root 230 1 0 23:52:18 ? 0:00 /usr/lib/dmi/dmispd
root 419 1 0 23:52:29 ? 0:00 /usr/lib/autofs/automountd
root 139 1 0 23:52:14 ? 0:00 /usr/lib/sysevent/syseventd
root 71 1 0 23:52:09 ? 0:00 /usr/sfw/sbin/snmpd
5#
Comunidad OpenSolaris Hispano
La informacin que nos aporta la salida del comando:
UID: usuario propietario del proceso.
PID: nmero de identificacin del proceso.
PPID: nmero que identifica el proceso padre.
STIME: fecha en la que se arranc el proceso.
TTY: terminal del proceso.
CMD: programa en ejecucin.
La siguiente tabla contiene los parmetros ms tiles para utilizar
con el comando ps:
Parmetro Funcin
-a Muestra los procesos mas
solicitados.
-e Muestra todos los procesos en
ejecucin.
-f Muestra informacin ampliada
de los procesos.
-p Muestra el ID de la CPU
asociada al proceso.
-u Muestra todos los procesos de
un usuario especfico.
-c Muestra los datos con formato
planificacin y prioridad de
procesos.
-G Muestra los procesos
ejecutados por un grupo.
Los siguientes ejemplos muestran el uso del comando ps:
Ver los procesos pertenecientes al usuario aulauni*:
bash-3.00$ ps Du aulauni2
PID TTY TIME CMD
712 pts/1 0:00 bash
733 pts/1 0:00 ps
682 ? 0:01 sshd
684 pts/1 0:00 sh
Muestra los datos en formato planificacin:
bash-3.00$ ps Dc
PID CLS 'R% TTY TIME CMD
712 TS 49 pts/1 0:00 bash
734 TS 49 pts/1 0:00 ps
684 TS 59 pts/1 0:00 sh
La opcin ejecutada en el ejemplo con c muestra informacin
interesante como los valores CLS que indica el tipo de prioridad y
PRI que muestra la prioridad del proceso.
Muestra los procesos en ejecucin del grupo aulauni*:
bash-3.00$ grep -i aulaunix /etc/group
aulaunix::100:
52
Comunidad OpenSolaris Hispano
bash-3.00E ps DG F**
PID TTY TIME CMD
712 pts/1 0:00 bash
742 pts/1 0:00 ps
682 ? 0:01 sshd
684 pts/1 0:00 sh
Observa que el grupo es indicado con su GID que hemos obtenido
mirando su valor en el fichero %etc%group
:l comando prstat
El comando prstat muestra informacin de los procesos en
ejecucin ordenados por el uso de CPU. Ejemplo de la ejecucin del
comando prstat:
bash-3.00$ prstat
'%D 8S:R.&/: S%": RSS ST&T: 'R% .%C: T%/: C'8 'ROC:SS;.LG'
668 noaccess 159M 80M sleep 59 0 0:00:29 0,5% java/24
744 aulaunix 4492K 2644K cpu0 39 0 0:00:00 0,4% prstat/1
682 aulaunix 7952K 2100K sleep 59 0 0:00:00 0,0% sshd/1
712 aulaunix 2484K 1612K sleep 49 0 0:00:00 0,0% bash/1
131 root 3824K 2360K sleep 59 0 0:00:00 0,0% nscd/24
535 root 4444K 1724K sleep 59 0 0:00:00 0,0% dtlogin/1
670 root 7096K 2076K sleep 59 0 0:00:00 0,0% sendmail/1
1 root 2024K 1120K sleep 59 0 0:00:00 0,0% init/1
269 root 4416K 3052K sleep 59 0 0:00:03 0,0% inetd/4
278 root 2820K 1140K sleep 59 0 0:00:00 0,0% sh/1
214 root 2272K 900K sleep 59 0 0:00:00 0,0% cron/1
143 daemon 3932K 1968K sleep 59 0 0:00:00 0,0% kcfd/3
111 root 2156K 1296K sleep 59 0 0:00:00 0,0% snmpdx/1
258 root 1700K 896K sleep 59 0 0:00:00 0,0% sac/1
71 root 6556K 4572K sleep 59 0 0:00:00 0,0% snmpd/1
Total: 43 processes, 180 lwps, load averages: 0,02, 0,03, 0,31

En la siguiente lista puedes ver la informacin aportada por la
ejecucin del comando:
PID: identificador del proceso.
USERNAME: propietario del proceso.
SIZE: memoria virtual utilizada por el proceso.
STATE: estado del proceso, los estados del proceso pueden ser
cpu, sleep, run, zombie y stop.
PRI: prioridad del proceso.
NICE: valor para el calculo de la prioridad del proceso.
TIME: tiempo total que lleva el procesos ejecutandose.
CPU: porcentaje de CPU utilizado por el proceso.
PROCCESS: nombre del proceso.
El comando prstat proporciona diversos parmetros para obtener mas
informacin, los parmetros mas tiles son:
-t: muestra informacin agrupada por usuario.
53
Comunidad OpenSolaris Hispano
-p [1I-E: muestra solo la informacin para un solo proceso
identificado por su PID.
-n: nmero mximo de procesos mostrados
Se>ales
Los procesos en ejecucin puede ser necesario detenerlos por que
su funcionamiento no es el esperado, no responden o cualquier otra
causa. El comando 0ill nos permite enviar una seal al proceso para
que se detenga.
Las seales que podemos enviar son:
Nombre Nmero de
seal.
Descripcin
SIGHUP
# %e&al de corte de se&al, interrumpir la
se&al de la cone'i(n tele)(nica o un
terminal.
SIGINT
2 %e&al de *ontrol+* ,procedente del
teclado-
SIGKILL
" %e&al de eliminaci(n ning.n proceso
puede ignorar esta se&al.
SIGTERM
#5 /inalizar proceso de )orma ordenada.
0jemplo para una 1222, 32A4 etc..
para que cierre las cone'iones, )icheros
etc..
Formato de 0ill:
0ill seAal pidproceso
:jempo de kill
Matar una sesin ssh:
# adtasweb01 /var/opt/aat/d#ps -ef | grep ssh
root 449 1 0 Aug 20 ? 1:01 /usr/local/sbin/sshd
root 25618 449 0 17:51:52 ? 0:00 /usr/local/sbin/sshd -R
ora9 18084 18082 0 20:25:28 ? 0:00 /usr/local/sbin/sshd -R
ora9 8645 8476 0 20:22:26 ? 0:00 /usr/local/sbin/sshd -R
# kill -9 25618
#
La seal SIGHUP comnmente conocida como interrumpir una conexin
telefnica o de Terminal, esta seal puede provocar en servicios como
inetd que relean el fichero de configuracin.
Se>al en curso
En algn momento puede interesarnos ver todas las seales
enviadas a un proceso en ejecucin para ello recurrimos al comando
psig
Formato:
psig pid
Ejemplo de psig:
#psig 13936
54
Comunidad OpenSolaris Hispano
13936: /usr/lib/ssh/sshd
HUP default
INT default
QUIT default
ILL default
TRAP default
ABRT default
EMT default
FPE default
KILL default
BUS default
SEGV default
SYS default
PIPE ignored
ALRM caught 0x2d7fc RESETHAND,NODEFER
TERM default
USR1 default
USR2 default
CLD caught 0x40f14 0
PWR default
WINCH default
URG default
Seales de proceso:
Nombre Nmero de
seal.
Descripcin
SIGHUP
# %e&al de corte de se&al, interrumpir la
se&al de la cone'i(n tele)(nica o un
terminal.
SIGINT
2 %e&al de *ontrol+* ,procedente del
teclado-
SIGKILL
" %e&al de eliminaci(n ning.n proceso
puede ignorar esta se&al.
SIGTERM
#5 /inalizar proceso de )orma ordenada.
0jemplo para una 1222, 32A4 etc..
para que cierre las cone'iones, )icheros
etc..
SIGINT
3 %alir
SIGILL
4 5nstrucci(n ilegal.
SIGTRAP
5 4unto de ruptura
SIGABRT
6 Abortar
SIGEMT
6rap de emulaci(n
SIGFPE
! 0'cepci(n aritmtica
SIGBUS
#$ 0rror en bus
SIGSEGV
## /allo de segmentaci(n
SIGSYS
#2 3lamada al sistema err(nea
SIGPIPE
#3 4ipe rota
55
Comunidad OpenSolaris Hispano
SIGALRM
#4 /inalizada
Hrbol de procesos
Disponemos de un comando llamado ptree que nos permite ver los
procesos de forma jerrquica es decir podemos ver los procesos hijos
desplegados de forma arbrea. El comando ptree se lanza sin opciones,
veamos el ejemplo de su ejecucin:
adtasbac01 /opt/na#ptree
51 /usr/lib/sysevent/syseventd
60 /usr/lib/picl/picld
137 /usr/lib/sparcv9/cpudiagd -i
174 /usr/sbin/rpcbind
197 /usr/sbin/inetd -s
326 rpc.metad
5089 in.telnetd
5094 -ksh
16041 bash
28382 bash
15728 ptree
22123 in.telnetd
22125 -ksh
23114 bash
218 /usr/lib/nfs/statd
219 /usr/lib/nfs/lockd
221 /usr/lib/autofs/automountd
224 /usr/lib/autofs/automountd
235 /usr/sbin/syslogd
242 /usr/sbin/cron
263 /usr/sbin/nscd
266 /usr/lib/power/powerd
%nformacin sobre procesos!
A continuacin vamos a ver una serie de comandos que nos
aportaran informacin sobre los procesos en ejecucin.
3er las libreras en uso por un proceso,
Para averiguar las libreras en uso por un proceso recurrimos al
comando pldd:
pldd D1I- del procesoE
El siguiente ejemplo muestra las libreras utilizadas por el
proceso 6171 perteneciente a un servicio web de Sun Java:
# pldd 6717
6717: ../../bin/https/bin/Cgistub -f /tmp/https-admserv-98ccc083/.cgistub_88
/usr/lib/libsocket.so.1
/usr/lib/libnsl.so.1
/usr/lib/libC.so.5
/usr/lib/libm.so.1
/usr/lib/libw.so.1
56
Comunidad OpenSolaris Hispano
/usr/lib/libc.so.1
/usr/lib/libdl.so.1
/usr/lib/libmp.so.2
/usr/platform/sun4u-us3/lib/libc_psr.so.1
Descriptores de ficheros abiertos
El comando p!iles lista todos los descriptores de ficheros
abiertos por un proceso:
p!iles D1I- del procesoE
El resultado de la ejecucin del comando p!iles para un servicio
web es la siguiente:
# pfiles 6717
6717: ../../bin/https/bin/Cgistub -f /tmp/https-admserv-98ccc083/.cgistub_88
Current rlimit: 1024 file descriptors
1: S_IFCHR mode:*666 dev:85,1 ino:72269 uid:0 gid:3 rdev:13,2
O_RDWR
2: S_IFCHR mode:*666 dev:85,1 ino:72269 uid:0 gid:3 rdev:13,2
O_RDWR
/apa de espacio de direcciones
El comando pmap mustrela el uso que hace de la memoria un
proceso mostrando una mapa del espacio de direcciones:
pmap D1I- del proceso
E
El siguiente ejemplo muestra la salida del comando pmap:
Gpmap <H&H
<H&H: %%bin%https%bin%@gistub -! %tmp%https-admserv-IJcccKJL%cgistub(JJ
KKK&KKKK 3MN read%e*ec
%opt%app%SunOeb% %bin%https%bin%@gistub
KKK3MKKK JN read%write%e*ec
%opt%app%SunOeb%
K%bin%https%bin%@gistub
KKK3<KKK JN read%write%e*ec D heap E
55KJKKKK <JJN read%e*ec %usr%lib%libcso&
55&L@KKK L3N read%write%e*ec %usr%lib%libcso&
55&PKKKK 33MN read%e*ec %usr%lib%libmso&
55&5<KKK JN read%write%e*ec %usr%lib%libmso&
553KKKKK L&3N read%e*ec %usr%lib%lib@soQ
553Q@KKK L3N read%write%e*ec %usr%lib%lib@soQ
553<MKKK <MN read%write%e*ec %usr%lib%lib@soQ
553JKKKK QH<N read%e*ec %usr%lib%libnslso&
55L&KKKK MKN read%write%e*ec %usr%lib%libnslso&
55L&,KKK 3MN read%write%e*ec %usr%lib%libnslso&
55LLKKKK &<N read%e*ec %usr%lib%libmpso3
55LMMKKK JN read%write%e*ec %usr%lib%libmpso3
55LQKKKK JN read%write%e*ec %usr%lib%libdlso&
55L<KKKK JN read%e*ec %usr%plat!orm%sunMu-usL%lib%libc(psrso&
55LHKKKK JN read%write%e*ec D anon E
55LJKKKK MKN read%e*ec %usr%lib%libsoc0etso&
5
Comunidad OpenSolaris Hispano
55LI,KKK JN read%write%e*ec %usr%lib%libsoc0etso&
55L,KKKK JN read%e*ec %usr%lib%libwso&
55LPKKKK &I3N read%e*ec %usr%lib%ldso&
55L7KKKK JN read%write%e*ec %usr%lib%ldso&
55L73KKK JN read%write%e*ec %usr%lib%ldso&
55P7,KKK 3MN read%write%e*ec D stac0 E
total 3LH<N
%nformacin sobre las C'8
A continuacin veremos una serie de comandos que nos permiten
observar los procesos y la carga de trabajo de las CPU del sistema.
El comando ps pero en versin BSD alojado en /usr/ucb nos permite ver
el consumo de CPU y memoria de los procesos:
%usr%ucb%ps -au*
El siguiente ejemplo muestra los diez primeros procesos que mas
consumen recursos, se ha aade el comando head para que solo muestra
los diez primeros resultados:
/#usr/ucb/ps -aux |head
USER PID %CPU %MEM SZ RSS TT S START TIME COMMAND
root 792 0.5 0.271760 3528 ? S Aug 24 588:50 /usr/lib/mixer_app
root 3 0.4 0.0 0 0 ? S Aug 24 842:00 fsflush
j.vazque 20211 0.4 0.1 3040 1632 ? S 12:39:01 0:00 /usr/local/bin/cvs
root 790 0.2 1.713910434080 ? S Aug 24 230:50 /usr/bin/java -jar
root 438 0.2 1.04366418752 ? S Aug 24 189:06 /usr/openwin/bin/X
root 607 0.2 0.314600 5968 pts/2 S Aug 24 197:45 /usr/lib/gconfd-2
root 937 0.1 0.164576 1576 ? S Aug 24 144:52 /usr/lib/at-spi-re
root 677 0.1 0.176912 1800 ? S Aug 24 147:34 gnome-panel --sm-c
root 20213 0.1 0.1 1384 952 pts/6 O 12:39:33 0:00 usr/ucb/ps -aux
Los comandos psin!o y mpstat nos muestran estadsticas sobre el
estado de las CPU del sistema:
mpstat muestra la actividad de las CPU de forma individual, veamos la
ejecucin del comando mpstat:
CPU minf mjf 2cal intr ithr csw icsw migr smtx srw syscl usr s(s <t idl
1 7 1 120 412 309 168 4 21 3 0 638 1 4 0 95
3 7 1 13 115 107 179 7 21 3 0 633 1 3 0 96
La informacin ms importante que vemos en el resultado de la
ejecucin del comando es:
mj! que corresponde con fallos importantes.
min! que corresponde con fallos de menor importancia.
*cal aporta informacin sobre la llamada entre las CPU.
intr indica el nmero de interrupciones.
wt indica en % el tiempo consumido por los procesos de usuario.
s's tiempo de CPU consumido por los procesos del sistema.
El comando psrin!o mostrar el estado de las CPU y cuando se
iniciaron. Ejemplo de la salida del comando psrin!o:
#psrinfo
5!
Comunidad OpenSolaris Hispano
0 on-line since 10/04/07 09:03:13
1 on-line since 10/04/07 09:03:13
2 on-line since 10/04/07 09:03:13
3 on-line since 10/04/07 09:03:13
4 on-line since 10/04/07 09:03:13
5 on-line since 10/04/07 09:03:13
6 on-line since 10/04/07 09:03:13
7 on-line since 10/04/07 09:03:01
16 on-line since 10/04/07 09:03:13
17 on-line since 10/04/07 09:03:13
18 on-line since 10/04/07 09:03:13
19 on-line since 10/04/07 09:03:13
20 on-line since 10/04/07 09:03:13
21 on-line since 10/04/07 09:03:13
22 on-line since 10/04/07 09:03:13
23 on-line since 10/04/07 09:03:1
Trabajos planificados
:l comando at
El comando at permite la ejecucin de un trabajo una sola vez en
una fecha y hora determinada.
Sintaxis:
at [-m] [-r id_trabajo] [-q nombre_cola][-t hora] [fecha]
Parmetro Funcin
-m Cuando termina el trabajo enva un
correo al usuario.
-r Elimina un trabajo programado.
-) Establece nombre de cola.
-l Muestra los procesos en cola.
hora Establece la hora de ejecucin.
!echa Establece la fecha de ejeucin.
Ejemplos de utilizacin del comando at:
'rogramar un trabajo,
El siguiente ejemplo planifica la parada de un servidor web para
las 15:30:
# at 03:00 pm
at> /opt/servidorweb/stop.sh
at> <pulsa Control-d para finalizar>
at> <EOT>
commands will be executed using /sbin/sh
job 1195653600.a at Wed Nov 21 15:00:00 2007
#
El ejemplo primero establece la hora con at KL:KK pm
seguidamente introducimos el comando que se va a
5"
Comunidad OpenSolaris Hispano
ejecutar /opt%servidorweb%stopsh y salimos pulsando Control-d.
Observa que el comando nos devuelve el nombre del trabajo job
&&IQ<QL<KKa
3er los trabajos en espera de ejecucin,
El comando at l muestra los trabajos pendientes y su hora de
ejecucin:
# at -l
user = root 1195653600.a Wed Nov 21 15:00:00 2007
#
El ejemplo muestra el trabajo &&IQ<QL<KKa que se ejecutar el
Mircoles 21 de Noviembre a las 15:00.
:liminar un trabajo programado,
Para eliminar la ejecucin de un trabajo programado utilizamos el
comando at r nombredeltrabajo :
El siguiente ejemplo muestra como eliminar un trabajo:
# at -r 1195653600.a
'ermitir la ejecucin del comando at
No todos los usuarios del sistema pueden ejecutar el comando at+
para autorizar o denegar el uso del comando at hay que editar los
ficheros %etc%crondatden' o %etc%crond%atallow ambos ficheros de
root.
El fichero atden' contiene los usuarios a los que se deniega el uso
del comando at:
Contenido del fichero atden':
# cat /etc/cron.d/at.deny
daemon
bin
smtp
nuucp
listen
nobody
noaccess
El fichero atallow contiene los usuarios que pueden ejecutar el
comando at, en ocasiones el fichero puede no existir por lo que hay
que crearlo.
Contenido del fichero atallow:
6$
Comunidad OpenSolaris Hispano
# cat /etc/cron.d/at.allow
web
ldap
dgalan
Logs de at
Toda la actividad realizada con el comando at queda registrada en
el log ubicado en %var%cron%log.
Crontab
El comando crontab permite la ejecucin de tareas programadas y
forma repetitiva.
A modo de ejemplo prctico permite tareas como:
Programar un backup que se ejecute solamente por la noche los
martes y jueves de cada semana.
Un proceso que se ejecute cada cinco minutos los lunes, mircoles
y viernes.
Un parada de un servicio todos los domingos a las 12:00.
Cuando programamos una tarea con el comando crontab estas se
almacenan en %var%spool%cron%crontabs
El comando crontab almacena la informacin en diferentes lneas
con el siguiente formato:
& 3 L M Q %usr%local%bin%iniciobac0upsh
Comienza con cinco campos separados por espacios seguido de la
tarea a ejecutar. Los cinco campos representan:
Campo Descripcin
1 El primer campo contiene los minutos.
Valores entre 0 y 59.
2 El segundo campo tiene la hora. Valores
entre 0 y 23.
3 Da del mes, valore entre 1 y 31.
4 El mes del ao, valores entre 1 y 12.
5 Da de la semana, valores entre 0 y 6.
8sando crontab
El comando crontab permite ver, crear, modificar o eliminar un
trabajo planificado.
3er tareas planificadas
6#
Comunidad OpenSolaris Hispano
Para ver las tareas planificadas ejecutamos el comando crontab l
obteniendo la lista de tareas programas:
# crontab -l
#ident "@(#)root 1.20 01/11/06 SMI"
#
# The root crontab should be used to perform accounting data collection.
#
# The rtc command is run to adjust the real time clock if and when
# daylight savings time changes.
#
10 3 * * * /usr/sbin/logadm
15 3 * * 0 /usr/lib/fs/nfs/nfsfind
1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1
30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean
#10 3 * * * /usr/lib/krb5/kprop_script ___slave_kdcs___
Cada usuario solo puede ver sus propias planificaciones siendo
una excepcin el usuario root que puede ver la planificacin de
cualquier usuario del sistema utilizando el comando crontab de la
siguiente forma:
crontab l nombre(de(usuario
:ditor o crear entradas en el crontab
En los siguientes ejemplos vamos a mostrar como editar el crontab
para editar o aadir nuevas entradas.
Para comenzar tenemos que establecer el editor por defecto
ejecutando:
EDITOR=vi
export EDITOR
Abrimos el fichero crontab ejecutando:
crontab -e
Ahora veremos en el editor vi las diferentes entradas
programadas:
# The root crontab should be used to perform accounting data collection.
#
# The rtc command is run to adjust the real time clock if and when
# daylight savings time changes.
#
10 3 * * * /usr/sbin/logadm
15 3 * * 0 /usr/lib/fs/nfs/nfsfind
1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1
30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean
#10 3 * * * /usr/lib/krb5/kprop_script ___slave_kdcs___
Con el editor vi podemos aadir nuevas lneas, modificar las
existentes o eliminar entradas para eliminarlas de la planificacin.
62
Comunidad OpenSolaris Hispano
La siguiente tabla muestra ejemplos de entradas crontab:
:ntrada en el crontab Descripcin
0 0 * *
* /opt/miscript.sh
Se ejecuta todos los das a
las 00.00
30 6 9 *
* /opt/miscript.sh
Se ejecuta el da 9 de cada
mes las 6:30.
00 7 1,3,7,12,15,20 *
* /opt/miscript.sh
Se ejecuta los das
1,2,3,4,5,6 de cada mes a
las 19:00
0,10,20,30,40,50 * * *
* /opt/miscript.sh
Se ejecuta cada diez minutos
'ermitir la ejecucin del comando crontab
No todos los usuarios del sistema pueden ejecutar el comando
crontab+ para autorizar o denegar el uso del comando at hay que editar
los ficheros %etc%crondatden' o %etc%crond%atallow ambos ficheros
de root.
El fichero atden' contiene los usuarios a los que se deniega el uso
del comando at:
Contenido del fichero atden':
# cat /etc/cron.d/at.deny
daemon
bin
smtp
nuucp
listen
nobody
noaccess
El fichero atallow contiene los usuarios que pueden ejecutar el
comando at, en ocasiones el fichero puede no existir por lo que hay
que crearlo.
Contenido del fichero atallow:
# cat /etc/cron.d/at.allow
web
ldap
dgalan
63
Comunidad OpenSolaris Hispano
Gestin de discos
El siguiente capitulo comprende la gestin de discos con
OpenSolaris 2008.05 aprendiendo a configurar y dividir el disco en
particiones. Tambin aprenderemos el nuevo sistema de ficheros ZFS
(Zettabyte) incorporado a OpenSolaris 2008.05 .
.ombres de Dispositivos
Solaris gestiona los nombres de los dispositivos con la
siguiente referencia:
-ispositivos lgicos: son nombres sencillos para una
identificacin cmoda e intuitiva de un dispositivo. Los
dispositivos de disco estn en los directorios %dev %ds0
para acceso a dispositivos mediante bloques y %dev%rds0
para acceso a dispositivos mediante raw o character .
Un nombre lgico se forma de la siguiente forma: numero de
controladora, numero de target , el numero de disco y su particin.
E l siguiente ejemplo muestra un nombre de dispositivo lgico con
su respectivo enlace a un dispositivo fsico:
bash-3.00# cd /dev/dsk
bash-3.00# ls -l
lrwxrwxrwx 1 root root 50 Dec 19 16:59 c0d0s0
->../../devices/pci@0,0/pci-ide@7,1/ide@0/cmdk@0,0:a
64
Comunidad OpenSolaris Hispano
lrwxrwxrwx 1 root root 50 Dec 19 16:59 c0d0s1
->../../devices/pci@0,0/pci-ide@7,1/ide@0/cmdk@0,0:b
..
..
-ispositivos !$sicos: los nombres para los dispositivos
fsicos identifican su ubicacin en el hardware de la
mquina. Son mas complejos de utilizar en la administracin
diaria por lo que es mas prctico la utilizacin de los
nombres lgicos. Ejemplo de un dispositivo fsico:
%devices%pciRK+K%pci-ideRH+&%ideRK Cada nodo esta separado
con una / que se corresponde tambin con su ruta en disco,
es decir podemos ir al directorio ejecutando:
cd %devices%pciRK+K%pci-ideRH+&%ideRK
/ombres de instancia: es un nombre de dispositivo abreviado
que es creado por el propio kernel. Un ejemplo del uso de
los nombres de instancia lo encontramos en la ejecucin del
comando i!con!ig a donde podemos ver en negrita el nombre
de la instancia que corresponde con la interfaz de red:
#ifconfig -a
lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
hme*: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
inet 10.65.164.155 netmask fffffc00 broadcast 10.65.167.255
karol@un19009>>
3er los dispositivos con prtconf
Para obtener informacin sobre todos los dispositivos instalados
en el sistema ejecutamos el comando prtcon!:
aulaunix@aulaunix>> prtconf | grep -v not
System Configuration: Sun Microsystems sun4u
Memory size: 384 Megabytes
System Peripherals (Software Nodes):
SUNW,Ultra-1
options, instance #0
sbus, instance #0
zs, instance #0
zs, instance #1
SUNW,fas, instance #0
sd, instance #0
sd, instance #6
SUNW,hme, instance #0
SUNW,ffb, instance #0
pseudo, instance #0
La opcin de grep -v not mostrada en el ejemplo es aadida
para que no muestre los dispositivos que no tienen el driver cargado.
Si no ponemos dicha opcin que aparecen con el texto driver not
attached
Si ejecutamos el comando prtcon! con la opcin v
obtenemos mas detalles sobre todos los dispositivos del sistema.
65
Comunidad OpenSolaris Hispano
3er los dispositivos con ;etc;pathItoIinst
Todos los dispositivos reconocidos por el sistema son
registrados en el fichero %etc%path(to(inst que contiene una lista de
los dispositivos y su nombre de instancia. Un ejemplo del contenido
del archivo:
aulaunix@aulaunix>> more path_to_inst
#
# Caution! This file contains critical kernel state
#
"/sbus@1f,0" 0 "sbus"
"/sbus@1f,0/sbusmem@2,0" 2 "sbusmem"
"/sbus@1f,0/SUNW,fas@e,8800000" 0 "fas"
"/sbus@1f,0/SUNW,fas@e,8800000/ses@4,0" 4 "ses"
"/sbus@1f,0/SUNW,fas@e,8800000/ses@5,0" 5 "ses"
"/sbus@1f,0/SUNW,fas@e,8800000/st@6,0" 6 "st"
"/sbus@1f,0/SUNW,fas@e,8800000/sd@f,0" 14 "sd"
"/sbus@1f,0/SUNW,fas@e,8800000/st@4,0" 4 "st"
"/sbus@1f,0/SUNW,fas@e,8800000/st@0,0" 0 "st"
"/sbus@1f,0/SUNW,fas@e,8800000/st@1,0" 1 "st"
"/sbus@1f,0/SUNW,fas@e,8800000/sd@8,0" 7 "sd"
"/sbus@1f,0/SUNW,fas@e,8800000/sd@9,0" 8 "sd"
"/sbus@1f,0/sbusmem@3,0" 3 "sbusmem"
"/sbus@1f,0/SUNW,CS4231@d,c000000" 0 "audiocs"
"/sbus@1f,0/sbusmem@f,0" 6 "sbusmem"
"/sbus@1f,0/SUNW,hme@e,8c00000" 0 "hme"
"/sbus@1f,0/zs@f,1000000" 1 "zs"
"/sbus@1f,0/SUNW,bpp@e,c800000" 0 "bpp"
"/sbus@1f,0/zs@f,1100000" 0 "zs"
"/sbus@1f,0/SUNW,fdtwo@f,1400000" 0 "fd"
"/options" 0 "options"
"/scsi_vhci" 0 "scsi_vhci"
"/SUNW,ffb@1e,0" 0 "ffb"
"/pseudo" 0 "pseudo"
3er discos con format
Para ver los discos reconocidos por el sistema ejecutamos el
fomando !ormat:
AVAILABLE DISK SELECTIONS:
0. c0d0 <DEFAULT cyl 4092 alt 2 hd 128 sec 32>
/pci@0,0/pci-ide@7,1/ide@0/cmdk@0,0
1. c0d1 <DEFAULT cyl 2044 alt 2 hd 128 sec 32>
/pci@0,0/pci-ide@7,1/ide@0/cmdk@1,0
Specify disk (enter its number):
El comando format muestra los discos reconocidos por el sistema.
Para salir pulsamos ctrl S c. Muestra los discos numerados y con su
nombre de dispositivo asignado. No olvidar que cada particin viene
definida en el nombre lgico por la letra s (slice), es decir que para
el disco c0t0d0 las particiones son c0t0d0s0, c0t0ds1, c0t0d0s2 etc..
66
Comunidad OpenSolaris Hispano
%nstalar ( configurar un nuevo disco
Hemos visto como ver los dispositivos instalados en una mquina
y ahora vamos a explicar como reconocer un nuevo disco instalado en la
mquina para su divisin en particiones.
Cuando queremos aadir un nuevo disco al sistema pueden ocurrir
dos circunstancias: aadir el disco con la mquina arrancada por que
alberga un servicio 24x7 o tenemos que parar sistema y hardware para
instalar el disco. La primera opcin es viable con el hardware
apropiado obligando al sistema a detectar el nuevo disco sin
reiniciar.
Detectando nuevo hard<are parando el sistema
Para una mquina que no admite aadir discos en caliente tenemos
que realizar una parada completa de la mquina para aadir el nuevo
hardware. Para reconocer nuevo componente en el sistema actuaramos
de la siguiente forma:
1. Realizamos una copia del fichero %etc%path(to(inst
2. Creamos el fichero %recon!igure ejecutando: touch %recon!igure
esto obliga al sistema en el prximo arranque a detectar y
reconfigurar todo el hardware.
3. Paramos la mquina con init 5.
4. Instalamos el nuevo hardware.
5. Arrancamos nuevamente la mquina.
6. Ejecutamos el comando prtcon! para ver si esta el nuevo
hardware, tambin podemos comparar con el comando di!! el backup
del fichero %etc%path(to(inst con el nuevo siendo las diferencias
el nuevo hardware instalado.
Detectando nuevo hard<are online
Ahora vamos a proceder a reconocer un nuevo disco sin necesidad
de detener la mquina para ello ejecutamos el comando dev!sadm
La ejecucin de este comando implica la regeneracin de los
directorios:
/dev
/devices
Actualizacin del fichero %etc%path(to(inst
Antes de la ejecucin del comando dev!sadm es recomendable
realizar un backup del fichero %etc%path(to(inst para poder realizar
una comparacin entre el backup y el nuevo fichero %etc%path(to(inst
generado por el comando dev!sadm La comparacin de ambos fichero nos
mostrara el nuevo hardware detectado.
Ejemplo de la comparacin del fichero %etc%path(to(inst antes de
la ejecucin dev!sadm y el nuevo fichero generado por dev!sadm:
# diff path_to_inst path_to_inst.backup
30d29
< "/pci@0,0/pci1000,30@10/sd@0,0" 0 "sd"
6
Comunidad OpenSolaris Hispano
Ejecutamos el comando prtcon! para ver si esta el nuevo hardware
detectado por el sistema.
Crear nuevas particiones en disco
El nuevo disco ya es visible para sistema y podemos proceder
a crear las particiones (slices). Para crear las particiones
utilizamos el comando !ormat Los pasos a seguir son los siguientes:
Seleccionar el disco
Crear las particiones
Etiquetar el nuevo disco
Crear el sistema de ficheros
Montar el disco
Ejecutamos el comando !ormat y veremos el siguiente men:
# format
Searching for disks...done
AVAILABLE DISK SELECTIONS:
0. c0d0 <DEFAULT cyl 4092 alt 2 hd 128 sec 32>
/pci@0,0/pci-ide@7,1/ide@0/cmdk@0,0
1. c0d1 <DEFAULT cyl 2044 alt 2 hd 128 sec 32>
/pci@0,0/pci-ide@7,1/ide@0/cmdk@1,0
2. c1d1 <DEFAULT cyl 1021 alt 2 hd 64 sec 32>
/pci@0,0/pci-ide@7,1/ide@1/cmdk@1,0
3. c2t0d0 <DEFAULT cyl 2045 alt 2 hd 128 sec 32>
/pci@0,0/pci1000,30@10/sd@0,0
Specify disk (enter its number):

En el men de !ormat muestra de forma numerada los discos
disponibles con su nombre de lgico, seleccionamos el disco con el que
queremos trabajar y pulsamos intro:
selecting c1d1
Controller working list found
[disk formatted, defect list found]
FORMAT MENU:
disk - select a disk
type - select (define) a disk type
partition - select (define) a partition table
current - describe the current disk
format - format and analyze the disk
fdisk - run the fdisk program
repair - repair a defective sector
show - translate a disk address
label - write label to the disk
analyze - surface analysis
defect - defect list management
backup - search for backup labels
verify - read and display labels
save - save new disk/partition definitions
volname - set 8-character volume name
6!
Comunidad OpenSolaris Hispano
!<cmd> - execute <cmd>, then return
quit
La utilizad !ormat nos muestra un nuevo men donde vamos a elegir
la opcin partition Para entrar en la utilizad de particiones
tecleamos partition y pulsamos intro; nos mostrara un nuevo men:
PARTITION MENU:
0 - change `0' partition
1 - change `1' partition
2 - change `2' partition
3 - change `3' partition
4 - change `4' partition
5 - change `5' partition
6 - change `6' partition
7 - change `7' partition
select - select a predefined table
modify - modify a predefined partition table
name - name the current table
print - display the current table
label - write partition map and label to the disk
!<cmd> - execute <cmd>, then return
quit
partition>
Ahora teclea print para ver la tabla de particiones que existe
actualmente:
partition> print
Current partition table (original):
Total disk cylinders available: 2044 + 2 (reserved cylinders)
Part Tag Flag Cylinders Size Blocks
0 unassigned wm 0 0 (0/0/0) 0
1 unassigned wm 0 0 (0/0/0) 0
2 backup wu 0 - 2043 3.99GB (2044/0/0) 8372224
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 unassigned wm 0 0 (0/0/0) 0
7 unassigned wm 0 0 (0/0/0) 0
8 boot wu 0 - 0 2.00MB (1/0/0) 4096
9 alternates wm 1 - 2 4.00MB (2/0/0) 8192
La particin numero dos es solo informativa y muestra el tamao
total del disco disponible. Podemos definir hasta siete particiones,
por lo tanto tenemos que planificar bien las particiones que queremos
crear.
El comando print muestra el estado actual de las particiones y la
informacin es:
1art: numero de la particin
8ag: etiqueta predefinida.. Los valores posibles son:
o unassigned
o boot
o root
o swap
o usr
o backup
6"
Comunidad OpenSolaris Hispano
o stand
o home
o alternates
5lag: etiqueta predefinida. Los valores posibles son:
o wm: la particin se puede leer y escribir. Se puede
montar
o wu: la particin es solo de lectura y no se pude
montar.
o rm: la particin es solo de lectura y se puede montar.
o ru: la particin es solo de lectura y no se puede
montar
@'linders: Numero de cilindro de comienzo y final de la
particin.
Si"e: tamao de la particin
Ploc0s: numero total de cilindros y bloques de la particin.
Para crear una particin seguimos los siguientes pasos:
- seleccionamos la particin 0, tecleamos K y pulsamos intro:
Part Tag Flag Cylinders Size Blocks
0 unassigned wm 0 0 (0/0/0) 0
- Seguidamente nos pregunta el valor para el tag Tecleamos T y
pulamos intro para que muestre todos los valores posibles.
Elegimos la opcin alternates ya que ninguna de las opciones
mostradas ser el uso final del disco.
Enter partition id tag[unassigned]: ?
Expecting one of the following: (abbreviations ok):
unassigned boot root swap
usr backup stand var
home alternates reserved
Enter partition id tag[unassigned]: alternates
- Ahora tenemos que definir los permisos para la particin,
elegimos la opcin por defecto wm que permite la escrita en
disco y su montaje.
Enter partition permission flags[wm]:
- Ahora nos pedir el cilindro de inicio. Esta opcin la dejamos
por defecto para que el sistema la complete:
Enter new starting cyl[1]:
- Definimos el tamao para la particin. Para nuestro ejemplo
definimos un 1gb:
Enter partition size[0b, 0c, 1e, 0.00mb, 0.00gb]: 1gb
$
Comunidad OpenSolaris Hispano
- Tecleamos print para ver el resultado:
partition> print
Current partition table (unnamed):
Total disk cylinders available: 2044 + 2 (reserved cylinders)
Part Tag Flag Cylinders Size Blocks
0 alternates wm 1 - 512 1024.00MB (512/0/0) 2097152
1 unassigned wm 0 0 (0/0/0) 0
2 backup wu 0 - 2043 3.99GB (2044/0/0) 8372224
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 unassigned wm 0 0 (0/0/0) 0
7 unassigned wm 0 0 (0/0/0) 0
8 boot wu 0 - 0 2.00MB (1/0/0) 4096
9 alternates wm 1 - 2 4.00MB (2/0/0) 8192
Podemos observar que la particin denominada K tiene asignado un
tamao de 1024MB.
- Si todo es correcto tecleamos el comando label para grabar la
informacin de la particin:
partition> label
Ready to label disk, continue? y
Repetiremos el proceso para el resto de particiones que
necesitamos crear. Cuando finalicemos podemos salir de la utilidad
format tecleando el comando )uit.
Crear una nueva tabla de particiones
Si al ejecutar el comando partition de la utilidad !ormat
responde el siguiente mensaje: 1lease run !dis0 !irst debemos ejecutar
el comando !dis0 para crear la tabla de particiones. El siguiente
ejemplo muestra la ejecucin del comando:
format> partition
Please run fdisk first.
format> fdisk
No fdisk table exists. The default partition for the disk is:
a 100% "SOLARIS System" partition
Type "y" to accept the default partition, otherwise type "n" to edit the
partition table.
y
Al teclear !dis0 y pulsar intro nos informa de que va a crear una
tabla de particiones por defecto y nos pide confirmacin. Tecleamos '
pulsamos intro. Ya podemos continuar gestionando el disco.
La 3TOC
Todos los discos en Solaris tienen un rea especial que esta
definida para almacenar toda la informacin sobre el controlador de
#
Comunidad OpenSolaris Hispano
disco y sus particiones. A esta informacin sobre las particiones se
la denomina label y contiene informacin sobre las particiones que
contiene el disco como su tamao, los lmites de inicio y final de
cada particin con datos sobre los cilindros.
Para ver la informacin de la VTOC dentro de la utilidad !ormat
seleccionamos el disco y ejecutamos el comando veri!'
9ackup la 3TOC
Para realizar un backup de la VTOC hay que ejecutar el comando
prtvtoc redirigiendo la salida a un archivo que contendr el backup de
la VTOC. Ejemplo:
prtvtoc /dev/rdsk/c0d1s0 > /backup/vtoc/cod1s0
Restaurar la 3TOC
Restaurar nuevamente la VTOC es sencillo con el comando
!mthard:
!mthard s bac0updelavtoc disodestinodelavtoc
Ejemplo sobre la restauracin de una VTOC:
# fmthard -s /backup/vtoc/cod1s0 /dev/rdsk/c0d1s0
fmthard: New volume table of contents now in place.
.ota: los comandos !mthard y prtvtoc necesitan tener acceso a los
discos en modo raw por lo que hay que utilizar siempre la ruta
%dev%rds0%nombre(del(disco
Sistema de ficheros 8#S
Hemos visto como crear los slices o particiones con la utilidad
!ormat ahora hay que crear un sistema de ficheros por cada particin
creada y posteriormente poder montarla. El comando que permite la
creacin de un sistema de ficheros ufs es new!s
Creacin del sistema de ficheros 8#S
El siguiente ejemplo muestra la ejecucin del comando new!s que
solicita confirmacin antes de ejecutar el comando ya que borra de
forma irreversible todos los datos.
# newfs /dev/rdsk/c0d1s0
newfs: construir un nuevo sistema de archivos /dev/rdsk/c0d1s0: (y/n)? y
/dev/rdsk/c0d1s0: 8368128 sectores en 2043 cilindros de 128 pistas, 32
sectores
4086,0MB en 79 grupos de cilindros (26 c/g, 52,00MB/g, 6400 i/g)
copias de seguridad super-bloque (para fsck -F ufs -o b=#) en:
32, 106560, 213088, 319616, 426144, 532672, 639200, 745728, 852256, 958784,
7350464, 7456992, 7563520, 7670048, 7776576, 7883104, 7989632, 8096160,
2
Comunidad OpenSolaris Hispano
8202688, 8309216
El comando newu!s utiliza el acceso a disco en modo raw por lo
que siempre hay que darle la ruta del dispositivo %dev%rds0. Si
creamos varias particiones o slices tenemos que ejecutar el comando
new!s por cada una de ellas. Recordar que cada particin viene
definida en el nombre lgico por la letra s (slice), es decir que para
el disco c0t0d0 las particiones son c0t0d0s0, c0t0ds1, c0t0d0s2 etc..
:l directorio lostJfound
Cuando el comando newu!s crea el nuevo sistema de ficheros
reserva un pequeo porcentaje de disco para crear el directorio lost
+found en el que se guarda la informacin necesaria para una posible
reparacin del disco con la utilidad !sc0 Este espacio reservado se
le denomina minfree.
/ontar el nuevo sistema de ficheros
Ya tenemos creado el sistema de ficheros utilizando el comando
newu!s ahora hay que definir un punto de montaje y montar el disco.
El comando que nos permite montar un sistema de ficheros es
mount El siguiente ejemplo crea un punto de montaje y monta la
particin:
# mkdir /nuevodisco
# mount /dev/dsk/c0d1s0 /nuevodisco/
# cd /nuevodisco/
# ls
lost+found
Si ejecutamos el comando d! 0h veremos el nuevo sistema de
ficheros montado:
# df -kh
Sistema de archivos tamao usados aprovechar capacidad Montado en
/dev/dsk/c0d0s0 4,6G 3,2G 1,4G 70% /
/devices 0K 0K 0K 0% /devices
ctfs 0K 0K 0K 0% /system/contract
proc 0K 0K 0K 0% /proc
mnttab 0K 0K 0K 0% /etc/mnttab
swap 341M 648K 341M 1% /etc/svc/volatile
objfs 0K 0K 0K 0% /system/object
/usr/lib/libc/libc_hwcap1.so.1
4,6G 3,2G 1,4G 70% /lib/libc.so.1
fd 0K 0K 0K 0% /dev/fd
swap 341M 520K 341M 1% /tmp
swap 341M 96K 341M 1% /var/run
/dev/dsk/c0d0s7 2,8G 86M 2,6G 4% /export/home
/export/home/aulaunix
2,8G 86M 2,6G 4% /home/aulaunix
;dev;dsk;c*dFs* KLMG NL*/ KLMG FO ;nuevodisco
Hemos finalizado todo el proceso y ya podemos comenzar a utilizar
el sistema de ficheros.
3
Comunidad OpenSolaris Hispano
:l comando mount
El comando mount lo utilizaremos para montar unidades de forma
manual desde una particin de un disco, a un CDROM o un disquete.
La sintaxis del comando mount es:
mount DopcionesE DdispositivoE Dpunto de montajeE
Las opciones mas interesantes de las que disponemos son:
- ro: monta el sistema de fichero para solo lectura.
- noatime: no guarda informacin sobre el ultimo acceso a
los ficheros. Si esta informacin son es imprescindible
aumentamos el rendimiento.
- nolarge!ile: no permite ficheros con un tamao superior a
2GB.
El siguiente ejemplo monta un sistema de ficheros con todas las
opciones que hemos visto:
mount -o ro,noatime,nolargefiles /dev/dsk/c0d1s0 /nuevodisco
Para montar un sistema de ficheros diferente a ufs utilizamos el
mount con el parmetro 5 Los sistemas de ficheros soportados por
Solaris son:
ufs: sistema de ficheros UNIX estndar.
pcfs: sistema de ficheros que permite acceder a FAT32 para
lectura y escritura.
hsfs: sistema de ficheros High Sierra es el estndar para los
CDROM.
udf: de Formato de Disco Universal con soporte operaciones de
lectura y escribe sobre DVD y CD.
El siguiente ejemplo muestra como montar un sistema de
ficheros FAT32
#mount -F pcfs /dev/dsk/c0t0d0s0 /midisco/
Desmontar un sistema de ficheros
Desmontar un sistema de ficheros es sencillo solo tenemos que
ejecutar el comando umount seguido del punto de montaje. Un ejemplo
para desmontar una unidad:
#umount /nuevodisco
3er el tipo de un sistema de ficheros
Para averiguar el formato de un sistema de ficheros utilizamos
el comando !st'p:
4
Comunidad OpenSolaris Hispano
El siguiente ejemplo muestra como obtener la informacin sobre el
sistema de ficheros de %dev%ds0%cKd&sK:
# bash
bash-3.00# fstyp /dev/dsk/c0d1s0
ufs
/ontar un disco de forma permanente
Hasta el momento todos los comandos que hemos ejecutados no
permanecen si reiniciamos la mquina. Es decir si montamos un disco y
lo utilizamos en el prximo arranque no esta montado y solo veremos su
punto de montaje. Para dejar una unidad montada de forma permanente
en el sistema tenemos que aadir los datos al fichero %etc%v!stab.
El contenido del v!stab es ledo en el arranque del sistema y
montadas todas las unidades que en el se encuentran. En contenido del
fichero es el siguiente:
Se compone de siete campos separados por tabulacin y los campos
sin valor se representan con un guin -. Los campos que contiene
son:
device to mount: dispositivo que se va montar con su nombre
lgico. Ejemplo /dev/dsk/cd1s0s0
device to !sc0: dispositivo que cuqueara la utilidad fsck con
formato raw. Ejemplo /dev/rdsk/cd1s0s0.
mount point: directorio que se establece como punto de montaje.
5S t'pe: tipo de sistema de ficheros que se va montar.
!sc0 pass: activa el chequeo en al arranque. Se activa con un
nmero como valor, excepto 0 que desactiva el chuequeo.
mount at boot: con valor 'es se monta el sistema de ficheros en
el arranque, y con valor no se queda sin montar. Esto es
utilizado para una desactivacin temporal del sistema de
ficheros.
mount options: opciones separadas por comas que se pasan al
comando mount cuando se monta file systems. Un ejemplo puede ser
montarlo solo en modo lectura.
Para aadir una particin de forma permanente al sistema editamos
el archivo %etc%v!stab y aadimos la nueva lnea:
5
Comunidad OpenSolaris Hispano
/dev/dsk/c0d1s0 /dev/rdsk/c0d1s0 /nuevodisco ufs 1 yes -
En el prximo arranque el sistema montara automticamente el
sistema de ficheros.
:l comando umount
El comando umount permite desmontar un sistema de ficheros, su
uso es muy sencillo:
umount Dnombre dispositivo a desmontar o nombre punto de montajeE
Ejemplo:
bash-3.00# df -k
Sistema de archivos kbytes usados aprovechar capacidad Montado en
/export/home/aulaunix 2899319 87603 2753730 4% /home/aulaunix
/dev/dsk/c0d1s0 4119582 4105 4074282 1% /nuevodisco
bash-3.00#
bash-3.00# umount /nuevodisco
Con la opcin ! en el comando umount desmontamos de forma
forzosa el sistema de ficheros, si lo hacemos de esta manera podemos
generar daos o inconsistencias de ficheros que estuvieran siendo
utilizados por una aplicacin.
Consideraciones para desmontar un files(tem
Para desmontar un disco con seguridad ningn usuario o aplicacin
tiene que estar haciendo uso del filesystem. Si al intentar desmontar
un disco nos da el mensaje de ocupado es porque hay accesos al file
system y al desmontarlo podemos generar errores en una aplicacin.
Ejemplo de aviso al intentar desmontar un disco:
bash-3.00# umount /nuevodisco/
umount: /nuevodisco ocupado
bash-3.00#
Para averiguar que procesos estn haciendo uso de un file system
recurrimos al comando !user
G!user -cu %nuevodisco
6
Comunidad OpenSolaris Hispano
"#S
%ntroduccin a "#S
ZFS (Zettabyte File System ) es el nuevo sistema de archivos
incorporado a OpenSolaris. Es un sistema de archivos de 128 bits y su
lmite de tamao mximo es de 256 cuatrillones de zettabytes
1
.
En la wikipedia se hace la siguiente referencia sobre la capacidad de
ZFS:
@omo ejemplo de las capacidades e*presadas por estos n#meros+ si un
usuario crease &KKK !icheros por segundo+ tardar$a unos IKKK aAos en
alcan"ar el l$mite impuesto por el n#mero de !icheros.
En este capitulo pretendemos ver la parte prctica de ZFS, si
deseas conocer los lmites tericos de ZFS puedes ver los valores de
referencia en la wikipedia o en www.sun.com .
Las principales caractersticas de ZFS son:
8amaAo mU*imo de 256 cuatrillones de zettabytes
,dministracin sencilla por comandos o web. (nos olvidamos de
format, newfs, mount, vfstab, etc..)
@op'-on-write (ZFS no sobrescribe los nuevos datos
directamente, crea los datos en un nuevo bloque y
posteriormente cambia los punteros de datos y realiza la
escritura definitiva. Con este mtodo siempre esta garantizada
la integridad de los datos y no es necesario el uso de
utilidades como !sc0 )
Snapshots (capturas). Podemos sacar un foto de forma rpida a
todo un sistema de ficheros. Podemos instalar un paquete en el
sistema y si este no cumple nuestras expectativas podemos
realizar un rollback para volver al estado anterior.
@omprensin. Podemos definir un sistema de ficheros donde toda
la informacin este comprimida.
.irror ' 9,I--V: Se pueden definir de forma muy sencilla
mirroring entre discos y RAID-Z.
1
Informacin detallada sobre la unidad de medida en la wikipedia:
http://es.wikipedia.org/wiki/Zettabyte

Comunidad OpenSolaris Hispano
Actualmente cuando trabajamos con herramientas como Solaris
Volume Manager hay que crear las particiones (slice), agrupar discos
y crear la base de datos que alberga la configuracin y estado de
todos los volmenes. Todo esto implica la ejecucin de comandos como
prtvtoc, !mthard, metadb, metainit y metaroot sin contar las
modificaciones en el fcihero /etc/vfstab.
Con ZFS todo se resume a dos comandos "!s y "pool Tal como
podemos ver en la figura 4.1 ZFS trabaja con un pool que esta formado
por todos los dispositivos fsicos. Las caractersticas del pool son:
El pool esta formado por dispositivos de almacenamiento de
igual o diferentes capacidades.
El pool puede crecer y encoger aadiendo y quitando discos.
Los sistemas de ficheros ZFS comparten el pool y se puede
definir cuotas y reservar de espacio para un solo sistema de
ficheros.
Crear un pool
Vamos a crear un pool de 4GB comprendido por lo discos c1d0 y
c1d1 ambos con un tamao de 2GB. Para crear un pool llamado babilonia
utilizamos el comando "pool de la siguiente forma:
"pool create ! Dnombre del poolE Dlista de dispositivosE
#/usr/sbin/zpool create -f babilonia c1d0 c1d1
Para verificar que se ha creado correctamente ejecutamos el
comando "pool list:
# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
babilonia 3,88G 59,5K 3,87G 0% ONLINE -
#
!
F
V
O
Z Z Z F
V
O
STORAG
!OO"
Forma ZFS
Comunidad OpenSolaris Hispano
Podemos ver que el tamao del pool es de 3,88GB y es accesible
desde %babilonia.
Crear sistemas de ficheros "#S
Ya tenemos creado el pool y ahora podemos comenzar a definir
sistemas de ficheros. Vamos a crear dos sistemas de ficheros uno para
instalar aplicaciones y otro para datos utilizando el comando "!s con
la opcin create:
"!s create Dnombre del pool%sistema de !icherosE
# /usr/sbin/zfs create babilonia/aplicaciones
# /usr/sbin/zfs create babilonia/datos
Para ver los nuevos sistema de ficheros ejecutamos el comando "!s
con la opcin list:

# zfs list
NAME USED AVAIL REFER MOUNTPOINT
babilonia 138K 3,81G 27,5K /babilonia
babilonia/aplicaciones 24,5K 3,81G 24,5K /babilonia/aplicaciones
babilonia/datos 24,5K 3,81G 24,5K /babilonia/datos
La salida muestra los dos nuevos sistemas de ficheros que tambin
son visibles con el comando d! 0. Se puede observar que todos los
sistemas de ficheros comparten el mismo espacio de 3,81GB que es el
tamao del pool.
Los sistemas de ficheros creados con ZFS se montan
automticamente y de forma persistente. Con ZFS nos hemos ahorrado los
pasos con los comandos !ormat, new!s, mount y la posterior edicin
del fichero %etv%v!stab para dejarlo de forma persistente.
'ropiedades de un "#S
Los sistemas de ficheros ZFS tienen propiedades que pueden ser
activadas o desactivadas segn nuestras necesidades. Para establecer
el valor de una propiedad se ejecuta el comando "!s con las opciones
set para establecer o get para leer. Veamos algunos de los mas
interesantes:
Creacin cuotas ( reserva de espacio
ZFS nos da la posibilidad de controlar el espacio de los sistemas
de ficheros estableciendo cuotas y reserva de espacio para los
sistemas de ficheros. Continuando con el pool de los ejemplos
anteriores vamos a establecer una cuota para el sistema de ficheros
babilonia/aplicaciones y reservar espacio del pool para
babilonia/datos.
"
Comunidad OpenSolaris Hispano
Estableciendo una cuota a un sistema de ficheros limitamos el
espacio mximo que puede tener. Para crear una cuota utilizamos el
comando "!s y la opcin set )uota4&?P:
"!s set )uota4DtamaAoE Dnombre del pool%sistema de !icherosE
# # /usr/sbin/zfs set quota=1GB babilonia/aplicaciones
Si ejecutamos el comando "!s list para ver los sistemas de
ficheros observaremos que se ha establecido la cuota correctamente:
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
babilonia 138K 3,81G 27,5K /babilonia
babilonia/aplicaciones 24,5K F*)N/ 24,5K /babilonia/aplicaciones
babilonia/datos 24,5K 3,81G 24,5K /babilonia/datos
Una cuota limita el espacio de un sistema de ficheros pero no
garantiza dicho espacio. Para reservar el espacio para un sistema de
ficheros dentro del pool ejecutamos zfs con el parmetro set
reservation4&?P:
"!s set reservation4DtamaAoE Dnombre del pool%sistema de !icherosE
# /usr/sbin/zfs set reservation=1GB babilonia/datos
El sistema de ficheros babilonia%datos tiene reservados 1GB del
pool. Si el resto de ficheros llena el pool no peligra nuestro espacio
reservado. Ejecutando "!ls list se puede ver que el pool babilonia
tiene como usado 1GB y para el resto de sistemas de ficheros hay
disponible 2,81GB. Salida de "!s list:
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
babilonia FL**G )L+FG 27,5K /babilonia
babilonia/aplicaciones 24,5K 1024M 24,5K /babilonia/aplicaciones
babilonia/datos 24,5K 3,81G 24,5K /babilonia/datos
Realizar una reserva de espacio no implica un limite de cuota
para el sistema de ficheros este puede utilizar todo el tamao del
pool. Se pueden combinar las opciones de cuota y reserva para un
sistema de ficheros.
Sistema de ficheros comprimido
ZFS ofrece nuevas posibilidades como tener un sistema de ficheros
con informacin comprimida. El comando para habilitar la compresin
del sistema de ficheros es "!s con el parmetro compression4on El
siguiente ejemplo activa la compresin para el sistema de ficheros
babilonia/datos:
"!s set compression4Don%o!!E Dnombre del pool%sistema de !icherosE
!$
Comunidad OpenSolaris Hispano
#/usr/sbin/zfs set compression=on babilonia/datos
Para obtener datos del ratio de compresin del sistema de
ficheros:
"!s get Dnombre de la propiedadE Dnombre del pool%sistema de
!icherosE
#zfs get compressratio babilonia/datos
NAME PROPERTY VALUE SOURCE
babilonia/datos compressratio 1.00x -
Sistema de ficheros de solo lectura
Para establecer un sistema de ficheros como solo lectura
utilizamos el colmando "!s con el parmetro readonl'4on
"!s set readonly 4Don%o!!E Dnombre del pool%sistema de !icherosE
#/usr/sbin/zfs set readonly=on babilonia/datos
Cambiar el punto de montaje
Para cambiar el punto de montaje de un sistema de ficheros
ejecutamos el comando "!s estableciendo el nuevo punto de montaje con
el parmetro mountpoint El siguiente ejemplo muestra como cambiar el
punto de montaje de babilonia%datos a %aulauni*:
"!s set mountpoint 4D%punto de montajeE Dnombre del pool%sistema de
!icherosE
#cd /
# zfs set mountpoint=/aulaunix babilonia/datos
Verificamos el cambio ejecutando zfs list:
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
babilonia 1,00G 2,81G 25,5K /babilonia
babilonia/aplicaciones 24,5K 1024M 24,5K /babilonia/aplicaciones
babilonia;datos 24,5K 3,81G 24,5K ;aulauni2
3er las propiedades de un "#S
Hasta ahora hemos utilizado el comando "!s set para establecer
propiedades del sistema de archivos. Para ver los valores de las
propiedades de un ZFS ejecutamos "!s con la opcin get:
"!s get Dnombre de la propiedadE poll%sistemde!icheros
!#
Comunidad OpenSolaris Hispano
# zfs get quota babilonia/aplicaciones
NAME PROPERTY VALUE SOURCE
babilonia/aplicaciones quota 1G local
Con la opcin all podemos ver todos los valores de las
propiedades de un ZFS y cuales son sus valores por defecto:
# zfs get all babilonia/aplicaciones
NAME PROPERTY VALUE SOURCE
babilonia/aplicaciones type filesystem -
babilonia/aplicaciones creation Fri Jan 26 19:11 2007 -
babilonia/aplicaciones used 24,5K -
babilonia/aplicaciones available 1024M -
babilonia/aplicaciones referenced 24,5K -
babilonia/aplicaciones compressratio 1.00x -
babilonia/aplicaciones mounted yes -
babilonia/aplicaciones quota 1G local
babilonia/aplicaciones reservation none default
babilonia/aplicaciones recordsize 128K default
babilonia/aplicaciones mountpoint /babilonia/aplicaciones default
babilonia/aplicaciones sharenfs off default
babilonia/aplicaciones checksum on default
babilonia/aplicaciones compression off default
babilonia/aplicaciones atime on default
babilonia/aplicaciones devices on default
babilonia/aplicaciones exec on default
babilonia/aplicaciones setuid on default
babilonia/aplicaciones readonly off default
babilonia/aplicaciones zoned off default
babilonia/aplicaciones snapdir hidden default
babilonia/aplicaciones aclmode groupmask default
babilonia/aplicaciones aclinherit secure default
Gestin del 'OOL
&>adir nuevos discos al pool
Para ampliar el espacio disponible en un pool tenemos que aadir
nuevos discos a la mquina o utilizar particiones (slices) no usada en
otro disco. Para ampliar el pool utilizamos el comando "pool con la
opcin add:
"pool add ! Dnombre del poolE Ddispositivo a aAadirE
bash-3.00# zpool list -H
babilonia 1,98G 77,5K 1,98G 0% EN LINEA -
bash-3.00# ;usr;sbin;Ppool add Df babilonia c*dF
bash-3.00# zpool list -H
babilonia 3,97G 184K 3,97G 0% EN LINEA -
!2
Comunidad OpenSolaris Hispano
Tal como podemos ver en la salida de la ejecucin de "pool add el
espacio a aumentado de 1,89G a 3,97G. Se pueden aadir tantos discos
como sean necesarios.
@uitar discos al pool
Se pude sacar un disco que forma parte del pool utilizamos la
orden "pool remove :
"pool remove Dnombre del poolE Ddispositivo a)uitarE
# zpool remove babilonia c0d1
:liminar un pool
Si tenemos que eliminar un pool por completo y dejar los
dispositivos libres para otro uso utilizamos el comando "pool:
"pool destro' ! Dnombre del poolE
# /usr/sbin/zpool destroy -f babilonia
Esta opcin es destructiva por lo que tenemos que estar muy
seguros de que no tenemos informacin valiosa en el pool a borrar.
ReemplaPar un disco del pool
En caso de que un de los discos falle y se tenga que reemplazar
utilizamos el comando "pool con el parmetro replace:
"pool replace ! DpoolE Ddispositivo a reempla"arE Ddispositivo
nuevoE
Antes del cambio:
# zpool status
conjunto: babilonia
estado: ONLINE
limpiar: resilver completed con 0 errores en Wed Jan 31 16:46:57 2007
config:
NAME STATE READ WRITE CKSUM
almoroz ONLINE 0 0 0
mirror ONLINE 0 0 0
c0d1 ONLINE 0 0 0
c1d1 ONLINE 0 0 0
errores: ningn error de datosconocido
Crear un mirror 0R&%D F1
Si tuviramos que crear un espejo de dos discos utilizando
herramientas como Solaris Volume Manager realizaramos varias tareas
para logar nuestro objetivo. Con ZFS es muy sencillo tan solo
necesitamos con los comandos zpool y zfs.
!3
Comunidad OpenSolaris Hispano
"pool create ! Dnombre del poolE mirror DdispositivosE
# zpool create -f babilonia mirror c0d1 c1d1
Con "pool status verificamos si se ha creado correctamente:
bash-3.00# zpool status
conjunto: babilonia
estado: ONLINE
limpiar: no se ha solicitado ninguna
config:
NAME STATE READ WRITE CKSUM
babilonia EN LINEA 0 0 0
mirror EN LINEA 0 0 0
c0d1 EN LINEA 0 0 0
c1d1 EN LINEA 0 0 0
Crear un mirror desde un disco e2istente,
Si tenemos un pool de un disco y queremos crear un mirror del
disco acudimos al comando "pool con el parmetro attach:
"pool attach ! DpoolE DdispositivoE Dnuevo dispositivoE
zpool attach -f almoroz c0d1 c1d1
La ejecucin del comando creara un mirror formado por los discos c0d1
ya existente y el nuevo disco c1d1.
ReemplaPar un disco del mirror
En caso de que un de los discos falle y se tenga que reemplazar
utilizamos el comando "pool con el parmetro replace:
"pool replace ! DpoolE Ddispositivo a reempla"arE Ddispositivo
nuevoE
Antes del cambio:
# zpool status
conjunto: almoroz
estado: ONLINE
limpiar: resilver completed con 0 errores en Wed Jan 31 16:46:57 2007
config:
NAME STATE READ WRITE CKSUM
almoroz ONLINE 0 0 0
mirror ONLINE 0 0 0
c0d1 ONLINE 0 0 0
c1d1 ONLINE 0 0 0
errores: ningn error de datosconocido
Realizamos el cambio del disco c1d1 por c0d1s0:
#/usr/sbin/zpool replace -f babilonia c0d1 c1d1
!4
Comunidad OpenSolaris Hispano
Y lo verificamos:
zpool status
conjunto: almoroz
estado: ONLINE
limpiar: resilver completed con 0 errores en Wed Jan 31 16:46:57 2007
config:
NAME STATE READ WRITE CKSUM
almoroz ONLINE 0 0 0
mirror ONLINE 0 0 0
c0d1 ONLINE 0 0 0
replacing ONLINE 0 0 0
c0d1 ONLINE 0 0 0
c1d1 ONLINE 0 0 0
errores: ningn error de datosconocido
# zpool status
conjunto: almoroz
estado: ONLINE
limpiar: resilver completed con 0 errores en Wed Jan 31 16:46:57 2007
config:
NAME STATE READ WRITE CKSUM
almoroz ONLINE 0 0 0
mirror ONLINE 0 0 0
c0d1 ONLINE 0 0 0
c0d1s0 ONLINE 0 0 0

Crear R&%DD"
ZFS permite la creacin de RAID-Z muy similar a RAID 5. RAID 5 se
compone como mnimo de tres discos y en cada uno de ellos se reserva
un espacio con informacin de paridad.
RAID-Z cuenta con ventajas como la paridad distribuida simple y
doble. La doble paridad permite asumir errores en uno dos discos que
componen el RAIDZ.
Para crear un RAID-Z con paridad simple ejecutamos el comando zpool
"pool create ! DpoolE raid" DdispositivosE
El ejemplo siguiente muestra la creacin y su posterior verificacin:
#/usr/sbin/zpool create -f babilonia raidz c0d1 c1d1 c2t0d0
# Ppool status
conjunto: babilonia
estado: ONLINE
limpiar: no se ha solicitado ninguna
config:
NAME STATE READ WRITE CKSUM
babilonia ONLINE 0 0 0
raidz1 ONLINE 0 0 0
c0d1 ONLINE 0 0 0
c1d1 ONLINE 0 0 0
c2t0d0 ONLINE 0 0 0
errores: ningn error de datos conocido
!5
Comunidad OpenSolaris Hispano
Para crear un RAID-Z con paridad doble ejecutamos el comando zpool
"pool create ! DpoolE raid"3 DdispositivosE
# zpool create -f babilonia raidz2 c0d1 c1d1 c2t0d0
# Ppool status
conjunto: babilonia
estado: ONLINE
limpiar: no se ha solicitado ninguna
config:
NAME STATE READ WRITE CKSUM
babilonia ONLINE 0 0 0
raidP) ONLINE 0 0 0
c0d1 ONLINE 0 0 0
c1d1 ONLINE 0 0 0
c2t0d0 ONLINE 0 0 0
errores: ningn error de datos conocido
Snapshots
Los snapshots son fotos de los datos de un sistema de ficheros,
esto se hace de forma instantnea y comparte el espacio de los datos
no modificados. Tiene gran utilidad para realizar modificaciones
sobre servicios y si no funcionan realizar un rollback de forma
sencilla. Vamos un caso prctico:
Disponemos de los siguientes sistemas de ficheros en el pool
llamado babilonia:
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
babilonia 500M 3,42G 27,5K /babilonia
babilonia/prueba1 500M 3,42G 500M /babilonia/prueba1
babilonia/prueba2 24,5K 3,42G 24,5K /babilonia/prueba2
El sistema de ficheros babilonia/prueba1 contiene los siguientes
archivos:
# ls -lrt
total 1024223
-rw------T 1 root root 104857600 Feb 2 13:10 fichero1
-rw------T 1 root root 104857600 Feb 2 13:10 fichero2
-rw------T 1 root root 104857600 Feb 2 13:10 fichero3
-rw------T 1 root root 104857600 Feb 2 13:10 fichero4
-rw------T 1 root root 104857600 Feb 2 13:10 fichero5
Procedemos a crear el snapshot o foto del sistema de ficheros
babilonia/prueba1 con el comando "!s y e parmetro snapshots:
"!s snapshot Dpool%sistemade!icherosERnombre!oto
Ejecutamos el comando:
#zfs snapshot babilonia/prueba1@nombredelafoto
Con "pool list observamos que se ha creado la foto:
!6
Comunidad OpenSolaris Hispano
#zfs list
NAME USED AVAIL REFER MOUNTPOINT
babilonia 300M 3,61G 27,5K /babilonia
babilonia/prueba1 300M 3,61G 300M /babilonia/prueba1
babilonia;pruebaFQnombredelafoto * D K**/ D
babilonia/prueba2 24,5K 3,61G 24,5K /babilonia/prueba2
Ahora vamos a simular un pequeo desastre borrando los archivos
fichero4 y fichero5:
# rm fichero4 fichero5
# ls -lrt
total 614541
-rw------T 1 root root 104857600 Feb 2 13:10 fichero1
-rw------T 1 root root 104857600 Feb 2 13:10 fichero2
-rw------T 1 root root 104857600 Feb 2 13:10 fichero3
Recuperamos archivos los borrados recurriendo a snapshot creado.
Recuperamos con el comando "!s y el parmetro rollbac0:
"!s rollbac0 Dpool%sistemade!icherosERnombre!oto
Ejecutamos el comando:
RPfs rollback Dr babilonia;pruebaFQnombredelafoto
# ls -lrt
total 1024223
-rw------T 1 root root 104857600 Feb 2 13:10 fichero1
-rw------T 1 root root 104857600 Feb 2 13:10 fichero2
-rw------T 1 root root 104857600 Feb 2 13:10 fichero3
-rw------T 1 root root 104857600 Feb 2 13:10 fichero4
-rw------T 1 root root 104857600 Feb 2 13:10 fichero5
Y el resultado es la recuperacin de los archivos fichero4 y
fichero5. Tal como se deca al principio la foto comparte los datos
con los no modificados, en nuestro ejemplo se traduce con que la foto
comparte el espacio de !ichero&+ !ichero3 ' !icheroL que no se han
modificado ocupando realmente solo el tamao de !icheroM ' !icheroQ.
9orrar snapshots o fotos
Cuando ya no sea necesario conservar un snapshot podemos borrarlo
con el comando "!s y el parmetro destro':
Ejemplo:
RPfs list
NAME USED AVAIL REFER MOUNTPOINT
babilonia 300M 3,61G 27,5K /babilonia
babilonia/prueba1 300M 3,61G 300M /babilonia/prueba1
babilonia;pruebaFQnombredelafoto * D K**/ D
babilonia/prueba2 24,5K 3,61G 24,5K /babilonia/prueba2
R Pfs destro( Df babilonia;pruebaFQnombredelafoto
!
Comunidad OpenSolaris Hispano
:stados de "#S
Con el comando "pool status obtenemos informacin sobre el estado
de un pool:
"pool status DpoolE
RPpool status babilonia
conjunto: babilonia
estado: ONLINE
limpiar: no se ha solicitado ninguna
config:
NAME STATE READ WRITE CKSUM
babilonia ONLINE 0 0 0
mirror ONLINE 0 0 0
c0d1 ONLINE 0 0 0
c1d1 ONLINE 0 0 0
errores: ningn error de datosconocido
Los estados posibles son:
O/6I/7: el dispositivo esta operando normalmente.
-7?9,-7-: el dispositivo virtual tiene fallos pero contina
en funcionamiento. Este caso de puede dar cuando falla un
dispositivo que forma parte de un RAIDZ. Hay que sustituir
lo antes posible dispositivo daado.
O556I/7: dispositivo parado manualmente por el
administrador.
:/,W,I6,P67: dispositivo no disponible. Este estado es el
siguiente a DEGRADED cuando finalmente el dispositivo es
inaccesible.
Con el comando "pool status * obtenemos de forma rpida sin un
pool esta teniendo problemas:
El siguiente ejemplo muestra un mirror compuesto por dos
dispistivos fallando cKd& que esta totalmente inaccesible. Al ser un
mirror el servicio continuo operativo pero se degrada el rendimiento y
perdemos alta disponibilidad hasta que se reponga el disco daado.
Ejemplo de un disco daado:
R Ppool status D2
conjunto: babilonia
estado: DEGRADED
estado: no se pudieron abrir uno o varios dispositivos. Hay rplicas suficientes para
que el conjunto pueda seguir funcionando con un menor rendimiento.
accin: adjunte el dispositivo que falta y establzcalo en lnea mediante 'zpool online'.
consulte! http!;;<<<,sun,com;msg;"#SD+***DDK
limpiar: no se ha solicitado ninguna
config:
NAME STATE READ WRITE CKSUM
babilonia DEGRADED 0 0 0
mirror D:GR&D:D * * *
c*dF 8.&3&%L * 6) * no es posible abrir
c1d1 ONLINE 0 0 0
!!
Comunidad OpenSolaris Hispano
errores: ningn error de datosconocido
La informacin que ofrece es detallada indicndonos el estado en
el que se encuentra el mirror. En la salida del comando nos remite a
la direccin web de Sun Microsystems http:%%wwwsuncom%msg%V5S-JKKK--L
donde podemos encontrar informacin y soluciones al problema.
Para solucionar este problema tenemos que aadir un nuevo disco
al sistema o utilizar un slice de otro disco. Una vez localizado el
disco que sustituye a c0d1 lo remplazamos con el comando "pool
replace:
Pasos para reemplazar el disco daado:
R Ppool replace babilonia c*dF c)t*d*
#Ppool status babilonia
conjunto: babilonia
estado: ONLINE
limpiar: resilver completed con 0 errores en Fri Feb 2 15:04:57 2007
config:
NAME STATE READ WRITE CKSUM
babilonia ONLINE 0 0 0
mirror ONLINE 0 0 0
c2t0d0 ONLINE 0 0 0
c1d1 ONLINE 0 0 0
errores: ningn error de datosconocido
En el ejemplo hemos reemplazado el disco cKd& por c3tKdK y
automticamente el mirror para a estado ONLINE y replica los datos de
c0d1 a c2t0d0.
Tambin podemos optar por sacar el disco del mirror para
repararlo. Tenemos que desasociar el disco cKd& del mirror con el
comando.
"pool detach:
"pool detach DpoolE DdispositivoE
#zpool detach babilonia c0d1
El disco c0d1 ya no forma parte del mirror babilonia. Podemos
someterlo a pruebas y volver a aadirlo al mirror o aadir otro disco
distinto se la siguiente forma:
zpool attach -f [pool] [chisposito] [nuevo dispositivo]
R Ppool attach Df babilonia cFdF c*dF
# zpool status
conjunto: babilonia
estado: ONLINE
limpiar: resilver completed con 0 errores en Fri Feb 2 15:18:50 2007
config:
NAME STATE READ WRITE CKSUM
babilonia ONLINE 0 0 0
mirror ONLINE 0 0 0
c1d1 ONLINE 0 0 0
!"
Comunidad OpenSolaris Hispano
c0d1 ONLINE 0 0 0
errores: ningn error de datosconocido
Operaciones entrada ( salida
ZFS proporciona el comando "pool iostat que reporta e sobre
operaciones de lectura, escritura y ancho de banda. El siguiente
ejemplo muestra la salida del comando "pool iostat:
"pool iostat DpoolE
# zpool iostat babilonia
capacity operations bandwidth
pool used avail read write read write
---------- ----- ----- ----- ----- ----- -----
babilonia 10,1M 1,97G 0 0 41 2
Para obtener informacin de todos los dispositivos virtuales:
"pool iostat v DpoolE
# zpool iostat -v babilonia
capacity operations bandwidth
pool used avail read write read write
---------- ----- ----- ----- ----- ----- -----
babilonia 10,1M 1,97G 0 0 41 2
mirror 10,1M 1,97G 0 0 42 2
c1d1 - - 0 0 44 111
c0d1 - - 0 0 0 52
---------- ----- ----- ----- ----- ----- -----
Si omitimos el nombre del pool en el comando lista la informacin
de todos los pool disponibles.
"$
Comunidad OpenSolaris Hispano
"onas
"onas con OpenSolaris )**+,*-
La tecnologa de contendedores permite la virtualizacin de
Solaris 10 en zonas aisladas del resto del sistema. La denominacin
de contenedores es la suma de el SRM (Gestor de Recursos de Solaris)
+ Zonas.
Las zonas ejecutan los procesos de forma aislada al sistema
anfitrin sin comunicacin con otros procesos fuera de la zona.
Las zonas solo pueden ejecutar entornos virtuales con el
operativo OpenSolaris 2008.05 compartiendo el kernel del sistema
anfitrin
Las zonas se dividen en:
- Vona ?lobal: es la primera instalacin que se realiza de
OpenSolaris 2008.05 fsicamente en la mquina y en la que se
basan el resto de zonas. Tiene el control de todo el sistema y el
hardware de la mquina.
- Vona no global: es un contenedor aislado de la zona global donde
se pueden ejecutar OpenSolaris 2008.05 y aplicaciones forma
aislada a la zona global.
Crear una Pona
"#
Comunidad OpenSolaris Hispano
La zonas no globales pueden compartir directorios con la zona
global o estar aislada. Una zona no global puede compartir con la zona
global los sistemas de ficheros:
/usr
/lib
/sbin
/platform
El uso de una zona no global compartida ocupa tan solo 100MB al
tener compartidos directorios con la zona global tal como se puede ver
en la figura 5.1.
Figura 5.1 Zona compartida
Figura 5.2 Zona no compartida
Las zonas no compartidas o zonas grandes ocupan 4GB ya que no
comparten sistema de ficheros. Al no compartir sistemas de ficheros
con la zona global podemos aplicar parches a la zona distintos a los
de la zona global. Podemos tener varias zonas con niveles de parche
"2
/usr
/lib
/sbin
/platform
/var
/etc
Zona Global #
Zona local
Com$artida
7de87rds97c$d$s$
lofs(ro)
/usr
/lib
/sbin
/platform
/var
/etc
1!!M" #$"
/usr
/lib
/sbin
/platform
/var
/etc
Zona Global #
B%G ZO&
/dev/ds%/c1d!
/usr
/lib
/sbin
/platform
/var
/etc
&$" #$"
/dev/ds%/c!d!
Comunidad OpenSolaris Hispano
distintos segn las necesidades de las aplicaciones. En la figura 5.2
se representa una zona no compartida.
Control de recursos
Cuando creamos una zona tenemos que asignarlas recursos como red,
memoria, CPU etc..
&signar C'8
El control de recursos sobre la CPU en zonas puede ser de tres
tipos:
- @1: !ija: una zona puede tener asignada una o mas CPUs de forma
fija. Esta forma puede ser til cuando licenciamos aplicaciones
por el numero de CPU. Esta opcin tiene una desventaja si la
zona no requiere mucho uso de CPU ya que perdemos capacidad de
procesamiento estando la CPU solamente asignada una zona.
- @1:s dinamicas: se asigna un mnimo y un mximo de CPUs para una
zona. El demonio poold se encarga de balancear el numero de CPUs
disponibles segn la necesidades de cada zona.
- @1:s compartidas: consiste en un pool de CPUs asignado a todas
las zonas. El sistema repartir las CPU segn las necesidades de
cada zona.
/emoria
El control de memoria para zonas antes de OpenSolaris 2008.05
no se poda realizar de forma directa utilizando. Se ha incluido una
nueva propiedad denominada "onema*-loc0ed-memor' que establece el
limite de memoria para una zona.
:spacio en disco
La zonas puedes ser creadas en:
Discos independientes o particiones (slices): una zona puede ser
creada en un directorio de cualquier sistema de ficheros, una
particin o en un disco independiente.
Volmenes independientes: puede instalarse las zonas en volmenes
de Solaris Volume Manager y beneficiarse de polticas como RAID1,
RAIRD 5 etc..
ZFS: Puede instalarse una zona en uns sistema de ficheros ZFS o
compartir un sistema de ficheros de la zona global.
R:D
Cuando creamos una zona se le asigna una direccin IP e interfaz
de red de la zona global.
"3
Comunidad OpenSolaris Hispano
Creacin de una Pona compartida o SmallD"one
En el siguiente apartado vamos a seguir los pasos necesarios para
crear una zona OpenSolaris 2008.05 no compartida ocupando tan solo
100MB . La zona a crear tiene un direccin IP asociada a la interfaz
pcn& y se instala en %babilonia%mi"ona.
Ejecutamos el comando "onec!g con la opcin " de la siguiente
forma:
zonecfg -z [nombre de la zona]
Al ejecutar el comando aparece un mensaje indicando que la zona
no esta configurada. Para configurar la zona tenemos que introducir
los comandos de configuracin el editor de "one"!g. Los datos a
introducir son:
autoboot4trae: este parmetro define si la zona es persintente
a los reinitos del sistema. Si reiniciamos la mquina
anfitriona la zona tambin arrancara.
"onepath: PATH donde se instalara la zona Solarias 10.
set address: asigna una direccin IP para la zona
set ph'sical: asocia una interfaz de la zona no global para su
uso en la zona.
El ejemplo siguiente muestra el proceso completo para la creacin
de la zona:
# Ponecfg DP miPona
mizona: No se ha configurado esa zona
Use 'create' para comenzar a configurar una zona nueva.
Ponecfg!miPonaS create
Ponecfg!miPonaS set autobootTtrue
Ponecfg!miPonaS set PonepathT;babilonia;miPona
Ponecfg!miPonaS add net
Ponecfg!miPona!netS set addressTF*,UK,FFF,)-
Ponecfg!miPona!netS set ph(sicalTpcnF
Ponecfg!miPona!netS end
Ponecfg!miPonaS info
zonename: mizona
zonepath: /babilonia/mizona
autoboot: true
pool:
limitpriv:
inherit-pkg-dir:
dir: /lib
inherit-pkg-dir:
dir: /platform
inherit-pkg-dir:
dir: /sbin
inherit-pkg-dir:
dir: /usr
net:
"4
Comunidad OpenSolaris Hispano
address: 10.73.130.25
physical: pcn1
Ponecfg!miPonaS verif(
Ponecfg!miPonaS commit
Ponecfg!miPonaS e2it
Con los pasos anteriores hemos creado la zona. Al realizar el
commit se crea un fichero XML en /etc/zones con los datos de la zona:
Ejemplo de mi"ona*ml:
# more mizona.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE zone PUBLIC "-//Sun Microsystems Inc//DTD Zones//EN"
"file:///usr/share/lib/xml/dtd/zonecfg.dtd.1">
<!--
DO NOT EDIT THIS FILE. Use zonecfg(1M) instead.
-->
<zone name="mizona" zonepath="/babilonia/mizona" autoboot="true">
<inherited-pkg-dir directory="/lib"/>
<inherited-pkg-dir directory="/platform"/>
<inherited-pkg-dir directory="/sbin"/>
<inherited-pkg-dir directory="/usr"/>
<network address="10.73.130.25" physical="pcn1"/>
</zone>
Para comprobar que la mquina esta correctamente creada
ejecutamos el comando:
"oneadm list -cv
# zoneadm list -cv
ID NAME STATUS PATH
0 global running /
- mizona configured /babilonia/mizona
Ya esta creada la zona y tenemos que inicializarla para que se
instalen los paquetes necesarios. Este paso puede tardar varios
minutos por que implica la copia de todos los paquetes necesarios.
Antes de iniciar la instalacin de paquetes para la zona debemos
de comprobar los permisos de la zona par ello acudimos al comando
"oneadm para verificar que la zona tiene los permisos necesarios para
su creacin.
Para verificar ejecutamos:
"oneadm " Dnombre de la "onaE veri!'
Al lanzar el comando nos muestra un mensaje avisando que los
permisos sobre los ficheros de la zona no son los correctos:
bash-3.00# Poneadm DP miPona verif(
/babilonia/mizona no debe ser legible por grupo.
/babilonia/mizona no debe ser ejecutable por grupo.
/babilonia/mizona no debe ser legible por todos.
/babilonia/mizona no debe ser ejecutable por todos.
"5
Comunidad OpenSolaris Hispano
no se ha podido verificar rutazona /babilonia/mizona debido a los errores
anteriores.
zoneadm: la zona mizona no se ha podido verificar
Solucionamos el problema aplicando el comando chmod con los
permisos HKK.
chmod 700 /babilonia/mizona/
Si ejecutamos nuevamente el comando "oneadm para verificar la
zona no observaremos ningn error. Instalamos la mquina ejecutando
la orden:
"oneadm " Dnombre de la "onaE install
bash-3.00# Poneadm DP miPona install
Preparing to install zone <mizona>.
Creating list of files to copy from the global zone.
Copying <2430> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <1042> packages on the zone.
Initialized <1042> packages on zone.
Zone <mizona> is initialized.
El archivo </babilonia/mizona/root/var/sadm/system/logs/install_log> contiene un
registro de la instalacin por zonas.
Una vez finalizada la copia de paquetes comprobamos que la
maquina esta instalada correctamente ejecutando "oneadm list cv:
bash-3.00# zoneadm list -cv
ID NAME STATUS PATH
0 global running /
- mizona installed /babilonia/mizona
&rrancar la Pona
La mquina ya esta configurada e instalada ahora tenemos que
arrancar la zona con el comando "oneadm y el parmetro boot:
"oneadm " Dnombre de la "onaE boot
bash-3.00#Poneadm VP miPona boot
bash-3.00# Poneadm list Dcv
ID NAME STATUS PATH
0 global running /
4 mizona running /babilonia/mizona
Para verificar que la zona esta arrancada ejecutamos el comando
"oneadm list cv y veremos que su estado es running.
"login entrar en la nueva Pona
"6
Comunidad OpenSolaris Hispano
Tenemos la mquina virtual ejecutndose correctamente y queda
realizar el ultimo paso supone entrar en la mquina y responder unas
preguntas sobre la configuracin que queremos para la zona. Las
preguntas son las mismas que en una instalacin normal de Solaris,
realizar las siguientes preguntas:
Nombre de la mquina
Idioma del sistema
Idioma del teclado
Tipo de Terminal
Zona geogrfica
Contrasea de root
Compatibilidad NTFS v4
Para entrar en la mquina ejecutamos la orden "login con el
parmetro @:
"login @ Dnombre de la "onaE
Como se aprecia en el siguiente ejemplo se inicia un pequeo
instalador que pregunta nuestras preferencias para el sistema:
bash-3.00R Plogin DC miPona
[Conectado a la consola de la zona 'mizona']
Select a Language
0. English
1. Spanish
2. it
Please make a choice (0 - 2), or press h or ? for help:
Sobre el Terminal:
Qu tipo de terminal esta usando?
1) Est\ndar ANSI CRT
2) DEC VT52
3) DEC VT100
4) Heathkit 19
5) Lear Siegler ADM31
6) Consola PC
7) Herramienta de comandos Sun
8) Estaci\`n de Trabajo (Workstation) Sun
9) Televideo 910
10) Televideo 925
11) Wyse, modelo 50
12) Emulador X Terminal (xterms)
13) Emulador de terminal CDE (dtterm)
14) Otros
Introduzca el nmero seleccionado y presione Intro:
Cuando finalizamos la preguntas se configura e inicia el arranque
del sistema operativo OpenSolaris 2008.05 como en cualquier mquina:
SunOS Release 5.10 Version Generic_118855-33 32-bit
Copyright 1983-2006 Sun Microsystems, Inc. All rights reserved.
"
Comunidad OpenSolaris Hispano
Use is subject to license terms.
$ostname! babilonia
babilonia console login: Feb 13 03:09:03 babilonia sendmail[5971]: My unqualified
host name (localhost) unknown; sleeping for retry
babilonia console login!
Estamos dentro de la mquina virtual babilonia y podemos hacer
login con el usuario introducido en las preguntas de la instalacin de
la zona. Ahora podemos instalar y configurar la mquina virtual como
cualquier otra.
Ahora se puede hacer telnet o ssh a la direccin IP que tenemos
asociada a nuestra mquina virtual e instar cualquier servicio
normalmente.
'arar la "ona virtual
Para parar una mquina virtual podemos proceder de dos formas
diferentes:
1. Al ser una mquina virtual responde a los mismos comandos de
parada que cualquier instalacin normal de Solaris por lo tanto
podemos parar con comandos como init K+ shutdown o halt
2. Desde la zona global podemos o reiniciar la mquina utilizando
el comando "oneadm con los parmetros reboot y halt:
a "oneadm -" Dnombre de la "onaE reboot
b "oneadm -" Dnombre de la "onaE halt
Crear una Pona no compartida o 9%GD"O.:
Tal como hemos visto al comienzo una zona no compartida no
comparte los directorios %usr%lib+%sbin ' %plat!orm por lo tanto
ocupa 4GB de espacio aportando la ventaja de tener una zona totalmente
independiente donde se puede aplicara un nivel de parches diferente a
la zona global.
Para crear una zona no compartida vamos utilizar un disco
completo de 6GB con sistema de ficheros UFS montado en %big"one.
Antes de instalar la zona vemos que tan solo ocupamos el 1% del
disco:
/dev/dsk/c1d0s0 5783070 5753 5719487 1% /bigzone
Al finalizar la instalacin el espacio ocupado por la zona es
igual a una instalacin completa de OpenSolaris 2008.05 :
/dev/dsk/c1d0s0 5783070 2951463 2773777 52% /bigzone
Una zona no compartida o BigZone se crea igual que una zona
compartida con la salvedad de que indicamos que no se compartan los
sistemas de ficheros %usr%lib+%sbin ' %plat!orm con los parmetros:
remove inherit-p0g-dir dir4%sbin
"!
Comunidad OpenSolaris Hispano
remove inherit-p0g-dir dir4%usr
remove inherit-p0g-dir dir4%plat!orm
remove inherit-p0g-dir dir4%lib
Los pasos a realizar son los siguientes:
# Ponecfg DP mibigPone
mibigzone: No se ha configurado esa zona
Use 'create' para comenzar a configurar una zona nueva.
zonecfg:mibigzone> create
zonecfg:mibigzone> remove inheritDpkgDdir dirT;sbin
zonecfg:mibigzone> remove inheritDpkgDdir dirT;usr
zonecfg:mibigzone> remove inheritDpkgDdir dirT;platform
zonecfg:mibigzone> remove inheritDpkgDdir dirT;lib
zonecfg:mibigzone> set autobootTtrue
zonecfg:mibigzone> set PonepathT;bigPone
zonecfg:mibigzone> add net
zonecfg:mibigzone:net> set addressTF)U,*,*,F**
zonecfg:mibigzone:net> set ph(sicalTlo*
zonecfg:mibigzone:net> end
zonecfg:mibigzone> info
zonename: mibigzone
zonepath: /bigzone
autoboot: true
pool:
limitpriv:
net:
address: 127.0.0.100
physical: lo0
zonecfg:mibigzone> verif(
zonecfg:mibigzone> commit
zonecfg:mibigzone> e2it
Establecemos los permisos de fichero para la zona:
chmod 700 /bigzone
Verificamos la zona y procedemos a la instalacin de los paquetes
necesarios para la ejecucin de la zona:
bash-3.00R Poneadm DP nocompartida verif(
bash-3.00# Poneadm DP nocompartida install
Preparing to install zone <nocompartida>.
Creating list of files to copy from the global zone.
Copying <130622> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <1042> packages on the zone.
Initialized <1042> packages on zone.
Zone <nocompartida> is initialized.
El archivo </bigzone/root/var/sadm/system/logs/install_log> contiene un registrde
la instalacin por zonas.
Arrancamos la zona:
# Poneadm list Dcv
ID NAME STATUS PATH
""
Comunidad OpenSolaris Hispano
0 global running /
- nocompartida installed /bigzone
# Poneadm DP nocompartida boot
# Poneadm list Dcv
ID NAME STATUS PATH
0 global running /
2 nocompartida running /bigzone
Y finalizamos el proceso de instalacin estableciendo el nombre
de mquina, contrasea de root, zona geogrfica etc..:
bash-3.00R Plogin DC nocompartida
[Conectado a la consola de la zona 'nocompartida']
Select a Language
0. English
1. Spanish
2. it
Please make a choice (0 - 2), or press h or ? for help:
:stados de una Pona
Hemos visto como crear una zona, configurarlas y las operaciones
de parada y arranque. Ahora veremos como detectar el estado de una
mquina desde la zona global. Con el comando "oneadm list cv
obtenemos informacin sobre el estado de una zona:
# Poneadm list Dcv
ID NAME STATUS PATH
0 global running /
- nocompartida installed /bigzone
Los estados posibles son:
@on!igured: se encuentra en estado estado cuando finalizamos la
configuracin y realizamos un commit.
Incomplete: mostrar este estado muestran se estn instalando los
paquetes al ejecutar "oneadm con la opcin install.
Installed: la zona tiene todos los paquetes necesarios para su
funcionamiento.
9ead': la zona esta lista tiene creado el kernel, los
controladores de red estn cargados y los sistemas de ficheros
montados.
9unning: la zona esta arrancada.
Shutting -own: la zona esta en proceso de parada.
/onitoriPar una Pona
Una zona puede ser monitorizada desde la zona global utilizando
el comando "login con la opcin S que permite la ejecucin de un
#$$
Comunidad OpenSolaris Hispano
comando dentro la zona y enviar la salida del comando a la zona
global.
Vlogin S Dnombre de la "onaE comando
Ejemplos para monitorizar una zona:
Uptime:
# zlogin -S nocompartida "uptime"
10:43am up 8 min(s), 0 users, load average: 0.18, 0.87, 0.98
FileSystems:
#
# zlogin -S nocompartida "df -k"
Filesystem kbytes used avail capacity Mounted on
/ 5783070 2964445 2760795 52% /
/dev 5783070 2964445 2760795 52% /dev
proc 0 0 0 0% /proc
ctfs 0 0 0 0% /system/contract
swap 513036 260 512776 1% /etc/svc/volatile
mnttab 0 0 0 0% /etc/mnttab
/usr/lib/libc/libc_hwcap1.so.1 5783070 2964445 2760795 52% /lib/libc.so.1
fd 0 0 0 0% /dev/fd
swap 512812 36 512776 1% /tmp
swap 512796 20 512776 1% /var/run
Uname -a:
# zlogin -S nocompartida "uname -a"
SunOS babilonia 5.10 Generic_118855-33 i86pc i386 i86pc
3alidarse en una Pona
Para entrar a una zona podemos realizar un telnet o ssh a la
direccin IP asociada a la zona o entrar por consola con la utilizad
zlogin:
"login l DusuarioE Dnombre de "onaE
Ejemplo de conexin a una zona con un usuario:
# zlogin -l aulaunix nocompartida
[Conectado a la zona 'nocompartida' pts/5]
No directory! Logging in with home=/
Sun Microsystems Inc. SunOS 5.10 Generic January 2005
$ id
uid=100(aulaunix) gid=1(other)
$
Desinstalar una Pona
#$#
Comunidad OpenSolaris Hispano
Para desinstalar una zona tenemos que detener la zona y ejecutar
el comando "oneadm con la opcin uninstall. Hay que usar esta opcin
con mucha precaucin ya que elimina todos los ficheros:
# zoneadm -z nocompartida halt
# zoneadm -z nocompartida uninstall -F
# df -k
/dev/dsk/c1d0s0 5783070 5894 5719346 1% /bigzone
La desinstalacin de la zona puede tardar varios minutos al igual
que al crearla.
?Cmo funcionan las "onasB
%ntroduccin
Debemos imaginar una zona de OpenSolaris como un contenedor de
procesos, es decir la zona es una jaula cuyo contenido no puede ver lo
que hay fuera de ella. Para que los procesos puedan ejecutarse el
kernel debe proporcionar una serie de recursos a dicha zona, como
pueden ser acceso a discos, interfaces de red, etc. Dichos recursos no
pueden ser compartidos entre zonas.
La excepcin es la zona global con id 0, esta se crea cuando
arranca el sistema y tiene asociado todos los recursos sin
restricciones de privilegios. Incluso en los sistemas que no se ha
definido ninguna zona existe una zona global.
Cada zona esta identificada por un nombre y un id, el nombre
global y el id 0 est reservados para la zona global.
.otas sobre el kernel
En nuestro sistema solo tenemos un Kernel ejecutndose, los
procesos de las distintas zonas se ejecutan todos en el mismo que,
lgicamente es el que se inicia al arrancar la zona global.
Esto tiene grandes beneficios a nivel de performance, especialmente
si el diseo de las zonas ha sido bien pensado.
Las pginas de texto (el cdigo de los ejecutables y libreras)
que ha cargado en memoria una zona son compartidas con las dems.
La cach de nombres de directorios del sistema (DNLC) tambin es
compartida.
Las tareas que peridicamente se ejecutan en el kernel (p.ej.
todas las de la callout table) no se duplican por cada zona.
Teniendo en cuenta lo anterior interesa, desde el punto de vista de
la performance, que las distintas zonas sean los mas parecidas posible
y compartan el mayor nmero de directorios posibles.
P. ej. mientras que levantar el sistema consume en mi equipo 339
megas de la memoria fsica, arrancar una zona adicional consume solo
79 mb.
#$2
Comunidad OpenSolaris Hispano
####sistema solo con la zona global
bash-3.00# mdb -k
Loading modules: [ unix genunix specfs dtrace uppc pcplusmp scsi_vhci ufs ip
hook neti sctp arp usba fctl nca lofs mpt audiosup zfs random cpc crypto fcip
nsctl ptm sppp ipc ]
> ::memstat
Page Summary Pages MB %Tot
------------ ---------------- ---------------- ----
Kernel 15066 58 12%
Anon 52276 204 41%
Exec and libs 11141 43 9%
Page cache 5927 23 5%
Free (cachelist) 24358 95 19%
Free (freelist) 20142 78 16%
Total 128910 503
Physical 128909 503
###iniciamos una nueva zona
> ::memstat
Page Summary Pages MB %Tot
------------ ---------------- ---------------- ----
Kernel 17944 70 14%
Anon 69002 269 54%
Exec and libs 11305 44 9%
Page cache 6139 23 5%
Free (cachelist) 18639 72 14%
Free (freelist) 5881 22 5%
Total 128910 503
Physical 128909 503
>
.otas sobre la seguridad
Si bien ejecutar todos los hilos en el mismo kernel es un
beneficio para la performance tambin supone un reto de cara a la
seguridad. El modelo de permisos de OpenSolaris va ms all del
tradicional en *nix, root (id =0) todos los privilegios, los dems
usuarios ninguno. En su lugar tenemos un modelo mas granular, donde
podemos asignar a los procesos/usuarios un set de privilegios
especficos para realizar las tareas que necesiten.
Por ejemplo, ya no es necesario arrancar un servidor web como
root, en su lugar podemos dar a un usuario privilegios para que sus
procesos puedan hacer un bind al puerto 80. El hecho que cada proceso
pueda ejecutarse con los mnimos privilegios necesarios, en contra del
todo o nada tradicional, favorece enormemente la seguridad global del
sistema.
Los privilegios que tienen los procesos dentro de una zona no
global estn prefijados y no pueden ser alterados por el
administrador, este set est diseado de manera que evita la
interaccin de los threads entre zonas , as como el uso de algn
privilegio para conseguir otros adicionales. Incluso los hilos que se
ejecutan con id 0 tienen este set. Estas restricciones no se aplican
en la zona global.
Como consecuencia hay una serie de privilegios no podrn adquirir
los procesos ejecutndose en una zona no global:
Privilege Description
#$3
Comunidad OpenSolaris Hispano
PRIV_NET_RAWACCESS Allows a process to have direct access to the
network layer.
PRIV_PROC_CLOCK_HIGHRES Allows process to create high-resolution timers.
PRIV_PROC_LOCK_MEMORY Allows process to lock pages in physical memory.
PRIV_PROC_PRIOCNTL Allows process to change scheduling priority or
class.
PRIV_PROC_ZONE Allows process to control/signal other processes
in different zones.
[...]
De esta manera los procesos se hallan aislados de forma efectiva
de aquellos que no se estn ejecutando en su misma zona.
Obviamente, a parte de la restriccin nivel de privilegios, es
vital para la seguridad de las zonas, que los derechos de acceso a los
distintos recursos sean correctos. Es decir, los privilegios nos
indican que "acciones" podemos realizar (p. ej. Un chown), pero donde
realizarlas est controlado a nivel de objetos (p. ej. Usando zonecfg
damos acceso a los filesystem que nos interesa.).
Es la combinacin de ambas cosas, privilegios y restricciones de
acceso , lo que finalmente garantiza la seguridad entre zonas.
Como pequeo ejemplo prtico podemos comprobar como desde la zona
global vemos los pids de las dems y no as a viceversa. En ambos
casos el id del usuario es 0 (root).
#ps dentro de la zona test
bash-3.00# id
uid=0(root) gid=0(root)
bash-3.00# uname -a
SunOS test 5.11 snv_70b i86pc i386 i86pc
bash-3.00# ps
PID TTY TIME CMD
11227 console 0:01 bash
29665 console 0:02 sh
26806 console 0:00 ps
#ps desde la zona global con un grep para ver el proceso bash de la zona test
bash-3.00# id
uid=0(root) gid=0(root)
bash-3.00# ps -ef | grep 11227
root 11227 29665 1 Jan 18 zoneconsole 0:01 bash
root 26809 555 1 09:45:14 pts/2 0:00 grep 11227
#ps desde la zona global
bash-3.00# ps
PID TTY TIME CMD
555 pts/2 0:03 bash
551 pts/2 0:00 sh
26812 pts/2 0:00 ps
#ps desde la zona test buscando el pid del bash de la zona global
bash-3.00# ps -ef | grep 555 | grep -v grep
bash-3.00#
Como consecuencia de lo anterior existen algunas tareas que no
estn permitidas ejecutarse dentro de una zona:
Modificar interfaces de red o tablas de rutas.
Acceder al dispositivo /dev/kmem.
Rebotar o apagar todo el sistema.
#$4
Comunidad OpenSolaris Hispano
Cargar mdulos personalizados del kernel.
'rocesos 4ue gestionan una "ona
Existen dos nuevos procesos por cada zona no global que tenemos
en el sistema, su funcin gestionar los recursos de ellas:
El primero es el Poneadmd. Sus tareas son las siguientes:
Crear las estructuras del kernel necesarias y iniciar un proceso
zsched.
Configurar el control a los recursos de dicha zona (como pools de
CPU, memoria o privilegios).
Configurar los dispositivos de la zona con el comando devfsadmd.
Crear y destruir las interfaces de red virtuales.
Montar los filesystems.
Proporcionar un servidor de consola para el comando zconsole.
Ejecutar el proceso init de la zona.
Proporcionar un Door Server, los clientes como el zoneadm o el
propio kernel se conectan a el para enviar mensajes de cambio de
estado a la zona como halt, reboot, ...
Hay una completa descripcin de este proceso en el fichero zoneadmd.c
del cdigo fuente.
El otro proceso es el Psched, sus tareas son:
Es el padre de todos los threads del kernel de su zona.
Lanza el proceso init de la zona cuando arranca.
*iclo de 8ida de una zona
Estos son los estados (a nivel de kernel) en los que se puede
encontrar una zona, ordenados por el flujo natural de arranque a
parada.
"O.:I%SI8.%.%T%&L%":D! la zona se ha aadido a la lista de zonas
activas pero aun no es accesible.
"O.:I%SIR:&DC! el proceso zsched esta preparado.
"O.:I%SI9OOT%.G! es un estado de transicin el proceso zsched esta
tratando de lanzar el init de la zona.
"O.:I%SIR8..%.G! zsched a lanzado correctamente el init, la zona esta
lista para trabajar. Permanece en este estado hasta que se le haga un
shutdown.
"O.:I%SIS$8TT%.GIDOG.! se ha ejecutado la llamada zone_shutdown(), el
sistema esta matando todos los procesos dentro de la zona.
"O.:I%SI:/'TC! no quedan mas procesos de esta zona ejecutndose.
"O.:I%SIDOG.! todos los threads del kernel relacionados con la zona
han terminado.
#$5
Comunidad OpenSolaris Hispano
La estructura PoneIt
Por cada zona existente en el sistema hay una estructura zone_t
en el kernel, en ella tenemos informacin acerca del estado y
configuracin de esta.
Podemos ver su definicin en el fichero zone.h de nuestro sistema:
typedef struct zone {
/*
* zone_name is never modified once set.
*/
char *zone_name; /* zone's configuration name */
/*
* zone_nodename and zone_domain are never freed once allocated.
*/
char *zone_nodename; /* utsname.nodename equivalent */
char *zone_domain; /* srpc_domain equivalent */
/*
* zone_lock protects the following fields of a zone_t:
* zone_ref
* zone_cred_ref
* zone_ntasks
* zone_flags
* zone_zsd
*/
kmutex_t zone_lock;
/*
[...]
Dentro de ella encontramos los parmetros con los que hemos
configurado la zona, entre ellos los que limitan el consumo, como por
ejemplo el mximo de memoria, el nmero de semforos, etc. Vamos hacer
un breve repaso a los mas destacados:
*zone_name; /* nombre de la zona */
zoneid_t zone_id; /* ID de la zona */
rctl_qty_t zone_locked_mem_ctl; /* lmite mximo de
memoria*/
rctl_qty_t zone_max_swap_ctl; /* lmite mximo de
swap */
[...]
Tambin hay informacin de la zona, como por ejemplo:
char *zone_rootpath; /* path de la raz de la zona */
zone_status_t zone_status; /* en que estado esta actualmente la
zona*/
rctl_qty_t zone_nlwps; /* nmero de hilos ejecutndose */
[...]
Podemos acceder fcilmente a ella usando mdb:
bash-3.00# mdb -k
Loading modules: [ unix genunix specfs dtrace uppc pcplusmp scsi_vhci ufs ip
hook neti sctp arp usba fctl nca lofs mpt audiosup zfs random sppp crypto ptm
md nfs cpc fcip fcp logindmux nsctl sdbc sv ii rdc ]
> ::walk zone
fec7f028
d5072b40
d884ac40
> ::walk zone
fec7f028
d5072b40
d884ac40
> d5072b40 ::zone
ADDR ID NAME PATH
#$6
Comunidad OpenSolaris Hispano
d5072b40 1 linux /zone/root/
> d884ac40 ::zone
ADDR ID NAME PATH
d884ac40 3 test /zone_OS/root/
> d884ac40 ::print zone_t
{
zone_name = 0xd7ce69c0 "test"
zone_nodename = 0xd86e5400 "test"
zone_domain = 0xd86e57c0 ""
zone_lock = {
_opaque = [ 0, 0 ]
}
zone_linkage = {
list_next = zone_active+8
list_prev = 0xd5072b54
}
zone_id = 0x3
zone_ref = 0x13
zone_cred_ref = 0x1e
zone_rootvp = 0xd5074240
zone_rootpath = 0xd884ed10 "/zone_OS/root/"
zone_flags = 0
zone_status = 3 (ZONE_IS_RUNNING)
zone_ntasks = 0x11
zone_nlwps_lock = {
_opaque = [ 0, 0 ]
}
[...]
#$
Comunidad OpenSolaris Hispano
9randP ( Linu2
%ntroduccin
Brandz es un tipo especfico de zona que permite la ejecucin de
binarios no nativos dentro de ella. Esta tecnologa se est
desarrollando dentro de el proyecto OpenSolaris, puesto que aun no
est finalizado puede que este documento quede obsoleto tras pasar
algunos meses, sin embargo es dificil que se produzca un cambio
radical de diseo por lo que en su mayora debera ser aplicable.
Linu2 dentro de un 9randP
Aunque con la tecnologa de los brandz podramos ejecutar
binarios de mltiples S.O. lo cierto es que actualmente solo est
probados versiones anteriores de Solaris y Linux. En este artculo nos
centraremos en este ltimo.
Dado que el formato de los ejecutables de Linux y OpenSolaris es
el mismo (ELF) idealmente deberamos poder procesarlos sin ms, sin
embargo estos esperan unos servicios por parte del kernel, a los que
suelen acceder mediante llamadas al sistema que, lgicamente, son
distintas en ambos S.O.. En el caso de Linux el problema va incluso un
paso ms all, ya que existen diferencias entre las distintas
distribuciones dependiendo del nivel de kernel y de la versin de
glibc.
TAcnica de interposicin
#$!
Comunidad OpenSolaris Hispano
En Linux un proceso para usar una llamada al sistema ejecuta la
interrupcin 80, este mtodo no existe en OpenSolaris, para emularlo
se ha diseado una macro BRAND_CALLBACK() que captura ese punto de
entrada. Una vez capturado, en lugar de seguir el flujo normal dentro
del kernel, esos hilos son procesados por un mdulo especfico para
tareas dentro de un brandz.
Existen otros puntos de interposicin situados en el flujo de
vida de un proceso para asegurar que el kernel presta todos los
servicios necesarios, como por ejemplo en la creacin/salida de hilos,
tratamiento de seales, etc.
Dicho mdulo hace de traductor, es decir modifica el formato de la
llamada al sistema de Linux a su equivalente a OpenSolaris. El ciclo
de vida sera el siguiente:
1. El proceso Linux ejecuta la interrupcin 80.
2. La macro BRAND_CALLBACK() comprueba si la interrupcin tiene
origen en un Brandz.
3. Opensolaris pasa el control del thread al mdulo especfico para
brandz.
4. El mdulo lx lanza la librera de emulacin.
5. Dicha librera modifica la llamada al sistema para que sea
compatible con OpenSolaris.
6. El kernel de OpenSolaris procesa la llamada y devuelve la salida
a la librera.
7. Otra vez se realizan las operaciones oportunas, ahora para
adaptar la salida a lo que espera el proceso Linux.
8. La librera devuelve el resultado al proceso.
Puesto que los servicios del kernel tienen pequeas variaciones
dependiendo de la versin y de que las libreras glibc usadas, ha da
de hoy (febrero del 2008) est probado y funciona de forma estable
RHEL 3, se est trabajando para que funcione RHEL 4 pero aun quedan
algunos flecos.
'eculiaridades
A pesar que lo expuesto parece sencillo, su implementacin
prctica es compleja, ya que son numerosas las peculiaridades con las
que topamos, tenes una lista detallada en la web de la comunidad. A
continuacin explico un par de ejemplos:
Algunas llamadas al sistema son muy diferentes entre OpenSolaris
y Linux, algunas ni siquiera tienen equivalente.
Quizs el caso ms llamativo es la llamada clone (), que Linux
usa para crear un hijo y que no existe en OpenSolaris. En su lugar se
utiliza fork (2), sin embargo alguno de los flags no tienen ninguna
equivalencia, afortunadamente su uso es marginal.
Otro caso curioso es que el nmero de seales existentes en Linux
y OpenSolaris para procesos en Real Time es distinto, 32 vs 7,
afortunadamente esas seales extras no tienen uso en la actualidad,
por lo que directamente se ignoran.
#$"
Comunidad OpenSolaris Hispano
Caso 'r7ctico
Crear un Brandz es sencillo, el procedimiento es identico a como
crear una zona, solo que al ejecutar el create debemos espcificar que
use el mdulo lx, por otro lado, cuando hacemos el install debemos
especificar la fuente de donde se deben copiar los binarios.
Para ir rpido podes descargar un tar de Centos 3.5 directamente
de la web de la comidad OpenSolaris, os dejo una captura de la shell
de todo el proceso:
# zonecfg -z linux
linux: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:linux> create -t SUNWlx
zonecfg:linux> set zonepath=/linux-zone
zonecfg:linux> commit
zonecfg:linux> exit
# mkdir /linux-zone
# chmod 700 /linux-zone
bash-3.2# zoneadm -z linux install -d /centos_fs_image.tar
Installing zone 'linux' at root directory '/linux-zone'
from archive '/centos_fs_image.tar'
This process may take several minutes.
Setting up the initial lx brand environment.
System configuration modifications complete.
Setting up the initial lx brand environment.
System configuration modifications complete.
Installation of zone 'linux' completed successfully.
Details saved to log file:
"/linux-zone/root/var/log/linux.install.7598.log"
bash-3.2# zoneadm list -cv
ID NAME STATUS PATH BRAND IP
0 global running / native shared
- linux installed /linux-zone lx shared
bash-3.2# zomadm -z linux boot
bash-3.2# zoneadm list -cv
ID NAME STATUS PATH BRAND IP
0 global running / native shared
1 linux running /linux-zone lx shared
bash-3.2# zlogin -C linux
[Connected to zone 'linux' console]
CentOS release 3.7 (Final)
Kernel 2.4.21 on an i686
linux login: ~.
[Connection to zone 'linux' console closed]
##$
Comunidad OpenSolaris Hispano
3irtualiPando con 23/
En esta entrada vamos a hablar sobre una de las opciones de
virtualizacin que podemos encontrar en OpenSolaris, se trata de 23/,
un hypervisor basado en 5en, que nos permite arrancar varias
instancias de distintos SO, como Linux, Windows y Solaris, en una
mquina con Solaris Express a partir de la build 75.
Permite ejecutar Windows, Linux y Solaris como SO invitados.
Solo corre en sistemas x86/x64.
Permite dos modos de virtualizacin, HVM y PVM.
Migracin de invitados en caliente.
Soporte para Intel VT-x y AMD-V.
'or 4uA utiliPar 23/
En el siguiente esquema, podemos ver los cuatro nichos, que
Solaris tiene para la gestin de los recursos.
No podemos olvidar que las distintas tcnicas de virtualizacin,
tienen como fin, no el que podamos disfrutar en una mquina de un SO
###
Comunidad OpenSolaris Hispano
Linux, un Windows y varias versiones distintas de Solaris, aunque
aparentemente suena tentador. El objetivo principal de utilizar
tecnologa de virtualizacin consiste en mejorar la forma en la que se
hace uso de los recursos disponibles en un sistema.
Cualquier persona que haya administrado un nmero considerable de
mquinas, conoce perfectamente que el uso de CPU y memoria est muy
por debajo de las posibilidades reales de la propia mquina, es normal
que la mayora de las mquinas se encuentren entre un 30% y un 60%, en
entornos de desarrollo estos valores decrecen considerablemente. Si
realizamos el ejercicio de calcular los recursos utilizados
normalmente en nuestras mquinas y sumamos estos resultados, nos
llevaremos una grata sorpresa, '() R*+,R)() D* '() -,* DI).(N*M()
*)/0N M,1 .(R *N+IM2 D*' ,)( R*2' -,* )* 32+* D* '() MI)M(, os
recomiendo que esta informacin nunca llegue al departamento
financiero, porque el ao siguiente recibiris una desagradable
sorpresa, al ver reducido el presupuesto de vuestra rea. .
El objetivo de la virtualizacin es aprovechar de la mejor manera
posible los recursos disponibles en nuestros sistemas. Sin entrar en
detalles, los recursos mas preciados en un sistema son:
Tiempo de ejecucin de CPU
Uso de la memoria
Entrada/Salida
'articiones fsicas,
En una mquina realizamos una serie de particiones a nivel fsico de
forma que se reparten los recursos disponibles entre los distintos SO
que van a ser ejecutados en la mquina. A todos los efectos disponemos
de varias mquinas, esa es la visin que tiene el SO.
M'(uinas virtuales,
En una mquina podemos tener corriendo varias mquinas virtuales con
distintos SO. En este caso los recursos son asignados mediante la
utilizacin de un $(pervisor que se encarga de gestionar el acceso al
##2
Comunidad OpenSolaris Hispano
HW, los distintos SO tienen asignados unos recursos que son
controlados por el $(pervisor.
3irtualiPacin de SO,
La virtualicacin de SO, consiste en que un SO anfitrin ejecuta
varias instancias del mismo SO, asignando y gestionando los recursos
del sistema. La impresin es de disponer varios sistemas con el mismo
SO.
Control de recursos,
Solaris dispone de una serie de herramientas para controlar los
recursos del sistema. CPU, memoria, tiempo de CPU, de esta forma los
recursos no son asignados a un SO invitado, sino que se asigna
mediante polticas a los procesos o grupos de procesos que estn
ejecutndose en el sistema.
23/ se encuentra dentro del nicho de m74uinas virtuales y sera
para 2+6 lo mismo que LDoms para SPARC.
&r4uitectura
La arquitectura de un sistema con 23/ consiste en:
Un hypervisor que controla el acceso a los recursos del sistema y
sirve como capa de abstraccin, entre los SO huspedes y el HW.
Un dominio principal, denominado dom*, que se encarga de
gestionar los recursos y los SO huspedes.
Dominios de usuario, denominados dom8, estos dominios son los
distintos SO huspedes que se ejecutarn en la mquina. Como SO
huspedes podemos tener:
o '3/ (paravirtualizacin), todos aquellos SO cuyo kernel
tenga soporte para 5en.
o $3/ (virtualizacin total), el SO no necesita que su kernel
disponga de soporte para 5en, la nica condicin es que los
procesadores de nuestro sistema tengan, en caso de Intel
que tenga soporte para 3irtualiPation Technolog( y en AMD,
&/DD3.
##3
Comunidad OpenSolaris Hispano
v
Red
Los distintos dom8 acceden a dispositivos virtuales, que estn
asociado a dispositivos virtuales en el dom* que a su vez se
encuentran asociados a un dispositivo fsico, como en este caso una
interfaz de red bge*.
Dispositivos de blo4ue
Un dominio, puede ser bien el dominio de control dom*, bien
cualquiera de los dominios de usuarios dom8, pueden exportar un
dispositivo de bloques, que puede ser a su vez, un dispositivo fsico,
como un disco o bien puede ser un fichero del FS, el cual es exportado
al dom8 y ste la visin que tendr ser la de que est accediendo a
un dispositivo de bloques.
Dispositivo fsico
disk = [`phy:dispositivo_dom0, disp_domU, rw']
#ichero
disk = [`file:file_dom0, disp_domU, rw']
##4
Comunidad OpenSolaris Hispano
?Tiene nuestro sistema soporte para 23/B
23/ esta disponible desde la build 75 de Solaris :2press. Para
comprobar que tenemos instalado en nuestra maquina 23/, podemos
chequear el directorio ;boot;
bash-3.2# cd /boot/
bash-3.2# ls
acpi grub solaris x86.miniroot-safe xen.gz
amd64 platform solaris.xpm xen-syms
bash-3.2#
En la salida anterior podemos comprobar que existe un kernel con
soporte para Xen, el fichero es 2en,gP. Tambin podemos chequear el
estado de los servicios en SMF.
bash-3.2# svcs | grep xvm
disabled 23:36:20 svc:/system/xvm/store:default
disabled 23:36:20 svc:/system/xvm/domains:default
disabled 23:36:21 svc:/system/xvm/console:default
disabled 23:36:22 svc:/system/xvm/xend:default
bash-3.2#
Los servicios de 23/
23/ cuenta con 4 servicios en el sistema de arranque S/#, estos 4
servicios deben estar habilitados para que podamos trabajar con 23/.
svc:/system/xvm/store:default, controla la configuracin de los
distintos dominios creados en el sistema.
svc!;s(stem;2vm;2end!default, gestiona al demonio que controla
todos los dominios
svc!;s(stem;2vm;console!default, se encarga de controlar las
consolas de los dominios.
svc!;s(stem;2vm;domains!default, se encarga de la parada/arranque
de los dominios durante la parada/arranque del sistema.
GR89 para 23/
En el apartado anterior hemos comprobado que nuestro sistema
puede correr con xVM, el siguiente paso consistes en arrancar el
kernel con soporte para Xen, para ello, vamos aadir a GR89 las
siguientes lneas:
bash-3.2# cat /boot/grub/menu.lst
#--------------------- xVM 64bits--------------------
title Solaris xVM
kernel$ /boot/$ISADIR/xen.gz
module$ /platform/i86xpv/kernel/$ISADIR/unix /platform/i86xpv/kernel/$ISADIR/unix
module$ /platform/i86pc/$ISADIR/boot_archive
#----------------------------------------------------
#--------------------- xVM 32bits--------------------
title Solaris xVM 32bits
kernel$ /boot/xen.gz
module$ /platform/i86xpv/kernel/unix /platform/i86xpv/kernel/unix
module$ /platform/i86pc/boot_archive
#----------------------------------------------------
Hemos aadido 2 entradas en GRUB, una para que arranque 23/ en
64bits y otra en 32bits. La razn principal para aadir una entra para
##5
Comunidad OpenSolaris Hispano
32bits, es que si el dom* esta en 64bits,los SO de los distintos dom8
tambin deben correr en 64bits y si el dom* esta corriendo a 32bits,
todos los domU deben correr a 32bits.
$erramientas para 23/
La gestin de los distintos domU que vayamos a tener en nuestro
sistema la podemos realizar con 4 herramientas:
virtDinstall, consiste en un script que nos ayuda en el proceso
de instalacin de un nuevo dom8, podemos ejecutarlo, pasando una
serie de parmetros o bien ejecutarlo sin ningn parmetro e
iremos contestando a una serie de preguntas.
virsh, es una shell con la que podemos gestionar los distintos
dom8 que tengamos creados en nuestro sistema.
2m, este comando nos permite realizar la gestin de los domU
desde la linea de comando, mediante la utilizacin de una serie
de parmetros.
virtDmanager, es un sencillo GUI que nos ayuda con la gestin de
los domU.
Directorios
Entre los directorios utilizados por 23/, vamos a destacar los
siguientes, por que son donde se almacenan los ficheros que vamos a
necesitar cuando comencemos a trabajar con 23/:
;var;log;2en, se utiliza para almacenar los logs, es importante
echar un vistazo a este directorio, ya que los errores que
devuelven los distintos comandos no son demasiado descriptivos.
;var;lib;2end;domains, cada dominio que creemos disponde de un
directorio, identificado con el %D del dominio. Existe un
directorio por cada dominio.
;var;2en;dump, en este directorio se almacenan, por defecto, los
ficheros cores que se crean cuando los solicitamos con el
subcomando dumpDcore de 2m.
Creando un dom8 con Linu2 Centos
La creacin de un nuevo dom8, es un proceso bastante sencillo, la
parte ms complicada est en la propia instalacin del SO que se
realizar sobre el nuevo dom8. Para el ejemplo, vamos a utilizar una
imagen ISO del DVD de instalacin de Centos -,F, esta es la imagen de
uno de los mirror oficiales.
Vamos a realizar la instalacin utilizando el comando virtDinstall, al
que pasaremos los siguientes parmetros:
Dn centosI26NI), nombre para el nuevo dom8
-r 512, cantidad de memoria asignada al nuevo dominio, en MB
Df ;e2port;home;2en;CentOSD-,F;centosI-FI26NI),img, fichero de
imagen se se utilizar como disco root del nuevo dominio.
##6
Comunidad OpenSolaris Hispano
Ds -, tamao en GB de disco.
Vnographics, no queremos configurar la consola grfica para el
nuevo dominio.
Vparavirt, vamos a utilizar la paravirtualizacin
VosDt(peTlinu2, el SO que vamos a instalar en el dom8 es de tipo
linu2.
Dl ;e2port;home;root;Desktop;CentOSD-,FD2+6I6NDbinDD3D,iso, es el
fichero con la imagen de un SO que utilizaremos para instalar.
(huelva@dom0)# virt-install -n centos_x64_2 -r 512
-f /export/home/xen/CentOS-5.1/centos_51_x64_2.img
-s 5 --nographics --paravirt --os-type=linux
-l /export/home/root/Desktop/CentOS-5.1-x86_64-bin-DVD.iso
Starting install...
Creating storage file... 100% |=========================| 5.0 GB 00:00
Creating domain... 0 B 00:06
Bootdata ok (command line is method=/export/home/root/Desktop/CentOS-5.1-x86_64-
bin-DVD.iso)
Linux version 2.6.18-53.el5xen (mockbuild@builder6.centos.org) (gcc version 4.1.2
20070626 (Red Hat 4.1.2-14)) #1 SMP Mon Nov 12 02:46:57 EST 2007
BIOS-provided physical RAM map:
Xen: 0000000000000000 - 0000000020800000 (usable)
No mptable found.
Built 1 zonelists. Total pages: 133120
Kernel command line: method=/export/home/root/Desktop/CentOS-5.1-x86_64-bin-
DVD.iso
Initializing CPU#0
PID hash table entries: 4096 (order: 12, 32768 bytes)
Xen reported: 2194.498 MHz processor.
Console: colour dummy device 80x25
Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)
Inode-cache hash table entries: 65536 (order: 7, 524288 bytes)
Software IO TLB disabled
Memory: 500480k/532480k available (2357k kernel code, 23224k reserved, 1326k data,
172k init)
Calibrating delay using timer specific routine.. 5489.47 BogoMIPS (lpj=10978940)
Security Framework v1.0.0 initialized
SELinux: Initializing.
....
Welcome to CentOS
+---------+ Choose a Language +---------+
| |
| What language would you like to use |
| during the installation process? |
| |
| Catalan ^ |
| Chinese(Simplified) : |
| Chinese(Traditional) # |
| Croatian : |
| Czech : |
| Danish : |
| Dutch : |
| English v |
##
Comunidad OpenSolaris Hispano
| |
| +----+ |
| | OK | |
| +----+ |
| |
| |
+---------------------------------------+
/ between elements | selects | next screen
Para el ejemplo utilizaremos la opcin de instalar mediante NFS,
para ellos utilizaremos como servidor NFS nuestro dom* y compartiremos
el directorio donde se encuentra la ISO de Centos.
(huelva@dom0)# share /export/home/root/Desktop/
(huelva@dom0)# share
- /export/home/root/Desktop rw ""
(huelva@dom0)#
El siguiente paso consiste en configurar una IP cuando el
instalador de Centos nos lo solicite, tambin nos pedir que le
digamos cual es la IP del servidor de NFS y el directorio que dicho
servidor est compartiendo.
Welcome to CentOS
+----------------------+ NFS Setup +----------------------+
| |
| Please enter the following information: |
| |
| o the name or IP number of your NFS server |
| o the directory on that server containing |
| CentOS for your architecture |
| |
| NFS server name: 192.168.0.192___________ |
| CentOS directory: port/home/root/Desktop/_ |
| |
| +----+ +------+ |
| | OK | | Back | |
| +----+ +------+ |
| |
| |
+---------------------------------------------------------+
mo
/ between elements | selects | next screen
Una vez terminado el proceso de instalacin, podemos arrancar el
nuevo dom8 en el que hemos instalado nuestro Centos, con el comando 2m
start arrancaremos el dominio centosI26N.
(huelva@dom0)# xm start centos_x64
(huelva@dom0)# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 774 2 r----- 389.4
centos_x64 30 720 2 -b---- 39.0
(huelva@dom0)#
Nuestro Centos est arrancando, podemos conectarnos a la consola
del nuevo dominio, utilizando el comando 2m console.
bash-3.2# xm console centos_x64
rtc: IRQ 8 is not free.
rtc: IRQ 8 is not free.
i8042.c: No controller found.
Red Hat nash version 5.1.19.6 starting
Reading all physical volumes. This may take a while...
##!
Comunidad OpenSolaris Hispano
Found volume group "VolGroup00" using metadata type lvm2
2 logical volume(s) in volume group "VolGroup00" now active
Welcome to CentOS release 5 (Final)
Press 'I' to enter interactive startup.
Cannot access the Hardware Clock via any known method.
Use the --debug option to see the details of our search for an access method.
Setting clock (utc): Wed Mar 12 01:09:11 CET 2008 [ OK ]
Starting udev: [ OK ]
Loading default keymap (us): [ OK ]
Setting hostname trantor: [ OK ]
Setting up Logical Volume Management: 2 logical volume(s) in volume group
"VolGroup00" now active [ OK ]
Checking filesystems
Checking all file systems.
[/sbin/fsck.ext3 (1) -- /] fsck.ext3 -a /dev/VolGroup00/LogVol00
/dev/VolGroup00/LogVol00: clean, 108551/1007872 files, 735200/1007616 blocks
[/sbin/fsck.ext3 (1) -- /boot] fsck.ext3 -a /dev/xvda1
/boot: clean, 36/26104 files, 16420/104388 blocks
[ OK ]
Remounting root filesystem in read-write mode: [ OK ]
Mounting local filesystems: [ OK ]
Enabling local filesystem quotas: [ OK ]
Enabling /etc/fstab swaps: [ OK ]
INIT: Entering runlevel: 3
Entering non-interactive startup
Applying Intel CPU microcode update: [FAILED]
Starting monitoring for VG VolGroup00: 2 logical volume(s) in volume group
"VolGroup00" monitored [ OK ]
Starting background readahead: [ OK ]
Checking for hardware changes [ OK ]
Applying ip6tables firewall rules: [ OK ]
...
Starting sm-client: [ OK ]
Starting console mouse services: [ OK ]
Starting crond: [ OK ]
Starting xfs: [ OK ]
Starting anacron: [ OK ]
Starting atd: [ OK ]
Starting yum-updatesd: [ OK ]
Starting Avahi daemon... [ OK ]
Starting HAL daemon: [ OK ]
Starting smartd: [ OK ]
CentOS release 5 (Final)
Kernel 2.6.18-53.el5xen on an x86_64
trantor login:
La siguiente imagen muestra como podemos exportar el display de
nuestra maquina virtual centosI26N para trabajar con el entorno WD:,
desde una ventana de 5nest
##"
Comunidad OpenSolaris Hispano
'arando un dom8
Para parar un dom8, podemos utilizar varios subcomandos del
comando 2m:
2m destro(, esto es parecido a meter un botonazo al domU.
(huelva@dom0)# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 774 2 r----- 389.4
centos_x64 30 720 2 -b---- 39.0
(huelva@dom0)#
(huelva@dom0)# xm destroy centos_x64
(huelva@dom0)# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 774 2 r----- 391.7
centos_x64 512 1 0.0
(huelva@dom0)#
2m reboot, provoca un reboot en el domU.
'ausando un dom8
Tenemos dos formas de suspender la ejecucin de un dom8 y volver a
ejecutarla cuando nosotros deseemos:
2m pause, provoca una pausa en la ejecucin del domU. Para que el
dominio vuelva a ejecutarse utilizaremos el comando 2m unpause.
(huelva@dom0)# xm pause centos_x64
(huelva@dom0)# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 1485 2 r----- 256.9
centos_x64 6 512 1 --p--- 40.7
solaris_11_x64 750 1 64.8
(huelva@dom0)#
#2$
Comunidad OpenSolaris Hispano
2m suspend, en este caso se provoca una suspensin del dominio,
se almacena en disco el estado de ejecucin del dominio y se
para, de echo podriamos volver a ejecutar el dominio, bien con el
comando 2m resume o bien volviendo a arrancarlo con el comando 2m
start, es este caso arrancara como si hubiramos dado un
botonazo al dominio.
(huelva@dom0)# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 1479 2 r----- 366.0
centos_x64 8 511 1 -b---- 0.1
solaris_11_x64 750 1 64.8
(huelva@dom0)#
(huelva@dom0)# xm suspend centos_x64
(huelva@dom0)# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 1479 2 r----- 374.7
centos_x64 1 1 0.1
solaris_11_x64 750 1 64.8
Como podemos ver en el ejemplo, al suspender un dominio no tiene
estado en la columna state.
'untos de control
Tenemos la posibilidad de almacenar en un fichero, la ejecucin
de un dominio en un determinado instante, esto nos permite crear
puntos de control, para posteriormente recuperarlos en caso necesario.
(huelva@dom0)# xm save centos_x64 /var/snap/centos_x64.save_01;xm
restore /var/snap/centos_x64.save_01
(huelva@dom0)#
Con la lnea anterior hemos creado un fichero con la imagen de la
ejecucin del dominio centosI26N en un momento determinado, justo
despus hemos utilizado el comando 2m restore para continuar la
ejecucin. El tiempo que el dominio ha estado parado correspondo con
el tiempo que hemos tardado en almacenar en disco el fichero. Si no
ejecutamos el comando 2m restore el dominio estar offline.
9orrando un dom8
Para borrar un domU, necesitamos que primero est parado y
posteriormente podemos utilizar el comando 2m delete :
(huelva@dom0)# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 774 2 r----- 391.7
centos_x64 512 1 0.0
(huelva@dom0)#
(huelva@dom0)# xm delete centos_x64
(huelva@dom0)# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 774 2 r----- 392.6
(huelva@dom0)#
El domU centosI26N ha sido eliminado, pero el fichero que hemos
utilizado como disco root continua en su directorio original, por lo
que podemos utilizarlo para otra prueba. El comando 2m delete solo
elimina las configuraciones del domU que utiliza xVM.
#2#
Comunidad OpenSolaris Hispano
&signando C'8 a un dom8
Al crear el domU se le asigna un nmero de CPUs determinado, con
el comando xm podemos cambiar, posteriormente, el nmero de CPUs
asignados a un domU.
(huelva@dom0)# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 774 2 r----- 389.4
centos_x64 30 512 1 -b---- 39.0
(huelva@dom0)# xm vcpu-set centos_x64 2
(huelva@dom0)# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 774 2 r----- 389.4
centos_x64 30 512 2 -b---- 39.0
Si modificamos el nmero de CPUs, debemos reiniciar el domU para
que el cambio tenga efecto.
[trantor@domU ~]# init 6
...
[trantor@domU ~]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 Duo CPU E4500 @ 2.20GHz
stepping : 13
cpu MHz : 2194.500
cache size : 2048 KB
physical id : 0
siblings : 1
core id : 0
cpu cores : 1
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu tsc msr pae mce cx8 apic mca cmov pat pse36 clflush dts acpi
mmx fxsr
sse sse2 ss ht tm syscall nx lm constant_tsc pni monitor ds_cpl est tm2 cx16 xtpr
lahf_lm
bogomips : 5489.33
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 Duo CPU E4500 @ 2.20GHz
stepping : 13
cpu MHz : 2194.500
cache size : 2048 KB
physical id : 1
siblings : 1
core id : 0
cpu cores : 1
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu tsc msr pae mce cx8 apic mca cmov pat pse36 clflush dts acpi
mmx fxsr
#22
Comunidad OpenSolaris Hispano
sse sse2 ss ht tm syscall nx lm constant_tsc pni monitor ds_cpl est tm2 cx16 xtpr
lahf_lm
bogomips : 5489.33
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:
[trantor@domU ~]
&signando memoria a un dom8
Al crear un nuevo domU se le asigna una cantidad de memoria, con
el comando 2m memDset y 2m memDma2 podemos modificar la cantidad de
memoria asignada a un domU.
(huelva@dom0)# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 774 2 r----- 389.4
centos_x64 30 512 1 -b---- 39.0
(huelva@dom0)# xm mem-set centos_x64 720
(huelva@dom0)# xm mem-max centos_x64 720
(huelva@dom0)# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 774 2 r----- 389.4
centos_x64 30 720 2 -b---- 39.0
(huelva@dom0)#
Al igual que ocurre con los cambios en el nmero de CPUs, cuando
realizamos cambios en la cantidad de memoria asignada a un domU,
debemos reiniciar el domU para que los cambios tengan efecto.
[trantor@domU ~] init 6
...
[trantor@domU ~]# cat /proc/meminfo
MemTotal: 737280 kB
MemFree: 462248 kB
Buffers: 12920 kB
Cached: 152432 kB
SwapCached: 0 kB
Active: 70148 kB
Inactive: 144184 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 737280 kB
LowFree: 462248 kB
SwapTotal: 1081336 kB
SwapFree: 1081336 kB
Dirty: 764 kB
Writeback: 0 kB
AnonPages: 49060 kB
Mapped: 9012 kB
Slab: 18428 kB
PageTables: 2996 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 1449976 kB
Committed_AS: 94868 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 1160 kB
VmallocChunk: 34359736511 kB
&signando interfaP de red un dom8
Podemos aadir interfaces de red a un domU ya creado utilizando
el comando 2m net<orkDattach, este comando acepta una serie de
#23
Comunidad OpenSolaris Hispano
parmetros, que nos permitirn definir las caractersticas del nuevo
interfaz.
(huelva@dom0)# xm network-attach centos_x64
Si vemos el fichero /var/log/messages del domU.
[trantor@domU]# tail -f /var/log/messages | grep device
trantor kernel: netfront: device eth1 has flipping receive path.
Vemos como el dispositivo ethF ha sido aadido al sistema, al
contrario de lo que ocurre con los cambios en CPUs y memoria, en este
caso no necesitamos reinicial el domU.
&signando un nuevo disco a un dom8
Vamos a ver cmo podemos asignar un nuevo disco a un domU que
est corriendo. Lo primero que tenemos que hacer es decidir, qu vamos
a utilizar como almacenamiento, para nuestro ejemplo utilizaremos un
fichero de 50MB, que crearemos con el comando dd.
(huelva@dom0)# dd if=/dev/zero of=/var/prueba/discos1.img count=100000
100000+0 records in
100000+0 records out
(huelva@dom0)#
Una vez creado el fichero, lo asignamos al dominio centosI26N.
(huelva@dom0)# xm block-attach centos_x64 file:/var/prueba/discos1.img hdd1 w
(huelva@dom0)#
Le hemos dado el nombre hddF al nuevo dispositivo asignado al
domU. Si antes de asignar el dispositivo, tenemos una sesin abierta
con la consola del domU centosI26N, veremos como el sistema registra
el nuevo dispositivo y aparece un mensaje parecido a Registering
block device major 22", este mensaje depender el SO que tenemos
instalado en el domU. Con el comando ls podemos comprobar que en el
directorio ;dev; del domU a aparecido el dispositivo hddF, ejecutamos
el comando fdisk sobre el nuevo disco.
[trantor@domU ]# Registering block device major 22
[trantor@domU ]# ls
console loop3 parport3 ram4 tty tty22 tty37 tty51 tty9
core loop4 port ram5 tty0 tty23 tty38 tty52 ttyS0
cpu loop5 ppp ram6 tty1 tty24 tty39 tty53 ttyS1
disk loop6 ptmx ram7 tty10 tty25 tty4 tty54 ttyS2
evtchn loop7 pts ram8 tty11 tty26 tty40 tty55 ttyS3
fd MAKEDEV ram ram9 tty12 tty27 tty41 tty56 urandom
full mapper ram0 ramdisk tty13 tty28 tty42 tty57 vcs
gpmctl md0 ram1 random tty14 tty29 tty43 tty58 vcsa
hdd1 mem ram10 rawctl tty15 tty3 tty44 tty59 VolGroup00
initctl net ram11 root tty16 tty30 tty45 tty6 X0R
input null ram12 rtc tty17 tty31 tty46 tty60 xvc0
kmsg nvram ram13 shm tty18 tty32 tty47 tty61 xvda
log oldmem ram14 stderr tty19 tty33 tty48 tty62 xvda1
loop0 parport0 ram15 stdin tty2 tty34 tty49 tty63 xvda2
loop1 parport1 ram2 stdout tty20 tty35 tty5 tty7 xvdb
loop2 parport2 ram3 systty tty21 tty36 tty50 tty8 zero
[trantor@domU ]# fdisk /dev/hdd1
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.Warning: invalid flag 0x0000 of partition table 4
will be corrected by w(rite)
Command (m for help): p
Disk /dev/hdd1: 51 MB, 51200000 bytes
255 heads, 63 sectors/track, 6 cylinders
#24
Comunidad OpenSolaris Hispano
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
Command (m for help):
Creando un dom8 con Solaris :2press
Vamos a realizar una instalacin bsica de un Solaris en un nuevo
domU, para la instalacin utilizaremos la imagen ISO del primer disco.
Utilizaremos el comando virtDinstall y utilizaremos los siguientes
parmetros:
Dn solarisIFFI26N, nombre para el nuevo dom8
Dr -F), cantidad de memoria asignada al nuevo dominio, en MB
Df ;e2port;home;2en;SolarisIFF;solarisIFFI26N,img, fichero de
imagen se se utilizar como disco root del nuevo dominio.
Ds -, tamao en GB de disco.
Vnographics, no queremos configurar la consola grfica para el
nuevo dominio.
Vparavirt, vamos a utilizar la paravirtualizacin
VosDt(peTsolaris, el SO que vamos a instalar en el dom8 es de
tipo linu2.
Dl ;e2port;home;%/&G:S;SolarisIFFI2+6IF,iso, es el fichero con la
imagen de un SO que utilizaremos para instalar.
bash-3.2# virt-install -n solaris_11_x64 -r 512
-f /export/home/xen/Solaris_11/solaris_11_x64.img -s 5 --nographics
--paravirt --os-type=solaris -l /export/home/IMAGES/Solaris_11_x86_1.iso
Starting install...
Creating storage file... 100% |=========================| 5.0 GB 00:00
Creating domain... 0 B 00:07
v3.0.4-1-xvm chgset 'Mon Nov 12 23:09:42 2007 -0800 13228:ed897008a4c9'
SunOS Release 5.11 Version snv_78 64-bit
Copyright 1983-2007 Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
Configuring /dev
Solaris Interactive Text (Console session)
Using install cd in /dev/dsk/c0d1p0
Using RPC Bootparams for network configuration information.
Attempting to configure interface xnf0...
Skipped interface xnf0
Reading ZFS config: done.
Setting up Java. Please wait...
Y tanto que esper, de aqu no pas la instalacin, tuve que subir a 750MB la
memoria asignada para que la instalacin pudiera continuar.
bash-3.2# virt-install -n solaris_11_x64 -r 750
-f /export/home/xen/Solaris_11/solaris_11_x64.img -s 5
--nographics --paravirt --os-type=solaris
-l /export/home/IMAGES/Solaris_11_x86_1.iso
Starting install...
Creating domain... 0 B 00:06
v3.0.4-1-xvm chgset 'Mon Nov 12 23:09:42 2007 -0800 13228:ed897008a4c9'
SunOS Release 5.11 Version snv_78 64-bit
#25
Comunidad OpenSolaris Hispano
Copyright 1983-2007 Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
Configuring /dev
Solaris Interactive Text (Console session)
Using install cd in /dev/dsk/c0d1p0
Using RPC Bootparams for network configuration information.
Attempting to configure interface xnf0...
Skipped interface xnf0
Reading ZFS config: done.
Setting up Java. Please wait...
Beginning system identification...
Searching for configuration file(s)...
Search complete.
Discovering additional network configuration...
Select a Language
1. English
2. French
3. German
4. Italian
5. Japanese
6. Korean
7. Simplified Chinese
8. Spanish
9. Swedish
10. Traditional Chinese
Please make a choice (1 - 10), or press h or ? for help:
- The Solaris Installation Program ---------------------------------------------
The Solaris installation program is divided into a series of short sections
where you'll be prompted to provide information for the installation. At
the end of each section, you'll be able to change the selections you've
made before continuing.
About navigation...
- The mouse cannot be used
- If your keyboard does not have function keys, or they do not
respond, press ESC; the legend at the bottom of the screen
will change to show the ESC keys to use for navigation.
--------------------------------------------------------------------------------
F2_Continue F6_Help
- DHCP for xnf0 ----------------------------------------------------------------
Specify whether or not this network interface should use DHCP to configure
itself. Choose Yes if DHCP is to be used, or No if the network interface is
to be configured manually.
NOTE: DHCP support will not be enabled, if selected, until after the system
reboots.
Use DHCP for xnf0
-----------------
[ ] Yes
[X] No
--------------------------------------------------------------------------------
Esc-2_Continue Esc-6_Help
#26
Comunidad OpenSolaris Hispano
- Confirm Information for xnf0 -------------------------------------------------
> Confirm the following information. If it is correct, press F2;
to change any information, press F4.
Networked: Yes
Use DHCP: No
Host name: mordor
IP address: 192.168.0.190
System part of a subnet: Yes
Netmask: 255.255.255.0
Enable IPv6: No
Default Route: Specify one
Router IP Address: 192.168.0.1
--------------------------------------------------------------------------------
Esc-2_Continue Esc-4_Change Esc-6_Help
- Time Zone --------------------------------------------------------------------
On this screen you must specify your default time zone. You can specify a
time zone in three ways: select one of the continents or oceans from the
list, select other - offset from GMT, or other - specify time zone file.
> To make a selection, use the arrow keys to highlight the option and
press Return to mark it [X].
Continents and Oceans
----------------------------------
- [ ] Africa
[ ] Americas
[ ] Antarctica
[ ] Arctic Ocean
[ ] Asia
[ ] Atlantic Ocean
[ ] Australia
[X] Europe
v [ ] Indian Ocean
--------------------------------------------------------------------------------
Esc-2_Continue Esc-6_Help
- Profile ----------------------------------------------------------------------
The information shown below is your profile for installing Solaris software.
It reflects the choices you've made on previous screens.
NOTE: You must change the BIOS because you have changed the default boot
device.
============================================================================
- Installation Option: Initial
Boot Device: c0d0
Client Services: None

Locales: Spain (ISO8859-1)
System Locale: C ( C )

Software: Solaris 11, Core System Support

File System and Disk Layout: / c0d0s0 1134 MB
v swap c0d0s1 512 MB
#2
Comunidad OpenSolaris Hispano
--------------------------------------------------------------------------------
Esc-2_Begin Installation F4_Change F5_Exit F6_Help
Executing JumpStart postinstall phase...
The begin script log 'begin.log'
is located in /var/sadm/system/logs after reboot.
The finish script log 'finish.log'
is located in /var/sadm/system/logs after reboot.
Pausing for 90 seconds at the "Reboot" screen. The wizard will continue to
the next step unless you select "Pause". Enter 'p' to pause. Enter 'c' to
continue. [c]
Unable to run Launcher without Java.
The following CDs will not be installed:
Solaris Software 2 for x86 Platforms
Creating ram disk for /a
updating /a/platform/i86pc/boot_archive...this may take a minute
updating /a/platform/i86pc/amd64/boot_archive...this may take a minute
syncing file systems... done
rebooting...
Guest installation complete... restarting guest.
v3.0.4-1-xvm chgset 'Mon Nov 12 23:09:42 2007 -0800 13228:ed897008a4c9'
SunOS Release 5.11 Version snv_78 64-bit
Copyright 1983-2007 Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
Hostname: mordor
Configuring devices.
Loading smf(5) service descriptions: 114/114
/dev/rdsk/c0d0s7 is clean
Reading ZFS config: done.
mordor console login: root
Mar 12 22:36:29 mordor login: ROOT LOGIN /dev/console
Sun Microsystems Inc. SunOS 5.11 snv_78 October 2007
mordor# uname -a
SunOS mordor 5.11 snv_78 i86pc i386 i86xpv
mordor#
mordor# df -k
Filesystem kbytes used avail capacity Mounted on
/dev/dsk/c0d0s0 1125599 595232 474088 56% /
/devices 0 0 0 0% /devices
/dev 0 0 0 0% /dev
ctfs 0 0 0 0% /system/contract
proc 0 0 0 0% /proc
mnttab 0 0 0 0% /etc/mnttab
swap 1073356 376 1072980 1% /etc/svc/volatile
objfs 0 0 0 0% /system/object
sharefs 0 0 0 0% /etc/dfs/sharetab
/usr/lib/libc/libc_hwcap3.so.1
1125599 595232 474088 56% /lib/libc.so.1
fd 0 0 0 0% /dev/fd
swap 1072980 0 1072980 0% /tmp
swap 1072992 12 1072980 1% /var/run
/dev/dsk/c0d0s7 3494494 3489 3456061 1% /export/home
mordor#
#2!
Comunidad OpenSolaris Hispano
.avegando en el ;proc
Todos los sistemas Unix disponen de una serie de ficheros, los
cuales mantienen informacin sobre los distintos procesos que se estn
ejecutando en la mquina, Solaris utiliza un pseudo sistemas de
ficheros llamado 'rocfs, en el cual, el kernel mantiene informacin
sobre los procesos que est corriendo.
#2"
Comunidad OpenSolaris Hispano
El sistema de archivos procfs est organizado en directorios, uno
por cada proceso en que se ejecuta en la mquina, los directorios se
llaman con el PID del proceso del cual mantienen la informacin.
(root@huelva)# cd /proc
(root@huelva)# ls
0 14470 18279 19575 22216 2496 28190 3782 4622 605
1 1464 18340 19604 22610 25190 28252 398 4636 606
10192 1465 18709 19634 22645 25229 285 421 472 6347
10622 14896 18779 2 23054 25479 28610 4210 476 664
11058 15321 18973 20009 23072 25626 28685 439 496 6775
11478 15751 18983 20063 23484 25656 29038 442 5021 678
11906 16187 19031 20450 23505 26047 29039 4428 505 679
1215 1646 19047 20490 23785 26089 29124 445 5061 680
12332 16460 19059 2072 23909 26474 2926 4608 507 7077
127 16611 19064 20881 23945 26528 29464 4609 508 7082
12756 16959 19086 20923 24099 26900 29888 4610 520 7204
13186 17051 19092 21312 24121 26951 3 4611 523 73
13622 17405 19100 21362 24336 27324 326 4613 5491 7628
1372 17480 19105 21744 24369 27382 3362 4614 552 784
14 17849 19141 21785 24764 27754 353 4619 554 789
14042 17907 19202 22178 24800 27811 371 4621 5927 8058
(root@huelva)#
Cada uno de estos ficheros que representa a un proceso contiene
un a serie de ficheros y directorios, de los cuales podemos obtener
informacin sobre el proceso y todos sus LWP.
(root@huelva)# cd 29039
(root@huelva)# ls -l
total 5933
-rw------- 1 nagios nagios 2998272 Apr 11 12:13 as
-r-------- 1 nagios nagios 152 Apr 11 12:13 auxv
-r-------- 1 nagios nagios 36 Apr 11 12:13 cred
--w------- 1 nagios nagios 0 Apr 11 12:13 ctl
lr-x------ 1 nagios nagios 0 Apr 11 12:13 cwd ->
dr-x------ 2 nagios nagios 8208 Apr 11 12:13 fd
-r--r--r-- 1 nagios nagios 344 Apr 11 12:13 lpsinfo
-r-------- 1 nagios nagios 2720 Apr 11 12:13 lstatus
-r--r--r-- 1 nagios nagios 1064 Apr 11 12:13 lusage
dr-xr-xr-x 5 nagios nagios 80 Apr 11 12:13 lwp
-r-------- 1 nagios nagios 3744 Apr 11 12:13 map
dr-x------ 2 nagios nagios 800 Apr 11 12:13 object
-r-------- 1 nagios nagios 4336 Apr 11 12:13 pagedata
-r--r--r-- 1 nagios nagios 336 Apr 11 12:13 psinfo
-r-------- 1 nagios nagios 3744 Apr 11 12:13 rmap
lr-x------ 1 nagios nagios 0 Apr 11 12:13 root ->
-r-------- 1 nagios nagios 1472 Apr 11 12:13 sigact
-r-------- 1 nagios nagios 1232 Apr 11 12:13 status
-r--r--r-- 1 nagios nagios 256 Apr 11 12:13 usage
-r-------- 1 nagios nagios 0 Apr 11 12:13 watch
-r-------- 1 nagios nagios 5928 Apr 11 12:13 xmap
(root@huelva)#
;proc;X pid S;as
Este fichero contiene una imagen del espacio de direcciones del
proceso, podemos abrirlo para realizar tanto lecturas como escrituras.
;proc;X pid S;au2v
Contiene una array de elementos de tipo au2vIt los cuales son
pasados al linkador dinmico en el momento en el que se arranc el
proceso.
;proc;X pid S;cred
#3$
Comunidad OpenSolaris Hispano
Este fichero contiene la descripcin de las credenciales del
proceso. Las credenciales del proceso las define la estructura de
datos struct prcred que podemos encontrar el fichero de cabecera
s(s;procfs,h
;proc;X pid S;ctl
Este fichero es solo de lectura y lo podemos utilizar para enviar
mensajes de control al proceso.
;proc;X pid S;c<d
Es un enlace simblico al directorio actual de trabajo del proceso.
;proc;X pid S;fd;
Este directorio contiene una referencia a cada uno de los
descriptores de ficheros que tiene abierto el proceso.
;proc;X pid S;psinfo
Este fichero contiene informacin del proceso, tal como el PID
del su proceso padre, la lista de argumentos, el tamao de la imagen
del proceso en memoria. Para obtener la informacin de este fichero
debemos utilizar una estructura de datos de tipo struct psinfo que
est definida en el fichero s(s;procfs,h.
typedef struct psinfo {
int pr_flag; /* process flags */
int pr_nlwp; /* number of lwps in process */
pid_t pr_pid; /* unique process id */
pid_t pr_ppid; /* process id of parent */
pid_t pr_pgid; /* pid of process group leader */
pid_t pr_sid; /* session id */
uid_t pr_uid; /* real user id */
uid_t pr_euid; /* effective user id */
gid_t pr_gid; /* real group id */
gid_t pr_egid; /* effective group id */
uintptr_t pr_addr; /* address of process */
size_t pr_size; /* size of process image in Kbytes */
size_t pr_rssize; /* resident set size in Kbytes */
size_t pr_pad1;
dev_t pr_ttydev; /* controlling tty device (or PRNODEV) */
/* The following percent numbers are 16-bit binary */
/* fractions [0 .. 1] with the binary point to the */
/* right of the high-order bit (1.0 == 0x8000) */
ushort_t pr_pctcpu; /* % of recent cpu time used by all lwps */
ushort_t pr_pctmem; /* % of system memory used by process */
timestruc_t pr_start; /* process start time, from the epoch */
timestruc_t pr_time; /* usr+sys cpu time for this process */
timestruc_t pr_ctime; /* usr+sys cpu time for reaped children */
char pr_fname[PRFNSZ]; /* name of execed file */
char pr_psargs[PRARGSZ]; /* initial characters of arg list */
int pr_wstat; /* if zombie, the wait() status */
int pr_argc; /* initial argument count */
uintptr_t pr_argv; /* address of initial argument vector */
uintptr_t pr_envp; /* address of initial environment vector */
char pr_dmodel; /* data model of the process */
char pr_pad2[3];
taskid_t pr_taskid; /* task id */
projid_t pr_projid; /* project id */
int pr_filler[5]; /* reserved for future use */
lwpsinfo_t pr_lwp; /* information for representative lwp */
} psinfo_t;
;proc;X pid S;map
Consiste en un array de elementos del tipo struct prmap los
cuales representan un mapa del
espacio de direcciones del proceso.
#3#
Comunidad OpenSolaris Hispano
;proc;X pid S;rmap
Exactamente igual que ocurra con el fichero map, el fichero rmap
contien un array de elementos de tipo struct prmap los cuales
representan los rangos de direcciones reservadas del proceso dentro de
su espacio de direcciones.
;proc;X pid S;2map
Contiene informacin extendida sobre el espacio de direcciones
del proceso. Para poder leer correctamente el contenido de este
fichero necesitaremos utilizar un elemento de tipo struct pr2map, cuya
definicin podemos encontrar en s(s;procfs,h
;proc;X pid S;object;
Es un directorio que contiene los objetos binarios que han sido
linkados en el arranque del proceso.
;proc;X pid S;pagedata
Contiene una representacin del espacio de direcciones del
proceso, de las cual podemos sacar informacin como el nmero de
pginas que conforman un mapeo de memoria concreto.
;proc;X pid S;sigact
Contiene informacin sobre las acciones asignadas a las seales que
sern tratadas por el proceso.
;proc;X pid S;status
Contiene informacin de estado del proceso, para poder leer esta
informacin correctamente, debemos utilizar un elemento de tipo struct
pstatus que est definido en el fichero s(s;procfs,h
typedef struct pstatus {
int pr_flags; /* flags (see below) */
int pr_nlwp; /* number of lwps in the process */
pid_t pr_pid; /* process id */
pid_t pr_ppid; /* parent process id */
pid_t pr_pgid; /* process group id */
pid_t pr_sid; /* session id */
id_t pr_aslwpid; /* lwp id of the aslwp, if any */
id_t pr_agentid; /* lwp id of the /proc agent lwp, if any */
sigset_t pr_sigpend; /* set of process pending signals */
uintptr_t pr_brkbase; /* address of the process heap */
size_t pr_brksize; /* size of the process heap, in bytes */
uintptr_t pr_stkbase; /* address of the process stack */
size_t pr_stksize; /* size of the process stack, in bytes */
timestruc_t pr_utime; /* process user cpu time */
timestruc_t pr_stime; /* process system cpu time */
timestruc_t pr_cutime; /* sum of children's user times */
timestruc_t pr_cstime; /* sum of children's system times */
sigset_t pr_sigtrace; /* set of traced signals */
fltset_t pr_flttrace; /* set of traced faults */
sysset_t pr_sysentry; /* set of system calls traced on entry */
sysset_t pr_sysexit; /* set of system calls traced on exit */
char pr_dmodel; /* data model of the process (see below) */
char pr_pad[3];
taskid_t pr_taskid; /* task id */
projid_t pr_projid; /* project id */
int pr_filler[17]; /* reserved for future use */
lwpstatus_t pr_lwp; /* status of the representative lwp */
} pstatus_t;
;proc;X pid S;usage
Este fichero contiene informacin sobre estadsticas del proceso,
tales como tiempos de uso de CPU, tiempos de fallos de pginas, nmero
de llamadas a sistema, etc. Para poder leer toda esta informacin
#32
Comunidad OpenSolaris Hispano
necesitamos utilizar la estructura de datos struct prusage, la cual
est definida en el fichero s(s;procfs,h.
;proc;X pid S;<atch
Contiene un array con todos los watchpoints activos en el
proceso.
;proc;X pid S;l<p;
Este directorio contiene a su vez un subdirectorio por cada LWP
del proceso, el nombre de este subdirectorio corresponde con el ID del
LWP.
;proc;X pid S;l<p;X l<pid S;l<pctl
Al igual que podemos enviar mensajes de control al proceso,
podemos hacer lo mismo con cada LWP, mediante este fichero que es de
solo escritura.
;proc;X pid S;l<p;X l<pid S;l<psinfo
Contiene informacin del LWP tal como el id del procesador en el
que ha corrido, uso de CPU o la direccin de la GC$&. que tiene
asociado el LWP. Para poder leer toda esta informacin necesitamos un
elemento de tipo struct l<psinfo, cuya definicin podemos encontrarla
en el fichero s(s;procfs,h.
;proc;X pid S;l<p;X l<pid S;l<pstatus
Contiene informacin de estado del LWP, para acceder a esta
informacin necesitamos un elemento de tipo struct l<pstatus.
typedef struct lwpstatus {
int pr_flags; /* flags (see below) */
id_t pr_lwpid; /* specific lwp identifier */
short pr_why; /* reason for lwp stop, if stopped */
short pr_what; /* more detailed reason */
short pr_cursig; /* current signal, if any */
short pr_pad1;
siginfo_t pr_info; /* info associated with signal or fault */
sigset_t pr_lwppend; /* set of signals/ pending to the lwp */
sigset_t pr_lwphold; /* set of signals blocked by the lwp */
struct sigaction pr_action; /* signal action for current signal */
stack_t pr_altstack; /* alternate signal stack info */
uintptr_t pr_oldcontext; /* address of previous ucontext */
short pr_syscall; /* system call number (if in syscall) */
short pr_nsysarg; /* number of arguments to this syscall */
int pr_errno; /* errno for failed syscall, 0 if successful */
long pr_sysarg[PRSYSARGS]; /* arguments to this syscall */
long pr_rval1; /* primary syscall return value */
long pr_rval2; /* second syscall return value, if any */
char pr_clname[PRCLSZ]; /* scheduling class name */
timestruc_t pr_tstamp; /* real-time time stamp of stop */
timestruc_t pr_utime; /* lwp user cpu time */
timestruc_t pr_stime; /* lwp system cpu time */
int pr_filler[12 - 2 * sizeof (timestruc_t) / sizeof (int)];
uintptr_t pr_ustack; /* address of stack boundary data (stack_t) */
ulong_t pr_instr; /* current instruction */
prgregset_t pr_reg; /* general registers */
prfpregset_t pr_fpreg; /* floating-point registers */
} lwpstatus_t;
;proc;X pid S;l<p;X l<pid S;l<pusage
Al igual que la informacin de uso del proceso, cada LWP dispone
de una fichero del que podemos obtener informacin sobre el uso de
CPU, tiempo de fallo de pgina, seales recibidas. Para leer el
fichero necesitamos utilizar un elemento de tipo struct prusage, la
#33
Comunidad OpenSolaris Hispano
definicin de este tipo la podemos encontrar en el fichero
s(s;procfs,h
;proc;X pid S;lpsinfo
El fichero est formado por una cabecera, la cual tiene un
estructura de tipo struct prheader, dicha cabecera est formada por 2
campos, uno con el nmero de elementos y otro con el tamao de cada
elemento. A la cabecera le sigue el cuerpo que est formado por un
arrays de elementos, uno por cada LWP del proceso, estos elementos son
del tipo struct l<psinfo.
;proc;X pid S;lstatus
Al igual que en el caso anterior, este fichero contiene
informacin de estado de todos los LWP que tiene el proceso, para ello
se utiliza una cabecera de tipo struct prheader, dicha cabecera est
formada por 2 campos, uno con el nmero de elementos y otro con el
tamao de cada elemento. A la cabecera le sigue el cuerpo que est
formado por un arrays de elementos, uno por cada LWP del proceso,
estos elementos son del tipo struct l<pstatus.
;proc;X pid S;lusage
El fichero est formado por una cabecera, la cual tiene un
estructura de tipo struct prheader, dicha cabecera est formada por 2
campos, uno con el nmero de elementos y otro con el tamao de cada
elemento. A la cabecera le sigue el cuerpo que est formado por un
arrays de elementos, uno por cada LWP del proceso, estos elementos son
del tipo struct prusage.
La definicin de la estructura de datos prheader, la podemos encontrar
en el fichero s(s;procfs,h
typedef struct prheader {
long pr_nent; /* number of entries */
long pr_entsize; /* size of each entry, in bytes */
} prheader_t;
:spacio de direcciones de un proceso
El espacio de direcciones de un proceso lo podemos definir como
la cantidad de memoria a la que el proceso puede acceder. Un espacio
de direcciones est formando por, al menos, 4 segmentos, el segmento
de texto, el segmento de datos, el heap y el stack.
En el sistema de archivos ;proc el SO mantiene un fichero el cual
es una representacin del mapa de direcciones ;proc;X '%D S;map.
Empezaremos con un sencillo programa que nos permitir
representar el mapa de direcciones del espacio de direcciones de un
proceso, el mismo resultado que podemos obtener con el comando pmap,
salvando las distancias, claro est, lo que vamos a hacer es leer el
contenido del fichero ;proc;X '%D S;map el cual est formando por un
array de elementos de tipo struct prmap, este tipo de datos est
definido en el fichero s(s;procfs,h, la estructura prmap la forman,
entre otros, los siguientes campos:
pr_vaddr Direccin de memoria del segmento
pr_size Tamao en bytes del segmento
pr_mapna Nombre del fichero que est mapeado
#34
Comunidad OpenSolaris Hispano
me en el segmento.
pr_mflag
s
Atributos del segmento.
pr_pages
ize
Tamao de pgina del segmento.
El siguiente programa acepta como nico parmetro el PID de un
proceso, para abrir el fichero ;proc;X '%D S;map, como sabemos el
fichero est formando por un array de elementos de tipo struct prmap.
Programa procIl<pImap,c
1 #include < stdio.h >
2 #include < sys/types.h >
3 #include < sys/stat.h >
4 #include < fcntl.h >
5
6 #define _STRUCTURED_PROC 1
7
8 #include < sys/procfs.h >
9
10 main(int argc, char **argv)
11 {
12
13 int fd;
14 char cadena[80];
15 int pid;
16 struct prmap pmap;
17
18 if (argc<2)
19 {printf("Error: Falta el < pid >nn Uso: %s < pid
>nn",argv[0]);return;}
20
21 pid=atoi(argv[1]);
22
23 sprintf(cadena,"/proc/%d/map",pid);
24 fd=open(cadena,O_RDWR);
25
26 if (fd<0)
27 {printf("n Error: No se ha podido abrir el fichero
%sn",cadena);return(1);}
28
29 printf("nAddrttSizetPSizetFlagstObject");
30 printf("n-------------------------------------------------------n");
31
32 while((read(fd,&pmap,sizeof(struct prmap)))>0)
33 {
34 printf("n0x%.8lx",pmap.pr_vaddr);
35 printf("t%dK",pmap.pr_size/1024);
36 printf("t%dt",pmap.pr_pagesize);
37
38 if(pmap.pr_mflags & MA_READ)
39 {printf("r");}
40 else
41 {printf("-");}
42
43 if(pmap.pr_mflags & MA_WRITE)
44 {printf("w");}
45 else
46 {printf("-");}
47
48 if(pmap.pr_mflags & MA_EXEC)
49 {printf("x");}
#35
Comunidad OpenSolaris Hispano
50 else
51 {printf("-");}
52
53 if(pmap.pr_mflags & MA_SHARED)
54 {printf("s");}
55 else
56 {printf("-");}
57
58 if(pmap.pr_mflags & MA_ANON)
59 {printf("A");}
60 else
61 {printf("-");}
62
63 printf("t%s",pmap.pr_mapname);
64 }
65
66 close(fd);
67 printf("n");
68 }
Una vez que compilemos el programa, la salida de su ejecucin ser algo parecido a
esto:
(root@huelva)# ./proc_lwp_map 520
Addr Size PSize Flags Object
-------------------------------------------------------
0x00010000 888K 8192 r-x-- a.out
0x000fe000 72K 8192 rwx-- a.out
0x00110000 224K 8192 rwx-A
0xfef60000 16K 8192 r-x-- ufs.273.0.73701
0xfef72000 16K 8192 rwx-- ufs.273.0.73701
0xfef80000 688K 8192 r-x-- ufs.273.0.2794
0xff03c000 32K 8192 rwx-- ufs.273.0.2794
0xff060000 40K 8192 r-x-- ufs.273.0.2791
0xff07a000 8K 8192 rwx-- ufs.273.0.2791
0xff080000 888K 8192 r-x-- ufs.273.0.2826
0xff16e000 40K 8192 rwx-- ufs.273.0.2826
0xff178000 24K 8192 rwx-A
0xff190000 8K 8192 rwx-A
0xff1a0000 8K 8192 r-x-- ufs.273.0.2808
0xff1b2000 8K 8192 rwx-- ufs.273.0.2808
0xff1c0000 8K 8192 r-x-- ufs.273.0.2833
0xff1d2000 8K 8192 rwx-- ufs.273.0.2833
0xff1e0000 24K 8192 r-x-- ufs.273.0.2852
0xff1f6000 8K 8192 rwx-- ufs.273.0.2852
0xff200000 568K 8192 r-x-- ufs.273.0.2839
0xff29e000 40K 8192 rwx-- ufs.273.0.2839
0xff2a8000 24K 8192 rwx-A
0xff2c0000 16K 8192 r-x-- ufs.273.0.2836
0xff2d4000 8K 8192 rwx-- ufs.273.0.2836
0xff2e0000 128K 8192 r-x-- ufs.273.0.2859
0xff300000 16K 8192 rwx-- ufs.273.0.2859
0xff310000 8K 8192 rwx-A
0xff320000 40K 8192 r-x-- ufs.273.0.2860
0xff33a000 8K 8192 rwx-- ufs.273.0.2860
0xff340000 248K 8192 r-x-- ufs.273.0.2850
0xff38e000 16K 8192 rwx-- ufs.273.0.2850
0xff3a0000 8K 8192 r-x-- ufs.273.0.3238
0xff3b0000 184K 8192 r-x-- ufs.273.0.1448
0xff3ee000 8K 8192 rwx-- ufs.273.0.1448
0xff3f0000 8K 8192 rwx-A
0xff3fa000 8K 8192 rwx-- ufs.273.0.2807
0xffbee000 72K 8192 rw--A
#36
Comunidad OpenSolaris Hispano
(root@huelva)#
La salida est compuesta por una serie de lneas, una por cada
segmento que formen el espacio de direcciones del proceso, la primera
es la direccin de memoria en la que podemos localizar el segmento, la
ltima columna presenta el nombre del fichero que se ha mapeado en el
segmento, el tamao de un segmento no tiene por qu coincidir con el
tamao del fichero que se mapea, ya que puede que el segmento se mapee
un trozo del fichero. El nombre el nombre del objeto est formado con
el inodo del fichero que se est utilizando, podemos buscar el fichero
cuyo inodo es 2794.
(root@huelva)# ls -li | grep 2794
2794 -rwxr-xr-x 1 root bin 867400 Dec 23 2004 libc.so.1
(root@huelva)#
El fichero cuyo inodo estamos buscando es una de las libreras
que se han linkado en el ejecutable. Como podemos ver la salida es
bastante parecida a la que obtendramos con el programa pmap.
Uno de los ficheros ms interesante que podemos encontrar en el
FS /proc, es sin duda ;proc;X '%D S;as, el cual contiene una imagen
del espacio de direcciones de memoria del proceso. Para leer el
contenido de este fichero no necesitamos ningn tipo de estructura de
datos, ni est formado por arrays, sencillamente son datos, a los que
se puede acceder mediante la direccin que ocupan en la memoria.
Si conocemos en qu posicin de memoria se encuentra un dato, por
ejemplo un entero, podemos abrir el fichero ;proc;X '%D S;as, mediante
la llamada open01 y desplazar el puntero hasta dicha posicin y leer
el dato. Esto nos permite muchas posibilidades, como son el poder ver
el contenido de la pila de un p
Comprobando los permisos que tiene el fichero vamos a llevarnos
una grata sorpresa y es que tiene permisos de escritura para el
propietario, esto nos va a permitir poder escribir directamente en
este fichero, lo que significa que podremos modificar zonas de memoria
de un proceso, :STO '8:D: S:R 9&ST&.T: ':L%GROSO '&R& .8:STRO S%ST:/&,
como root podemos modificar el contenido de cualquier espacio de
direcciones, incluido el del kernel, pero esto lo veremos en otro
momento.
Para conocer las posibilidades que nos ofrece el acceso en
lectura;escritura al espacio de direcciones de cualquier proceso,
vamos a realizar un sencillo ejercicio, en el que desarrollaremos 2
pequeos programas en C:
ejemploF,c
Consiste en un programa que dispone de un contador, el cual se ir
incrementando cada 5 segundos.
1 #include < stdio.h >
2
3 void main()
4 {
5 int *cont;
6
7 cont=malloc(sizeof(int));
8 *cont=0;
9 printf("n Dir. Memoria de la varable cont: 0x%lx %lun",cont,cont);
#3
Comunidad OpenSolaris Hispano
10 for(;;)
11 {
12 printf("n Contador: %d",*cont);
13 sleep(5);
14 *cont=*cont+1;
15 }
16
17 return;
18 }
Una vez compilado, al ejecutar el programa, la salida ser parecida a
la siguiente:
(root@huelva)# ./ejemplo1
Dir. Memoria de la varable cont: 0x209d8 133592
Contador: 0
Contador: 1
Contador: 2
Contador: 3
Contador: 4
Contador: 5
Contador: 6
Contador: 7
Contador: 8^C
(root@huelva)#
Presenta la direccin de memoria de la variable cont, la cual
como podemos ver en la lnea 5 de ejemploF,c es de tipo puntero a un
entero. Cada 5 segundos se incrementar el contenido de la direccin
donde apunta Ycont. Podemos dejar corriendo ejemploF.
procIasI<r,c
Este programa aceptar como parmetros el '%D de un proceso y una
direccin de memoria, el PID lo utilizar para abrir el fichero del
espacio de direcciones del proceso y la direccin de memoria, para, en
primer lugar leer su contenido y posteriormente incremetar dicho
contenido en 100.
1 #include < stdio.h >
2 #include < sys/types.h >
3 #include < sys/stat.h >
4 #include < fcntl.h >
5
6 #define _STRUCTURED_PROC 1
7 #include < sys/procfs.h >
8
9 main(int argc, char **argv)
10 {
11
12 long puntero,addr;
13 int i_cont;
14 int fd;
15 char cadena[80];
16 int pid;
17
18 if (argc<2)
19 {printf("nn Uso: %s < pid > < addr >nn",argv[0]);return;}
20
21 pid=atoi(argv[1]);
22 addr=atol(argv[2]);
#3!
Comunidad OpenSolaris Hispano
23
24 printf("n PID:%d Direccion de memoria: 0x%lx (%ld)n",pid,addr,addr);
25
26 sprintf(cadena,"/proc/%d/as",pid);
27 fd=open(cadena,O_RDWR);
28
29 if (fd<0)
30 {printf("n Error: Abriendo el fichero %sn",cadena);return;}
31 printf("n Abriendo el fichero %sn",cadena);
32
33 if (lseek(fd,addr,SEEK_SET)<0)
34 {printf("nError: Leyendo el fichero %sn",cadena);return;}
35
36 if(read(fd,&i_cont,sizeof(i_cont))<0)
37 {printf("nError: Escribiendo el fichero %sn",cadena);return;}
38
39 printf("n La direccion de memoria 0x%lx (%ld) = %dn",addr,addr,i_cont);
40
41 i_cont=i_cont+100;
42
43 if (lseek(fd,addr,SEEK_SET)<0)
44 {printf("nError: Leyendo el fichero %sn",cadena);return;}
45
46 if (write(fd,&i_cont,sizeof(i_cont))<0)
47 {printf("nError: Escribiendo el fichero %sn",cadena);return;}
48
49 printf("n Se ha escrito corretamente en la posicion 0x%lx
(%ld)nn",addr,addr);
50
51 close(fd);
52 }
Una vez que compilemos el programa podemos realizar la prueba de
nuestro ejemplo, para ello ejecutaremos ejemploF en un terminal y lo
dejaremos ejecutandose, tenemos que recordar la direccin de memoria
del contador.
(root@huelva)# ./ejemplo1
Dir. Memoria de la varable cont: 0x209d8 133592
Contador: 0
Contador: 1
Contador: 2
Contador: 3
...
Como vemos en la salida de ejemploF la direccin de memoria en
hexadecimal *Z)*Md+ y en decimal FKK-M), abrimos otro terminal y
ejecutamos el programa procIasI<r con los siguientes parmetros, pero
antes debemos saber cual es el PID con el que se est ejecutando
ejemploF.
(root@huelva)# ps -ef | grep ejemplo
root 17783 25395 0 23:12:27 pts/1 0:00 grep ejemplo
root 17397 25512 0 23:08:10 pts/3 0:00 ./ejemplo1
(root@huelva)#
(root@huelva)#
(root@huelva)# ./proc_as_wr 17397 133592
PID:17397 Direccion de memoria: 0x209d8 (133592)
#3"
Comunidad OpenSolaris Hispano
Abriendo el fichero /proc/17397/as
La direccion de memoria 0x209d8 (133592) = 64
Se ha escrito corretamente en la posicion 0x209d8 (133592)
(root@huelva)#
Si comprobamos el terminal donde se est ejecutando ejemploF
comprobaremos que el contador se ha incrementado en 100.
Este es un sencillo ejemplo de como podemos hacer uso del fichero
;proc;X '%D S;as y sobre todo de lo sencillo que es modificar algo del
espacio de direcciones de un proceso.
Hasta ahora hemos visto, la estructura bsica del sistema de
archivos ;proc, la estructura de algunos de los fichero que lo forman
y como podemos acceder al espacio de direcciones de un proceso
simplemente utilizando las llamadas open01 y read01, hasta hemos visto
como cambiar el valor de una variable de un proceso. Este artculo
naci de la charla que tuvimos algunos compaeros con los que trabajo,
sobre la razn de que una de las aplicaciones con las que trabajamos
estaba continuamente realizando llamadas poll01 y necesitabamos
conocer cuales son los descriptores de ficheros que estn utilizando
las distintas llamadas a poll01.
Comando truss
El primer paso consiste en realizar un pequeo estudio sobre el
nmero de llamadas al sistema, su frecuencia y el tipo, para esta
tarea podemos utiliza el comando truss, con la opcin Dc obtendremos
las estadsticas de las llamadas a sistema.
Este puede ser un ejemplo de la salida del comando truss.
(root@huelva)# truss -c -p 25089
^C
syscall seconds calls errors
read .000 36 12
write .000 12
close .000 1
fcntl .000 1
poll .010 1419
lwp_self .000 8
lwp_mutex_wakeup .000 31
lwp_mutex_lock .000 18
lwp_cond_wait .002 95 61
lwp_cond_signal .000 4
lwp_cond_broadcast .000 30
lwp_schedctl .000 8
accept .000 1
send .001 17
getsockname .000 4
setsockopt .000 1
-------- ------ ----
sys totals: .015 1686 73
usr time: .114
elapsed: 2.480
#4$
Comunidad OpenSolaris Hispano
(root@huelva)#
Con los resultados anteriores no podemos considerar que tengamos
un ejemplo, unicamente es un ejemplo para destacar que el nmero de
llamadas poll01 es bastante superior al del resto de llamadas. Ahora
tenemos que averiguar si existen varias llamadas poll() distintas, en
distintos procesos o si solo existe un poll, responsable de todas las
llamadas, ejecutaremos el comando truss para que unicamente nos ensee
las llamadas poll().
(root@huelva)# truss -t poll -f -p 25089
25089/10: poll(0x310FFD58, 3, 50) = 0
25089/46: poll(0x00273E50, 3, -1) = 1
25089/46: poll(0x00273E50, 4, -1) = 1
25089/46: poll(0x27DFEE10, 1, 30000) = 1
25089/10: poll(0x310FFD58, 3, 50) = 0
25089/46: poll(0x00273E50, 3, -1) = 1
25089/46: poll(0x00273E50, 4, -1) = 1
25089/46: poll(0x27DFEE10, 1, 5000) = 1
...
En la salida del ejemplo podemos observar que la llamada poll()
acepta como parmetros, el puntero a un array de elementos de tipo
struct pollfd, el nmero de elementos del array y un timeout. Como
conocemos la direccin del array de elementos podemos utilizar el
fichero ;proc;X '%D S;as, que recordemos es el espacio de direcciones
del proceso, para leer el contenido del array, para ello utilizaremos
el siguiente programa en C.
proc_as_rd.c
/*
* Este programa lee una dir de memoria y la interpreta
* como dato de tipo "pollfd_t" el cual es una estructura
* que contiene un descriptor de fichero y dos mascaras de
* eventos.
*
* La llamada poll() utiliza un array de elementos de tipo "pollfd_t".
*
* Uso: proc_as_rd < pid > 0x< addr_hex > < iter >
*
* < pid > PID del proceso.
* 0x< addr_hex > es la dir de memoria en hexadecimal.
* < iter > es el numero de elementos del array
*
* IMPORTANTE: Este programa debe compilarse con la opcion de soporte para
* 64bits, en gcc es "-m64"
*/
#include < stdio.h >
#include < sys/types.h >
#include < sys/stat.h >
#include < fcntl.h >
#include < poll.h >
main(int argc, char **argv)
{
int fd;
char s_dir[16];
char cadena[80];
char HEX[]="0123456789ABCDEF";
#4#
Comunidad OpenSolaris Hispano
int pid;
int n,i;
long long addr;
char c;
int nelem;
pollfd_t dato;
if (argc<3)
{printf("nn Uso: %s
0x nn,argv[0]);return;}
pid=atoi(argv[1]);
nelem=atoi(argv[3]);
/*
* Se lee la dir de memoria en formato HEX
* y se convierte en una dir de tipo long long
*/
if(argv[2][1]=='x')
argv[2][1]='0';
else
{printf(nn Uso: %s
0x );
printf(nnLa direccion de memoria tiene que estar en formato hex
0xnn,argv[0]);return;}
sprintf(s_dir,%016s,argv[2]);
addr=0;
for(n=0;n< sizeof(s_dir);n++)
{
i=0;
while((HEX[i]!=toupper(s_dir[n]))&&(i<16))
{i++;}
if (i>15)
{printf(nError: La direccion contiene caracteres no
validosnn);return;}
addr|=i;
addr=addr<<4;
}
addr=addr>>4;
/*
* La variable addr contiene la dir de memoria
* convertida de HEX -> long long
*/
printf(n PID: %d n Dir. de memoria: 0x%llx n,pid,addr);
sprintf(cadena,/proc/%d/as,pid);
fd=open(cadena,O_RDONLY);
if (fd<0)
{printf(n Error: Abriendo el fichero %sn,cadena);return;}
printf(n Abriendo el fichero %sn,cadena);
for(n=0;n< nelem;n++)
{
#42
Comunidad OpenSolaris Hispano
if (lseek(fd,addr,SEEK_SET)<0)
{printf(nError: Moviendo el puntero %sn,cadena);return;}
if(read(fd,&dato,sizeof(dato))<0)
{printf(nError: Escribiendo el fichero %sn,cadena);return;}
printf(n Dir. de memoria 0x%lx (%ld) n,addr,addr);
printf(n typedef struct pollfd {);
printf(n int fd = %d,dato.fd);
printf(n short events = %d,dato.events);
printf(n short revents = %d,dato.revents);
printf(n} pollfd_t;);
printf(n-n);
addr=addr+(sizeof(pollfd_t));
}
close(fd);
}
El programa abre el fichero ;proc;X '%D S;as, desplaza el puntero
a la direccin *2addrIhe2 y leen tantas estructuras de tipo pollfdIt
como le digamos con el parmetro X iterS. La salida ser parecida a la
siguiente, utilizaremos la informacin de las llamadas poll01 que
recuperamos con el comando truss, ejecutaremos procIasIrd con el
proceso )-*+M y la direccin de memoria *Z)UD#::F*
(root@huelva)# ./proc_as_rd 25089 0x27DFEE10 1
PID: 25089
Dir. de memoria: 0x27dfee10
Abriendo el fichero /proc/25089/as
Dir. de memoria 0x27dfee10 (668986896)
typedef struct pollfd {
int fd = 77
short events = 39
short revents = 24568
} pollfd_t;
----------------------
(root@huelva)#
La salida devuelve la informacin representada como una
estructura struct pollfd, cuya definicin podemos encontrar en el
fichero de cabecera ;usr;include;s(s;poll,h, para nuestro ejemplo, la
llamada poll() utiliza un array, el cual tiene solo un elemento, de
elementos de tipo pollfd_t, cuyo campo fd almacena el descriptor de
fichero 77. Podemos ver a qu fichero corresponde el descriptor de
fichero 77 en el proceso )-*+M mediante el comando pfiles
(root@huelva)# pfiles 25089
25089:
Current rlimit: 1024 file descriptors
0: S_IFIFO mode:0000 dev:301,0 ino:125986510 uid:10001 gid:10000 size:0
O_RDWR
1: S_IFREG mode:0644 dev:261,44006 ino:296 uid:10001 gid:10000 size:1340974
O_RDWR|O_APPEND
2: S_IFREG mode:0644 dev:261,44006 ino:297 uid:10001 gid:10000 size:2965
O_RDWR|O_APPEND
...
#43
Comunidad OpenSolaris Hispano
77: S_IFSOCK mode:0666 dev:300,0 ino:12816 uid:0 gid:0 size:0
O_RDWR
sockname: AF_INET 192.168.0.72 port: 64095
peername: AF_INET 192.168.0.126 port: 5588
En este caso, el descriptor de fichero corresponde con un socket,
que la aplicacin est utilizando, esta informacin nos puede ayudar
para identificar cual es la causa para que la aplicacin est
realizando un uso excesivo de llamadas poll().
Este artculo pretende ensear lo sencillo que es trabajar con el
fichero del espacio de direcciones del proceso y como nos puede ayudar
a identificar problemas, ya que nos permite consultar la informacin
del proceso que nos interese.
Rendimiento;Tuning Solaris! %ntroduccin
Este es el primero de una serie de artculos sobre la forma de
medir el rendimiento de nuestro sistema Solaris. Existe mucha
documentacin relacionada con este tema, esta serie de artculo solo
pretende ser una sencilla gua que nos permita por un lado, conocer
las herramientas de las que disponemos en Solaris y por otro lado,
conocer cmo podemos utilizar estas herramientas para que nos ayuden a
diagnosticar problemas de rendimiento.
El objetivo de esta serie de artculo, como se ha comentado
antes, es que sirvan como gua para comenzar el estudio de un posible
problema en el rendimiento del sistema, se ha organizado el contenido
en 3 bloques:
- 'rocesos ( procesadores
- :ntrada;Salida
- /emoria
No solo se tratarn los distintos comandos para medir el
rendimiento, sino que se explicaran algunos de los parmetros que
podremos cambiar en nuestro sistema para mejorar el rendimiento, ya
sea de memoria, procesador, entrada/salida, etc. De todas formas es
importante conocer como pueden afectar los cambios propuestos en cada
uno de nuestros sistemas y el objetivo no es dar una serie de axiomas
o parmetro, los cuales deben aplicarse ciegamente, sino el que, como
administradores, conozcamos
las posibilidades que tenemos para evitar problemas en el rendimiento.
#44
Comunidad OpenSolaris Hispano
Rendimiento;Tuning
'rocesos ( procesadores
Ahora veremos algunas de las herramientas que nos permitan
identificar posibles cuellos de botella, tanto en los procesos que se
estn ejecutando en el sistema como en las operaciones que estn
realizando los procesadores. Para ellos vamos a comenzar haciendo una
aclaracin sobre lo que parece, para mucha gente, un axioma
indiscutible sobre el rendimiento de un sistema..ucho uso de @1: estU
directamente relacionado con un problema de rendimiento
Aunque muchas veces esto puede ser cierto, existen casos en los
que no se cumple y otros casos en los que una solucin al problema,
como sera aumentar el nmero de CPUs del sistema, no conseguira
aumentar el rendimiento. Por lo tanto no debemos alarmarnos frente a
un aumento del uso de CPU, tendremos que analizar la causa para
intentar dar una solucin. Podemos decir, y lo comprobaremos mas
adelante, que 4&rente a un uso alto de +.,5 !omprar m$s pro!esadores
no garanti%a 6ue se solu!ione el problema.7 es importante que tengamos
claro este principio, ya que normalmente, cuando existe un problema de
rendimiento, se suele optar por la solucin rpida, comprar HW y
podemos llevarnos una desagradable sorpresa, cuando descubrimos que el
haber gastado una suma importante de dinero para conseguir nicamente,
el el porcentaje de uso de CPU se ha reducido, pero el rendimiento del
sistema es igual de malo.
El rendimiento de un procesos no se puede medir simplemente con
el porcentaje de uso de CPU, existen una serie de parmetros que nos
#45
Comunidad OpenSolaris Hispano
ayudarn a conocer no solo qu est haciendo el proceso, sino la causa
de un posible problema de degradacin en nuestro sistema.
.OT& D No podemos basar nuestro anlisis del problema de rendimiento,
nicamente en el uso de CPU.
Como hemos comentado, existen otros factores que puede generar un
cuello de botella y no tiene por qu ser el uso de CPU, en sistemas
multitareas y multithreads como es Solaris, el que un proceso
decremente su rendimiento se debe principalmente a dos posibles
causas:
-:2terna, la lentitud en el proceso se produce por un elemento externo
al proceso, como puede ser el acceso a la memoria, lentitud en los
dispositivos de E/S, psima asignacin de tiempo de CPU, etc.
-%nterna, en los procesos con mltiples threads, normalmente existen
una serie de sincronizaciones entre los distintos threads, estas
sincronizaciones, pueden provocar bloqueos entre varios de los
threads, produciendo una prdida del rendimiento del proceso.
Tendremos que analizar si la causa de que el rendimiento del proceso
no es el esperado est en el propio proceso, que a su vez est
afectando al rendimiento del resto de procesos del sistema o por el
contrario, la razn de la prdida de rendimiento se debe un causa
externa al proceso.
Nuestro anlisis debe comenzar desde un punto de vista global, hasta
desembocar en un foco concreto, no es buena idea centrarnos, a priori,
en un elemento particular, ya que esto, nos podra evitar ver la causa
del problema en otro elemento que no est relacionado con el que
nosotros pensamos que es la causa de todo el problema.
:stado del sistema
El primer paso para el diagnstico de un problema en el sistema, es
ver de forma global el estado en el que se encuentra. Tenemos que
conocer qu se est ejecutando en el sistema, para ello, utilizaremos
el comando prstat.
# prstat
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
23288 app01 1592M 1255M sleep 29 10 7:13:46 34.8% java/129
9302 app01 1322M 911M sleep 29 10 7:49:56 3.7% java/76
23647 app01 8920K 8504K sleep 49 0 0:00:00 0.6% perl/1
23681 app01 56M 12M cpu0 0 10 0:00:00 0.4% java/8
23672 app01 5552K 5000K sleep 0 0 0:00:00 0.3% perl/1
1425 root 13M 5704K sleep 59 0 46:41:35 0.2% scopeux/1
13 root 12M 9128K sleep 59 0 17:09:01 0.1% vxconfigd/1
18985 app01 734M 562M sleep 29 10 0:10:15 0.1% java/100
22690 jjmora 2456K 2168K cpu3 59 0 0:00:00 0.1% prstat/1
26948 root 57M 11M sleep 59 0 0:26:15 0.1% java/9
442 root 4720K 4024K sleep 59 0 14:57:55 0.0% picld/6
1465 root 2648K 2216K sleep 59 0 3:42:50 0.0% vold/2
23287 app01 1639M 1180M sleep 29 10 2:42:39 0.0% java/131
29782 root 5248K 3448K sleep 59 0 0:46:40 0.0% NICAgent/13
1 root 1320K 768K sleep 59 0 2:02:59 0.0% init/1
23648 app01 1008K 776K sleep 59 0 0:00:00 0.0% grep/1
29784 root 5192K 3240K sleep 59 0 0:16:13 0.0% Notifier/13
12556 app01 63M 57M sleep 59 0 0:01:20 0.0% adr3/57
19640 app01 119M 62M sleep 29 10 0:00:16 0.0% java/20
3363 app01 98M 39M sleep 29 10 0:00:18 0.0% java/20
Total: 167 processes, 1854 lwps, load averages: 4.61, 4.30, 3.71
#46
Comunidad OpenSolaris Hispano
Como podemos comprobar, el comando prstat nos permite disponer de
una primera visin de qu se est ejecutando en nuestros sistema. En
el ejemplo, lo primero que nos llama la atencin es el proceso con PID
23288, es un proceso java con 129 threads, a priori y sin ningn
diagnstico previo, podemos pensar que la causa del problema es este
proceso, pero no podemos parar aqu nuestro anlisis, ya que puede que
la causa de lentitud del sistema no se deba solo a este proceso y sea
un elemento ajeno a l la razn de la lentitud.
Lo que si nos debe llamar la atencin, es el crecimiento que se est
produciendo en la carga media del sistema load averages! N,6FL N,K*L
K,UF, que podemos ver que est creciendo.
mpstat
Como segundo paso vamos a ver qu est ocurriendo con los procesadores
del sistema, es decir, en qu estn empleando su tiempo, esto nos
ayudar a que nos aproximemos al diagnostico. Para ver qu estn
haciendo los procesadores de nuestro sistema utilizaremos el comando
mpstat. La salida del comando muestra una fila por cada uno de los
procesadores presentes en el sistema y una serie de columnas con
estadsticas sobre distintos elementos, cada una de las columnas
vienen explicadas en la documentacin del man, por lo tanto no vamos a
perder tiempo explicndolas y solo vamos a ver las que pueden ser ms
intersante para nosotros en estos momentos.
# mpstat 1
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 737 0 172 229 3 2429 143 500 72 0 3903 40 10 0 50
1 627 0 185 235 7 2461 152 519 95 0 4429 42 12 0 46
2 342 0 414 222 4 2872 140 608 109 0 3818 23 8 0 69
3 492 0 691 2252 2139 2258 52 447 191 1 3815 31 9 0 60
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 1046 0 556 234 2 2494 155 504 95 0 10747 44 11 0 46
1 844 0 882 225 7 2327 162 556 114 0 10418 43 15 0 43
2 619 0 842 236 3 3055 164 693 126 0 4954 32 9 0 59
3 816 0 913 2053 1933 1795 96 449 203 0 10199 54 11 0 35
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 795 0 255 361 3 3249 290 772 81 0 5503 60 6 0 34
1 868 0 556 353 11 2789 307 745 72 0 5091 54 20 0 26
2 654 0 1049 358 2 3131 320 847 95 0 5175 55 14 0 31
3 1161 0 1187 2673 2543 2319 203 646 210 0 5291 59 20 0 21
De todas las columnas vamos a centrar nuestro anlisis nicamente en
las siguientes:
minf, fallos menores de memoria, estos fallos afectan a los accesos a
memoria y se tratan de fallos de cache, por lo tanto no afectan, de
forma directa, al rendimiento del sistema. Este tipo de fallos nos
pueden servir de indicativo sobre el comportamiento de la aplicacin.
Los fallos de memoria se deben analizar dentro del contexto de uso de
memoria.
2call, refleja el nmero de !ross8!all de cada procesador. Las cross-
call son llamadas que realiza un procesador a otro, a modo de
interrupciones, para indicarle que debe realizar alguna operacin. Las
crossDcall las suelen utilizar los procesadores para informar de
cambios en las caches de la MMU. Un nmero elevado de cross-call
puede indicarnos un problema de rendimiento en las caches, de todas
#4
Comunidad OpenSolaris Hispano
formas, el que se produzacan muchas llamadas de este tipo provocar
que los procesadores consuman mucho tiempo atendiendo dichas
interrupciones y por lo tanto afecten al rendimiento.
cs< y ics<, cambio de contexto voluntario y cambio de contexto
involuntario. El nmero de cambios de contexto depender,
principalmente del nmero de procesos que se estn ejecutando en el
sistema, recordemos que un cambio de conte*to consiste en el proceso
por el cual el kernel detiene un proceso que se est ejecutando en un
procesador, elije otro proceso de la cola de ejecucin, actualiza los
registros del procesador con la informacin del nuevo proceso y el
procesador continua ejecutando el nuevo proceso en el punto donde fue
parado previamente por otro cambio de contexto.
Cuando el Kernel tiene que elegir un proceso para sacarlo de un
procesador, tiene 2 opciones, elegir uno que est esperando un dato de
E/S, por ejemplo leyendo de disco, a esto se le llama un cambio de
conte*to voluntario, es el proceso el que anuncia que no est haciendo
nada en ese instante o elegir uno de los que no estn esperando E/S,
esto se conoce como cambio de conte*to involuntario. Si el valor de
ics< se bastante superior a cs<, podemos decir, que el Kernel est
sacando de los procesadores a procesos que estn ejecutando cdigo que
no est en un estado de espera, sino que est ejecutando cdigo y que
es el propio kernel el que est ralentizando la ejecucin de esos
procesos en concreto.
Por otra parte no debemos entender esto como un problema del
Kernel, sino ms bien, un problema con el nmero de procesos que se
estn ejecutando, debera intentar reducir el factor procesos/CPU,
bien bajando el nmero de procesos, bien aumentando el nmero de CPUs.
smt2, presenta el nmero de veces que se ha intentado acceder a un
mute2 y no se ha conseguido en el primer intento. Podemos considerar
que existe un problema de contencin con los mutex, si el valor de
smt2 es superior a 300 intentos por CPU y el valor de s(s > usr, esto
significara que el Kernel est consumiendo CPU intentando acceder a
una serie de mutex sin conseguirlo.
sr<, presenta el nmero de veces que se ha intentado acceder a un lock
de tipo lectura/escritura y no se ha conseguido en el primer intento.
s(scl, nmero de llamadas ejecutadas por cada CPU.
kstat
Este comando nos permite visualizar una serie de datos estadsticos
del Kernel. Mediante kstat podemos obtener la misma informacin que
obtendremos con los comandos mpstat, vmstat, etc. Los valores que
devuelve el comando kstat son contadores, por lo tanto, tendremos que
ser nosotros los que calculemos los valores realizando una sencilla
resta. Las estadsticas del Kernel estn organizadas de la siguiente
forma mdulo!instancia!nombre!estadistica
si ejecutamos el comando kstat tal cual, la salida ser parecida a la
siguiente.
(root@huelva)# kstat
...
module: cpu_info instance: 0
name: cpu_info0 class: misc
chip_id 0
clock_MHz 1062
cpu_type sparcv9
#4!
Comunidad OpenSolaris Hispano
crtime 147.6276642
device_ID 209202519330
fpu_type sparcv9
implementation UltraSPARC-IIIi
snaptime 25738067.4963142
state on-line
state_begin 1154200415
module: cpu_info instance: 1
name: cpu_info1 class: misc
chip_id 1
clock_MHz 1062
...
De toda la informacin que podemos obtener con kstat, nos
interesa la que se almacena en el mdulo uni2!Y!s(sinfo, es algo
parecido a la siguiente salida:
(root@huelva)# kstat -p unix:*:sysinfo
unix:0:sysinfo:class misc
unix:0:sysinfo:crtime 85.4492862
unix:0:sysinfo:runocc 1600644
unix:0:sysinfo:runque 15857131
unix:0:sysinfo:snaptime 25738291.5173894
unix:0:sysinfo:swpocc 0
unix:0:sysinfo:swpque 0
unix:0:sysinfo:updates 25737884
unix:0:sysinfo:waiting 346454
#
Donde las estadisticas almacenan los siguientes datos.
Estads
tica
Descripcin
runque
Procesos en la cola
de ejecucin
swpquea Procesos en la SWAP
waiting
Procesos esperando
E/S
Estos 3 datos, tambin los podemos obtener del comando vmstat
pero esto lo veremos ms adelante. De la informacin obtenida, debemos
tener en cuenta que, el nmero de procesos en la cola de ejecucin no
debe ser alto, ya que un nmero alto de procesos en esta cola,
significa que hay procesos esperando para que se les asigne un
procesador, podemos considerar como nmero alto el que en la cola haya
ms de 5 procesos por cada CPU del sistema.
Un nmero elevado de procesos en s<ap nos avisar de un posible
problema con la memoria del sistema, ya que el Kernel ha tenido que
pasar algunos procesos al rea de swap, previsiblemente por falta de
espacio en la memoria del sistema. Y un nmero elevado de procesos en
<aiting nos indicar un problema de accesos en la E/S a algn
dispositivo.
truss
Hasta la aparicin en escena de Dtrace con OpenSolaris, el
comando truss ha sido herramienta esencial para la identificacin de
problemas en el rendimiento del sistema. Con el comando truss podremos
ver, las llamadas a sistema que est realizando un proceso en
#4"
Comunidad OpenSolaris Hispano
ejecucin, los valores de los distintos parmetros de las llamadas,
los valores devueltos, los errores devueltos por las llamadas, etc.
Cuando tenemos un problema en el rendimiento del sistema, verificar si
los procesos, que pensamos son la causa de la degradacin, estn
haciendo lo que creemos que deben estar haciendo, es una tarea
importante, ya que mucha gente (yo dira demasiada), cuando crean
software no se preocupan de gestionar los errores que o bien puede
generar la aplicacin, o bien la aplicacin se encuentra, como por
ejemplo el intentar acceder a un fichero que no existe, el enviar
datos utilizando un socket que se ha cerrado, etc. Estos errores
frecuentemente est directamente relacionadas con la caida del
rendimiento en las aplicaciones.
truss nos puede ayudar a localizar todos los errores o causas de
la prdida del rendimiento. Por ejemplo, nos puede ayudar a descubrir
posible contencin en el acceso a un fichero o los fallos generados al
intentar acceder a un mute2. Las posibilidades de truss van mucho ms
all de lo que podemos ver en este sencillo artculo, de todas formas,
para que nos sirva como ejemplo y sin entrar en excesivos detalles,
vamos a utilizar el comando truss con el el parmetro Dc, para que nos
muestre una serie de estadsticas sobre las distintas llamadas a
sistema que est ejecutando un proceso.
(root@huelva)# truss -c -p 14178
^Csyscall seconds calls errors
read .119 5252 36
write .002 41
close .000 19
fcntl .003 19
poll .016 310
lwp_mutex_wakeup .001 7034
lwp_mutex_lock .002 6128
lwp_cond_wait .002 5327 26
lwp_cond_signal .000 121
lwp_cond_broadcast .000 300
accept .006 19
send .119 2689
setsockopt .003 38
-------- ------ ----
sys totals: .278 8617 62
usr time: 1.337
elapsed: 11.940
(root@huelva)#
Para poder interpretar los datos que devuelve truss, debemos
conocer algunas de las llamadas a sistema, todas las llamadas a
sistema estn documentadas perfectamente en el man del sistema. Con la
salida obtenida del ejemplo anterior, podemos decir, que quizs exista
un problema de acceso a un mute2 por parte de algunos LWP (Lightweight
process) del proceso. Que un proceso tenga una gran cantidad de
operaciones sobre un mute2 puede significar, dependiendo de si dichas
operaciones son todas sobre un mismo mutex o sobre varios, que los LWP
del proceso estn luchando por obtener acceso al mutex y por lo tanto,
que existe un recurso compartido que est provocando una reduccin del
rendimiento de la aplicacin.
La columna de errores nos puede dar una pista de la causa de la
prdida de rendimiento, por ejemplo que se deba a un nmero excesivos
de intentos de acceso a un elemento que no existe o de una forma que
#5$
Comunidad OpenSolaris Hispano
no es la correcta, en el siguiente ejemplo, tenemos la salida del
comando truss, la cual nos muestra un posible problema con las
llamadas read.

(root@huelva)# truss -c -p 21182
^Csyscall seconds calls errors
read .214 2336 1754
time .000 26
poll .000 11
sigprocmask .000 2
waitid .000 1
fork1 .000 1
lwp_suspend .000 2
lwp_continue .000 2
nanosleep .000 10
lwp_schedctl .000 3
-------- ------ ----
sys totals: .002 64 1754
En la columna de errores de la llamada read01, de 2336 llamadas,
1754 son errores, est claro que tenemos un problema con las llamadas
de lectura de este proceso, ahora tendremos que averiguar, si los
errores afectan a todos los LWP del proceso, si el problema se
reproduce en todos los descriptores de ficheros o est localizados en
uno en concreto, etc. Dependiendo del resultado de este anlisis
podremos identificar la causa.
lockstat
En el man de este comando podemos leer que nos facilita
informacin sobre los candados (locks) en el kernel. Antes de
continuar debemos hacer una aclaracin sobre uno de los tipos de
objetos que se utilizan para la sincronizacin entre threads en
Solaris, los mute2. Un mute2 es un objeto de exclusin mutua, que solo
permite que un thread acceda al recurso controlado por dicho mutex,
por lo tanto una de las causas que pueden producir una reduccin en el
rendimiento de nuestro sistema, es que varios threads intenten hacerse
a un mismo mute2. Con lockstat podemos identificar qu est intentando
bloquear un mute2.
En Solaris encontramos dos tipos de candados, los spin locks y
los block locks. Los candados de tipo spin son aquellos en los que los
threads no dejan de intentar acceder a l, independientemente de que
el candado est bloqueado o no, este tipo de candado se implementa
cuando queremos que los threads estn continuamente ejecutndose
intentando acceder al candado y sin perder tiempo en esperar algn
timeout. Sencillamente el thread ms rpido en solicitar el candado,
justo despus de que el candado se ha liberado, ser el afortunado.
Los candados de tipo block no utilizan un mtodo tan agresivo como los
spin, sino que los threads que intentan acceder a un candado de tipo
block que est bloqueado, sencillamente se bloquean a la espera de que
el candado vuelva a ser liberado, estos candado son ms lentos con
respecto a los anteriores, ya que los procesos deben ser avisados de
que el candado se ha liberado. Los candados de tipo block se suelen
utilizar para acceder a recursos de E/S.
Por lo tanto en Solaris podemos encontrar candados de tipo spin o
mute2 spin y candados de tipo block o mute2 block, adems de estos dos
#5#
Comunidad OpenSolaris Hispano
tipos existe un tercer tipo de candado, el cual ser de tipo spin o de
tipo block, dependiendo del estado en el que est el thread que lo
tiene bloqueado, este tipo de candado se conoce con el nombre de
adaptative lock. Si el thread que tiene bloqueado el candado al que
queremos acceder est corriendo, todos los threads que estn
intentando acceder a dicho candado se comportarn como si fuese un
spin lock, si por el contrario, el thread que est utilizando el
candado, est en un estado bloqueado, por ejemplo, porque est
esperado datos de E/S, todos los threads que estn intentando acceder
al cando, se comportarn como si el candado fuese de tipo block locks.
Una vez que tenemos claro los distintos tipos de candados que nos
podemos encontrar, vamos a continuar con el comando lockstat para ver
algunas de las posibilidades que nos ofrece. Ejecutamos lockstat y le
pasamos como parmetro Db para que devuelva una salida bsica y el
comando sleep F para que no devuelva la informacin de los candados
durante la ejecucin del comando sleep. La salida devuelta ser
parecida a la siguiente:
(root@huelva)# lockstat -b sleep 1
Adaptive mutex spin: 600 events in 1.000 seconds (600 events/sec)
Count indv cuml rcnt Lock Caller
-------------------------------------------------------------------------------
95 16% 16% 1.00 0x30000306000 callout_execute+0x98
89 15% 31% 1.00 0x3000599a420 qfestart+0x294
54 9% 40% 1.00 0x3000030f000 callout_execute+0x98
51 8% 48% 1.00 0x30000306000 untimeout+0x18
45 8% 56% 1.00 0x30000309000 callout_execute+0x98
38 6% 62% 1.00 0x30000306000 timeout_common+0x4
31 5% 67% 1.00 0x30000309000 untimeout+0x18
25 4% 71% 1.00 0x3000030f000 untimeout+0x18
19 3% 75% 1.00 0x3000030c000 untimeout+0x18
...
1 0% 99% 1.00 0x30092298670 putnext+0x54
1 0% 99% 1.00 0x3008228a418 putnext+0x54
1 0% 99% 1.00 0x300002cdaf8 taskq_d_thread+0x78
1 0% 99% 1.00 0x30003561d00 trap_cleanup+0xe8
1 0% 100% 1.00 0x300002cda08 taskq_d_thread+0x78
1 0% 100% 1.00 0x300002cda08 taskq_bucket_dispatch+0x4
1 0% 100% 1.00 0x30003561d00 post_syscall+0x2f4
1 0% 100% 1.00 0x30003561d00 syslwp_continue+0x8
-------------------------------------------------------------------------------
Adaptive mutex block: 9 events in 1.000 seconds (9 events/sec)
Count indv cuml rcnt Lock Caller
-------------------------------------------------------------------------------
2 22% 22% 1.00 0x30000309000 timeout_common+0x4
2 22% 44% 1.00 0x3000030f000 untimeout+0x18
1 11% 56% 1.00 0x3008228a418 cv_wait_sig+0x1a4
1 11% 67% 1.00 0x30000309000 untimeout+0x18
1 11% 78% 1.00 0x30092298670 cv_wait_sig+0x1a4
1 11% 89% 1.00 0x30000303000 timeout_common+0x4
1 11% 100% 1.00 0x3000001fa00 kmem_cache_free+0x50
-------------------------------------------------------------------------------
Spin lock spin: 246 events in 1.000 seconds (246 events/sec)
Count indv cuml rcnt Lock Caller
-------------------------------------------------------------------------------
#52
Comunidad OpenSolaris Hispano
78 32% 32% 1.00 cpu[2]+0x90 setbackdq+0x29c
51 21% 52% 1.00 cpu[1]+0x90 setbackdq+0x29c
46 19% 71% 1.00 cpu[0]+0x90 setbackdq+0x29c
17 7% 78% 1.00 cpu[2]+0x90 disp+0x90
15 6% 84% 1.00 cpu[0]+0x90 disp+0x90
9 4% 88% 1.00 cp_default disp_getbest+0x4
8 3% 91% 1.00 cpu[1]+0x90 disp+0x90
6 2% 93% 1.00 cpu[1]+0x90 setfrontdq+0x108
6 2% 96% 1.00 cpu[0]+0x90 setfrontdq+0x108
5 2% 98% 1.00 cpu[2]+0x90 setfrontdq+0x108
2 1% 99% 1.00 sleepq_head+0x1ae8 cv_block+0x98
1 0% 99% 1.00 cpu[1]+0x90 setkpdq+0x148
1 0% 100% 1.00 cpu[3]+0x90 disp+0x90
1 0% 100% 1.00 cpu[3]+0x90 setbackdq+0x29c
-------------------------------------------------------------------------------
Thread lock spin: 5 events in 1.000 seconds (5 events/sec)
Count indv cuml rcnt Lock Caller
-------------------------------------------------------------------------------
1 20% 20% 1.00 sleepq_head+0x848 ts_update_list+0x6c
1 20% 40% 1.00 sleepq_head+0x828 setrun+0x4
1 20% 60% 1.00 cpu[1]+0xd0 preempt+0x1c
1 20% 80% 1.00 sleepq_head+0x1118 setrun+0x4
1 20% 100% 1.00 cpu[1]+0xd0 ts_tick+0x8
-------------------------------------------------------------------------------
R/W writer blocked by readers: 1 events in 1.000 seconds (1 events/sec)
Count indv cuml rcnt Lock Caller
-------------------------------------------------------------------------------
1 100% 100% 1.00 0x30011f01df8 as_map+0x40
-------------------------------------------------------------------------------
(root@huelva)#
Podemos ver en la salida anterior, que hay una seccin por cada
tipo de candado al que se intenta acceder, por lo tanto, podemos
obtener el nmero de peticiones a candados de tipo Spin lock spin, en
nuestro ejemplo, se producen 246 eventos en 1 segundo. De la salida
podemos destacar las siguiente columnas, Count con el nmero de
intentos para acceder a un candado, Lock con los nombres del los
candados
y Caller con las direcciones de los objetos que han intentado el
acceso al candado. Estas 3 columnas nos
pueden ayudar a identificar un posible problema de contencin en algn
candado y si este problema de accesoa un candado est produciendo una
degradacin del rendimiento de nuestro sistema.
Spin lock spin ( &daptive mute2 spin
Tener un nmero alto de intentos sobre candados de estos dos
tipos, puede provocar que la cantidad de tiempo asignada
al sistema SCS aumente, obligando al sistema a reducir la cantidad de
tiempo que se asigna al usuario y por lotanto, se producir una
prdida de rendimiento es todos los procesos de usuario, al recibir
menos tiempo de CPU por partedel Kernel.
#53
Comunidad OpenSolaris Hispano
&daptive mute2 block
Si en la salida del comando lockstat vemos que el nmero de este tipo
de candados es considerablemente mayor que cualquiera de los otros
tipos, quizs tengamos un problema con el acceso a un recurso, el cual
est bloqueando, tantoal thread que lo est utilizando como a todos
aquellos que estn intentando acceder a l. Como este tipo de bloqueos
no produce un aumento del uso de CPU, el problema de rendimiento no se
detectar a simple vista mediante el valor de uso de @1:, por lo que
es aconsejable, siempre que tengamos dudas del rendimiento de nuestro
sistema, aunque el uso de CPU no sea alto, que realicemos un pequeo
anlisis de los candados mediante el comando lockstat.
cpustat ( cputrack
Los procesadores SPARC disponen de una serie de contadores, lo cuales
podemos consultar para medir el rendimiento de ciertas operaciones a
nivel de los procesadores. Estos contadores nos permitirn descubrir
posibles cuellos de botellas en los procesadores, bien por el nmero
de instrucciones que se estn ejecutando, bien por el nivel de
aciertos en las distintas caches.
La informacin almacenada en los contadores, depender del tipo de
procesador que tenga nuestro sistema, por lo tanto,antes de utilizar
este comando, debemos comprobar cuales son los contadores disponibles,
para ello solo tendremos que ejecutar cpustat con el parmetro Dh.

(root@huelva)# cpustat -h
Usage:
cpustat [-c events] [-nhD] [interval [count]]
-c events specify processor events to be monitored
-n suppress titles
-t include %tick register
-D enable debug mode
-h print extended usage information
Use cputrack(1) to monitor per-process statistics.
CPU performance counter interface: UltraSPARC IIIi & IIIi+
events pic0=,pic1=[,sys][,nouser]
event0: Cycle_cnt Instr_cnt Dispatch0_IC_miss IC_ref DC_rd DC_wr
EC_ref EC_snoop_inv Dispatch0_br_target Dispatch0_2nd_br
Rstall_storeQ Rstall_IU_use EC_write_hit_RTO EC_rd_miss
PC_port0_rd SI_snoop SI_ciq_flow SI_owned SW_count_0
IU_Stat_Br_miss_taken IU_Stat_Br_count_taken
Dispatch_rs_mispred FA_pipe_completion MC_read_dispatched
MC_write_dispatched MC_read_returned_to_JBU
MC_msl_busy_stall MC_mdb_overflow_stall MC_miu_spec_request
event1: Cycle_cnt Instr_cnt Dispatch0_mispred EC_wb EC_snoop_cb
IC_miss_cancelled Re_FPU_bypass Re_DC_miss Re_EC_miss
IC_miss DC_rd_miss DC_wr_miss Rstall_FP_use EC_misses
EC_ic_miss Re_PC_miss ITLB_miss DTLB_miss WC_miss
WC_snoop_cb WC_scrubbed WC_wb_wo_read PC_soft_hit
PC_snoop_inv PC_hard_hit PC_port1_rd SW_count_1
IU_Stat_Br_miss_untaken IU_Stat_Br_count_untaken
PC_MS_misses Re_RAW_miss FM_pipe_completion
MC_open_bank_cmds MC_reads MC_writes MC_page_close_stall
#54
Comunidad OpenSolaris Hispano
Re_DC_missovhd
See the SPARC V9 JPS1 Implementation Supplement: Sun
UltraSPARC-IIIi
(root@huelva)#
La utilizacin del comando es bastante sencilla, acepta un evento
en cada contador, solo le tenemos que decir qu eventos queremos
monitorizar, el intervalo en segundos y el nmero de repeticiones.
Vamos a ejecutar el comando cpustat, cada segundo, 5 veces, para que
nos devuelva el contador C(cleIcnt, el cual almacena el nmero de
ciclos de CPU y %nstrIcnt que nos dice cuantas instrucciones se han
ejecutando, el comando devuelve una lnea por cada CPU.
(root@huelva)# cpustat -c pic0=Cycle_cnt,pic1=Instr_cnt 1 5
time cpu event pic0 pic1
1.006 1 tick 5253507 2214596
1.006 0 tick 5906614 1840943
2.006 1 tick 751843 173146
2.006 0 tick 694595 118216
3.006 1 tick 557997 194365
3.006 0 tick 1166984 271610
4.006 1 tick 5253396 2321969
4.006 0 tick 4473184 1284188
5.006 1 tick 781913 223580
5.006 0 tick 474001 70561
5.006 2 total 25314034 8713174
(root@huelva)#
Como ya hemos comentado, los contadores que se pueden monitorizar
con el comando cpustat dependen del tipo de procesador que tenga
nuestro sistema, por lo tanto, tendremos que recurrir a la
documentacin especifica de cada procesador. En nuestro ejemplo, el
procesador que est utilizando la mquina es un UltraSPARC-IIIi y
algunos de los contadores son los siguientes:
Contador Descripcin
Cycle_cn
t
Contador de cilclos
Instr_cn
t
Instrucciones
ejecutadas
IC_miss
Fallos en la cache de
instrucciones
DC_rd_mi
ss
Fallos de lectura en
la cache
DC_rw_mi
ss
Fallos de escritura en
la cache
ITLB_mis
s
Fallos de
instrucciones en la
TLB
DTLB_mis
s
Fallos de datos en la
TLB
EC_misse
s
Fallos en la cache
externa
#55
Comunidad OpenSolaris Hispano
La mayora de los contadores, los veremos ms adelante, cuando
hablemos de la memoria, ya que los ms relevantes hacen referencia a
estadsticas sobre elementos como las caches.
El comando cputrack tiene la misma finalidad que cpustat, pero
con la diferencia que podemos analizar los distintos eventos referidos
nicamente a un proceso, ya sea en ejecucin o que lo lancemos con el
propio comando cputrack.

(root@huelva)# cputrack -T 1 -N 10 -c pic0=Cycle_cnt,pic1=Instr_cnt sleep 5
time lwp event pic0 pic1
1.012 1 tick 908377 302623
2.012 1 tick 0 0
3.012 1 tick 0 0
4.012 1 tick 0 0
5.002 1 exit 991739 314472
(root@huelva)#
En el ejemplo anterior, hemos visto el contador de cliclo y el de
instrucciones mientras se ejecuta el comando sleep -, le hemos pasado
los prametro DT, para decirle el intervalo en segundos y D. para el
nmero de repeticiones, como el comando sleep - solo dura 5 segundos,
cputrack solo saca 5 lneas. Este comando nos puede ayudar a conocer
cuantas instrucciones ejecuta un proceso, en caso de un problema con
el acceso a las caches, podemos comprobar si es un proceso determinado
el que provoca la gran mayora de los fallos de cache, etc.
Tanto cpustat como cputrack son herramientas bastante tiles a la
hora de intentar encontrar la causa de una reduccin del rendimiento
en nuestro sistema.
.ota D Si tiene alguna pregunta o sugerencia sobre este art$culo+
por !avor+ no dude en ponerse en contacto conmigo mediante email en
jjmora 2/ arra9is D(/ es
#56
Comunidad OpenSolaris Hispano
%ntroduccin a DTrace
Hace tiempo que estoy detrs de intentar escribir una pequea
entrada en el blog sobre DTrace, pienso que ha sido una de las
herramientas ms interesante que han aparecido para el estudio del
rendimiento de los sistemas y no solo para eso, tambien puede ayudar a
todos aquellos que deseen profundizar en la compresin de cmo
funciona el Wernel de Solaris. Creo que cualquier persona que bien
vaya a desarrollar, bien administre sistemas Solaris, debera conocer
DTrace, sino en profundidad, al menos conocer las posibilidades que
nos ofrece. En este artculo veremos una breve introduccin a DTrace,
de todas formas es imprescindible, para todos aquellos que deseen
profundizar ms, la lectura de Solaris Dynamic Tracing Guide.
?@uA es DTraceB
Es una herramienta de instrumentacin desarrollada por Sun en el
2005 y disponible en Solaris 10. No consiste en una simple herramienta
de consulta de estadsticas, al estilo kstat, donde todos los datos
son generados y posteriormente recogidos. DTrace explota el concepto
de %nstumentacin, tal y como se conoce en el mundo de la Ingeniera.
Instrumenta!i:n industrial: es el grupo de elementos )ue sirven
para medir+ convertir+ transmitir+ controlar o registrar variables de
un proceso con el !in de optimi"ar los recursos utili"ados en Xste
Bhttp:%%eswi0ipediaorgC
B
DTrace est formado por una serie de elementos, el uso de los
cuales nos permiten medir, controlar, registrar, etc. variables del
sistema. Cuando utilicemos DTrace debes pensar (la misma nomenclatura
de DTrace nos lleva a ello) que estamos poniendo sondas en el sistema
que estn recogiendo datos para nosotros.
Est orientada tanto para desarrolladores, a los cuales puede
ayudar en las distintas fases de desarrollo, midiendo variables del
sistema, de la misma forma que ocurrira en un sistema en produccin.
Tambin es una herramienta fundamental para los administradores,
DTrace va mucho ms all del imprescindible truss, ahora un
administrador con unos conocimientos bsicos de DTrace puede, por
ejemplo, conocer cuanto tiempo tardan las escrituras en disco de un
proceso determinado o la veces que se llama a una s(scall determinada.
#5
Comunidad OpenSolaris Hispano
Lo mejor de DTrace es que podemos realizar todas estas tareas en
sistemas en produccin, sin coste alguno para el rendimiento del
sistemas, ya que es una herramienta no intrusiva.
&r4uitectura de DTrace
En la figura anterior podemos ver un esquema de la arquitectura de
DTrace, bsicamente est formada por:
Consumers, son todos aquellos elementos que de una forma u otra
utilizan DTrace, en este punto debemos aclarar que DTrace es el
sistema de instrumentacin y que existe un comando
<b>dtrace(1M)</b> que es uno de los <b>consumers</b> de DTrace,
pero no el nico.
'roviders, son todos aquellos elementos que pueden generar
informacin sobre el sistema, normalmente consiste en un mdulo
del Kernel.
'robe, es la sonda que definimos para poder extraer informacin
del sistema.
'rogramas en D, son programas desarrollados en lenguaje D, los
cuales sern compilados por el comando dtrace0F/1 y pasados al
Kernel para extraer la informacin que deseemos. Estos programas
definen las sondas y su comportamiento.
Lenguaje D
Es una mezcla de C y a<k, la caracterstica mas notable es que
este lenguaje no dispone de instrucciones para el control de fujo, no
tenemos ni if [ then, ni <hile, for, etc.
Los programas son compilados con el comando dtrace0F/1, de una
forma parecida a como se hace en \ava, una vez probado que no contiene
errores es enviado a Kernel para que lo ejecute DTrace.
La estructura bsica de un programa en D es:
#5!
Comunidad OpenSolaris Hispano
-escripcin de la sonda
% predicado %
Y
,ccionesZ
[
Descripcin de la sonda
La descripcin de la sonda, est formada por una o ms cadenas de
la forma:
provider:module:!uncition:name
'rovider, es el mdulo de Dtrace que publica una sonda.
/odule, las distintas sondas de un provider pueden estar
organizadas en mdulos.
#unction, es la funcin sobre la que actuar la sonda.
.ame, es una descripcin de qu hace la sonda.
'redicado
La nica forma de controlar el flujo de un programa en D es mediante
los predicados.
Son expresiones encerradas en / / y que se evaluan como verdaderas o
falsas.
Ejemplo:
/ pid == 78 / El PID es igual a 78
/ execname == "bash"/ El nombre del programa sea bash
/ x <= 1 / El valor de la variable x sea menor o igual a 1
&cciones
La lgica de la sonda que estamos definiendo, se describe
mediante una serie de acciones, las cuales estarn encerradas entre
]^. Estas acciones nos permitiran medir, imprimir, contar, modificar,
los datos que la sonda obtenga.
Disponemos de una serie de funciones, que podemos utilizar para
definir el comportamiento de nuestra sonda. Alguna de las cuales son:
trace, toma una exprecion y la pasa directamente al buffer.
printf, nos permite formatear una salida.
stack, almacena el stack.
stop, para el proceso.
s(stem, ejecuta un programa.
panic, genera un kernel panic.
e2it, termina la ejecucin de la sonda.
#5"
Comunidad OpenSolaris Hispano
.OT& - -ebemos leer la gu$a de -8race antes de utili"ar las !unciones
disponibles+ 'a )ue algunas de estas !unciones son destructivas '
podr$an generarnos algunos problemas
Existen una serie de variables definidas, la cual contienen cierta
informacin, como el nombre del ejecutable, el pid, el tiempo desde el
arranque del sistemas:
pid, ID del proceso.
tid, ID del thread.
timestamp, el tiempo en nanosegundos desde el arranque de la
mquina.
e2ecname, nombre del proceso.
arg*Darg., argumento de las funciones.
probefunc, es el 3 campo del nombre de la sonda, normalmente el
nombre de la funcin.
probename, es el 4 campo de la definicin de la sonda.
EF,,E., contienen los argumentos de la llamada al comando
dtrace0F/1.
:jemplo F
Este primer ejemplo muestra el sencillo Hola mundo en lenguaje D.
dtrace:::BEGIN{
trace(Hola mundo);
}
dtrace:::END
{
trace(Adios!!);
}
bash-3.2# dtrace -s ./hola.d
dtrace: script './hola.d' matched 2 probes
CPU ID FUNCTION:NAME
0 1 :BEGIN Hola mundo
^C
0 2 :END Adios!!
:jemplo )
Este ejemplo muestra una versin en lenguaje D del comando truss.
syscall:::entry/ pid == $1 /
{
printf("%s (%d, 0x%x, %4d)n",probefunc,arg0,arg1,arg2);
}
bash-3.2# dtrace -q -s ./ejemplo2.d 1046
pollsys (134509504, 0x1, 134509672)
p
gtime (1203163434, 0x4fa7e748, 1336403752)
g
write (3, 0x80b36e8, 8)
w
read (3, 0x8047600, 32)
r
#6$
Comunidad OpenSolaris Hispano
pollsys (134509568, 0x1, 0)
p
read (3, 0x8047600, 32)
r
gtime (1203163434, 0x4fa7e748, 1336403752)
g
gtime (1203163434, 0x4fa7e748, 1336403752)
g
read (3, 0x80af6e0, 32)
r
^C
:jemplo K
En este ejemplo vamos a crear un programa en D que nos devuelva el tiempo que se
ha tardado en ejecutar cada s(scall, para obtener el tiempo utilizaremos la
variable timestamp, la cual da los nanosegundos desde que se inicio el sistema.
syscall:::entry
/ pid == $1 /
{
array_sc[probefunc] = timestamp;
}
syscall:::return
/ pid == $1 /
{
printf("time %d t %s (%d, 0x%x, %4d) n",timestamp-array_sc[probefunc], probefunc,
arg0, arg1, arg2);
}
bash-3.2# dtrace -q -s ./ejemplo3.d 1046
time 10687 pollsys (0, 0x0, 0)
time 2847 gtime (1203190270, 0x47b739fe, 0)
time 18121 write (8, 0x8, 0)
time 5630 read (-1, 0xffffffffffffffff, 4294967295)
time 59836 pollsys (1, 0x1, 0)
time 2045 ioctl (0, 0x0, 0)
time 1173 ioctl (0, 0x0, 0)
^C
&gregaciones
El lenguaje D, dispone de una serie de funciones de agregacin, que
nos ayudarn a analizar los datos obtenidos tras el lanzamiento de una
sonda.
count01, cuenta el nmero de veces.
avg01, realiza una media de los datos.
min01, obtiene el valor mnimo.
ma201, obtiene el valor mximo.
l4uantiPe01, distribucin de frecuencia lineal.
4uantiPe01, distribucin de frecuencia de potencia de 2.
:jemplo N
En este ejemplo hemos construido un programa en D, el cual cuenta
con 3 probes:
El primer probe almacena en el array Qarra(IscIcount la veces que
se inicia cualquier s(scall del proceso pid TT EF, tambin se
#6#
Comunidad OpenSolaris Hispano
almacena en arra(Isc_probefunc` el timestamp de la entrada en la
llamada.
El segundo probe, solo aplica en la entrada de la syscall read y
almacena en el array @array_time_lq[probefunc] el valor devuelto
por la funcin l4uantiPe0arg*L[1 que como primer parmetro hemos
puesto el primer argumento de la llamada read que es el file
descriptor.
El tercer probe, solo aplica a la salida de la llamada read, cuyo
pid TT EF, almacena en el array Qarra(ItimeI4_probefunc` el valor
de la funcin de agregacin 4uantiPe0timestampD
arra(Isc_probefunc`1.
syscall:::entry
/ pid == $1 /
{
@array_sc_count[probefunc] = count();
array_sc[probefunc] = timestamp;
}
syscall::read:entry
/ pid == $1 /
{
@array_time_lq[probefunc]=lquantize(arg0,0,100,1);
}
syscall::read:return
/ pid == $1 /
{
@array_time_q[probefunc]=quantize(timestamp-array_sc[probefunc]);
}
bash-3.2# dtrace -q -s ./ejemplo4.d 576
lwp_sigmask 53
setcontext 53
setitimer 107
writev 131
pollsys 295
read 371
clock_gettime 521
read
value ------------- Distribution ------------- count
11 | 0
12 | 2
13 |@@@@ 37
14 | 0
41 |@@@@@@@@ 74
42 | 0
43 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 252
44 | 0
read
value ------------- Distribution ------------- count
512 | 0
1024 |@@ 19
2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@ 241
4096 |@@@@@@@@@ 86
8192 |@@ 23
16384 | 1
#62
Comunidad OpenSolaris Hispano
32768 | 0
dtrace0F/1
Es el comando que nos permite compilar nuestros programas en D.
Dispone de una serie deparmetros entre los que podemos destacar:
o Dl listado de todos los probes disponibles.
o Ds compila un programa en D.
o D' lista los probes de un provider especfico.
o DK);6N compila los programas D en 32 o 64 bits.
o DG genera un fichero ELF que podemos usar para linkar con
otros programas.
o Dn especifica el nombre de un probe.
bash-3.2# dtrace -l
ID PROVIDER MODULE FUNCTION NAME
1 dtrace BEGIN
2 dtrace END
3 dtrace ERROR
4 Xserver576 Xorg CloseDownClient client-disconnect
5 Xserver576 Xorg Dispatch request-done
6 Xserver576 Xorg Dispatch request-start
7 Xserver576 Xorg AddResource resource-alloc
8 Xserver576 Xorg FreeClientResources resource-free
9 Xserver576 Xorg FreeClientNeverRetainResources resource-free
10 Xserver576 Xorg FreeResourceByType resource-free
...
'roviders
Las sondas (probes) son generadas por unos mdulos del kernel que
se denominan providers. Con el comando dtrace(1M) podemos ver la lista
de providers que tiene nuestro sistema, de esta lista podemos
destacar:
o fbt (Function Boundary Tracing) nos permiten tracear la
mayora de las funciones del Kernel. Con el comando dtrace -
l -1 !bt podemos ver la lista de los probes disponibles.
o lockstat, con este provider podemos tracear posibles
problemas de contencin en locks.
o mib, nos da acceso a los contadores MIBs de Solaris.
o proc, obtenemos informacin sobre el estado de los procesos
y los threads.
o s(scall, nos permite tracear todas las llamadas a systema.
o s(sinfo, obtenemos informacin sobre el sistema.
o vminfo, obtenemos informacin sobre el VM.
#63
Comunidad OpenSolaris Hispano
%ntegrar DTrace en las aplicaciones
Una de las cosas que hace interesante a Dtrace es que podemos
crear nuestros propios providers, para que generen probes en
cualquiera de nuestras aplicaciones.
o Es una herramienta muy potente para las fases de desarrollo
de SW, ya que permite de forma sencilla hacer un anlisis
del rendimiento de la aplicacin.
o El nuevo provider no generar nada mientras no se cree un
probe que lo consulte, por lo que las aplicaciones no
reducirn su rendimiento.
o Para los administradores, es una forma sencilla de controlar
el estado y rendimiento de las aplicaciones, sobre todo de
aquellas de las que dispongamos el fuente.
:n ejemplo:
7n cual)uier S.81 de cdigo abierto+ podr$amos modi!icar el !uente+
para )ue nos devuelva in!ormacin de cuanto tarda en procesar un
mensaje o el tiempo medio )ue se utili"a para almacenar un mensaje en
disco
Cmo crear nuestro propio provider
Vamos a ver como en 4 sencillos pasos podemos, crear nuestro
propio provider, definir una serie de probes y hacer que cualquiera de
nuestras aplicaciones (siempre que tengamos el cdigo fuente) puedan
utilizar DTrace.
Crear un fic)ero con la definicin del $rovider,
Creamos un fichero en el cual definimos el nuevo provider y los
probes que tendr, para nuestro ejemplo, creamos el fichero
m(provider,d y definimos el provider m(provider.
bash-3.2# cat myprovider.d
provider myprovider
{
probe op_entry(string);
probe op_return();
};
Nuestro provider tendr dos probes:
o opIentr(, el cual acepta una parmetro como entrada.
o opIreturn, este probe no acepta parmetros.
/odificamos nuestra aplicacin para 4ue utilice los probes de nuestro
provider,
Para modificar nuestra aplicacin debemos disponer del cdigo fuente.
bash-3.2# cat app_main.c
#64
Comunidad OpenSolaris Hispano
#include < stdio.h >
#include < sys >
#include < unistd.h >
main()
{
int sp;
for(;;)
{
DTRACE_PROBE1(myprovider,op_entry,"Entrada en op");
sp=rand()%5;
printf("Inicio Op: sleep (%d) n",sp);
sleep(sp);
printf("Fin Opn");
DTRACE_PROBE(myprovider,op_return);
}
}
Compilamos nuestra aplicacin junto con nuestro programa en D,
bash-3.2# gcc -c app_main.c
bash-3.2#
bash-3.2# dtrace -G -s myprovider.d app_main.o
bash-3.2#
bash-3.2# gcc -o app1 myprovider.o app_main.o
bash-3.2#
bash-3.2# ./app1
Inicio Op: sleep (3)
Fin Op
Inicio Op: sleep (3)
Fin Op
Inicio Op: sleep (4)
Fin Op
Inicio Op: sleep (3)
Fin Op
Inicio Op: sleep (2)
Creamos un script en D para poder che4uear los nuevos probes en
nuestra aplicacin,
bash-3.2# cat app1_probe.d
myprovider$1:::op_entry
{
ts = timestamp;
}
myprovider$1:::op_return
{
printf("n probename: %s t time: %d ns",probename, (timestamp - ts));
}
bash-3.2#
En la siguiente imagen podemos ver un ejemplo de la salida del
programa que acabamos de crear appF y la ejecucin del programa
appFIprobe,d que hemos lanzado con el comando dtrace0F/1.
#65
Comunidad OpenSolaris Hispano
DTrace G8% D chime
Existe un GUI para Dtrace que nos permite de forma grfica
realizar un anlisis de nuestro sistema. Por defecto vienen
algunas sondas preparadas, pero con chime podemos visualizar de
una forma rpida nuestro propios programas D. La imagen siguiente
es un ejemplo de lo que podemos hacer con chime.
#66
Comunidad OpenSolaris Hispano
DTrace! preguntas ( respuestas
?@uA es DTraceB
DTrace es una herramienta de depuracin introducida en el Sistema
Operativo Solaris 10 que nospuede ayudar a depurar problemas
sistemticos y/o difciles de diagnosticar con las herramientas y
mecanismos tradicionales. Nos ofrece una vista comprensible del
comportamiento del sistema operativo y de las aplicaciones que se
ejecutan sobre l. Con funciones similares a las de truss, apptrace,
prex y mdb, DTrace integra en una nica y poderosa herramienta de
instrumentacin que examina la actividad de usuario y del kernel de
Solaris.
Est considerada actualmente como la nica herramienta disponible
que es lo suficientemente segura para utilizar en sistemas de
produccin, adems con un insignificante impacto en el rendimiento (0%
cuando no se emplea).
DTrace ha sido adems el primer mayor componente del cdigo de
Solaris 10
que fue abierto a la comunidad opensource.
?'ara 4uA se utiliPa DTraceB
Se utiliza para anlisis de rendimiento, observacin, bsqueda de
problemas, depurado... Ejemplos como revisar los detalles de la
#6
Comunidad OpenSolaris Hispano
Entrada/Salida de disco (Disk I/O) en tiempo real cronometrar las
funciones de usuario para determinar si existe problemtica alguna en
el cdigo.
?@uiAn puede usar DTraceB
Primero necesitas ser root tener algn privilegio DTrace para poder
emplear la herramienta.
Los administradores de sistemas pueden utilizar DTrace para
entender el comportamiento del sistema operativo y de las
aplicaciones.
Los programadores de aplicaciones puede utilizar DTrace para
recoger tiempos y argumentar detalles de las funciones que ellos
escriben, tanto en entornos de desarrollo como en sistemas en
produccin.
Los ingenieros del kernel y drivers pueden emplear DTrace para
depurar un kernel ya cargado en memoria as como todos sus
mdulos sin necesidad de ejecutar drivers en modo depuracin
(DEBUG).
?:s necesario tener conocimientos internos del kernel para emplear
DTraceB
Cualquiera puede emplear DTrace desde el principio utilizando la
documentacin de los scripts ya escritos de DTraceToolkit los
scripts de una nica lnea documentados en Solaris Performance and
Tools. Al principio no necesitarn escribir sus propios scripts, pero
a medida que vayan surgiendo necesidades, los usuarios encontrarn que
escribir sus propios scripts puede probar una mayor eficacia a la hora
de resolver problemas en sus entornos.
No es necesario tener conocimientos del kernel para estudiar el
cdigo a nivel de usuario. Los desarrolladores de aplicaciones pueden
estudiar las funciones que ellos mismos escriben y seguro que adems
les resultan familiares.
Existen muchos providers de alto nivel que pueden ser diseados a
medida para proveernos de una documentada abstraccin del kernel (Ver
la Gua DTrace, ej: proc, io, sched, sysinfo, vminfo), que hacen
tracing al kernel mucho mejor y ms fcilmente de lo que se pueda
creer inicialmente.
Comprender el kernel de Solaris es necesario para escribir
scripts DTrace avanzados para los que de momento no existe un provider
de alto nivel. Por ejemplo para examinar la actividad TCP/IP en
detalle. Para sta cuestin se recomienda leer el libro Solaris
Internals 2nd Edition.
#6!
Comunidad OpenSolaris Hispano
?@uA privilegios necesito para utiliPar DTraceB
Slo ciertos grupos de privilegios permiten funcionar a DTrace.
Generalmente el privilegio dtrace_user permite acceso a llamadas al
sistema (syscall) y perfiles de proveedores (providers). El privilegio
dtrace_proc permite aadir acceso al
PID del provider y a otros provideres basados en USDT. Por ejemplo,
sin el acceso al privilegio dtrace_doc puedes tener limitada la
capacidad de monitorizacin con agentes DVM dentro de una Mquina
Virtual de Java (JVM), pero puedes ver algunas probes de llamadas al
sistema.
Si no ests seguro de los privilegios que tienes actualmente,
ejecutando el comando 'ppriv $$' , obtendrs los privilegios que tu
shell te ha proporcionado.
?.o se haba inventado (a algo similar hace )* a>os para los
mainframesB
No, DTrace puede probar dinmicamente cualquier funcin de
entrada/retorno en un kernel en funcionamiento (unos 36.000 probes);
incluso cualquier funcin en el cdigo de espacio de usuario y
libreras (por ejemplo, mozilla y sus libreras suman unas 100.000
probes); instrucciones a nivel de usuario (sobre los 200.000 probes
slo para la shell Bourne) y sin perder rendimiento.
?$a( libros sobre DTraceB
S, existen de momento dos libros excelentes sobre DTrace:
The DTrace Guide es la mejor referencia para DTrace que cubre
el lenguaje, providers y montones de ejemplos ms. Fue escrito
por los ingenieros de DTrace y es una referencia obligada. El
libro entero est online gratuitamente y tambin se puede bajar
en formato PDF.
Solaris Performance and Tools demuestra el uso de DTrace para
la observacin y el depurado del rendimiento. Fu escrito por
Brendan Gregg (autor del DTraceToolkit), Richard McDougall y Jim
Mauro (autor de Solaris Internals) .
?:2iste algan caso de A2ito empleando DTraceB
Existen de momento unos cuantos casos de xito documentados en la
red. Realmente muchos de los ingenieros, consultores, NDAs etc. suelen
utilizan habitualmente DTrace, pero lamentablemente no pueden mostrar
al mundo los detalles de pruebas y monitorizacin de sus clientes.
#6"
Comunidad OpenSolaris Hispano
De momento, podemos revisar la documentacin de Jarod Jenson, el
consultor con ms experiencia del mundo en DTrace. Jarod ha sido
entrevistado por las revistas SysAdmin Magazine y ACM; en dichas
entrevistas podemos ver algunos casos de xito reales empleando
DTrace.
Brendan Gregg (DTraceToolkit) tambin ha documentado algunos
ejemplos interesantes de anlisis con DTrace, realizando la mayor
coleccin de scripts hasta el momento.
?Cmo funciona DTrace ( el lenguaje DB
El lenguaje de programacin D est basado en el lenguaje C, as
que algn conocimiento inicial de ste lenguaje puede ayudar a su
entendimiento. D es bastante ms fcil que C ya que slo hay que
aprender un pequeo nmero de funciones y tipo de variables para ser
capaz de escribir poderosos scripts. Adems los programas en D tambin
son similares a los programas escritos en awk, lo cual puede resultar
de ayuda.
El comando dtrace(1M) utiliza una librera llamada libdtrace como
punto de entrada de varios providers dentro del kernel de Solaris,
cada uno de ellos nos ofrece una vista lgica de algunos subsistemas
del kernel. El binario dtrace puede ser utilizado tanto desde lnea de
comandos como desde shell a travs del lenguaje D.
Cuando se ejecutan, los programas escritos en D son compilados
al vuelo en bytecodes que pueden ser interpretados dentro del
kernel.. La mquina virtual de DTrace ejecuta los bytecodes para
garantizar que sean seguros. Si el cdigo es seguro y tenemos los
suficientes privilegios, el cdigo se parchea dentro delkernel
dinmicamente y es ejecutado como cdigo de kernel. ste es el por qu
los probes que no estn activos no pueden crear ninguna sobrecarga.
?@uA son los probes ( providersB
Una probe es un punto de instrumentacin que puede ser seguido
(tracing) por DTrace. Por ejemplo, llamamos el probe
"syscall:read:entry" cuando invocamos la llamada del sistema (syscall)
read(2) y se llama a "syscall::read::return" cuando se completa la
syscall read(2).
Un ejemplo de probe: io:nfs:nfs_bio:start
Ejecutando la instruccin dtrace -l podremos ver la lista de probes.
leonidas ~ # dtrace -l | wc -l
48722
#$
Comunidad OpenSolaris Hispano
Existen cuatro componentes para el nombre de la prueba:
provider:module:function:name (proveedor:mdulo:funcin:nombre), de
manera que posteriormente podamos reconocer fcilmente los probes que
puedan ser de nuestro inters.
.El provider proveedor es una coleccin de ciertos probes,
muy similar a una coleccin de funciones. Por ejemplo, el provider
"syscall" nos provee de probes para la entrada y retorno de todas las
llamadas al sistema. Al final de sta gua podemos encontrar una
referencia de los providers.
.
Los mdulos corresponden a los mdulos de kernel de Solaris. En
caso de crear nuestros propios probes dentro de las aplicaciones, el
mdulo puede ser la clase el cdigo del mdulo en el que definimos
el probe. Si el probe corresponde a una ubicacin especfica, el
nombre del mdulo es donde se localiza la prueba.
Las funciones son los nombres de las funciones del cdigo en las
que estn situados los probes. El nombre es el componente final del
probe nos da una idea de cuando se ejecuta el probe, como por ejemplo
BEGIN END
:jemplos trabajando con DTrace
"lamadas al sistema *s+scalls,
Los syscalls pueden ser fcilmente seguidos utilizando el
provider syscall, que nos ofrece un probe para la entrada y retorno de
la llamada al sistema. Como un punto en el medio entre en el espacio
de usuario y el de kernel, la interfaz syscall refleja perfectamente
el comportamiento de la aplicacin. Cada syscall est documentada en
la seccin 2 de las pginas del manual (man).
Aqu algunos ejemplos de una sola lnea con DTrace:
Ficheros abiertos por nombre del proceso,
leonidas ~ # dtrace -n 'syscall::open*:entry { printf("%s
%s",execname,copyinstr(arg0));
}'
dtrace: description 'syscall::open*:entry ' matched 2 probes
CPU ID FUNCTION:NAME
0 49565 open:entry SciTE /usr/lib/iconv/alias
0 49565 open:entry SciTE /usr/lib/iconv/alias
0 49565 open:entry SciTE /usr/lib/iconv/alias
0 49565 open:entry SciTE /usr/lib/iconv/alias
0 49565 open:entry SciTE /usr/lib/iconv/alias
0 49565 open:entry nscd /etc/security/prof_attr
0 49565 open:entry in.routed /dev/kstat
Contador de llamadas al sistema por nombre del proceso,
##
Comunidad OpenSolaris Hispano
leonidas ~ # dtrace -n 'syscall:::entry { @num[execname] = count(); }'
dtrace: description 'syscall:::entry ' matched 230 probes
^C
fmd 1
inetd 1
svc.configd 1
svc.startd 1
automountd 3
gconfd-2 3
ssh-agent 6
screen-4.0.2 7
nmbd 14
xfdesktop 16
ipmon 24
tail 24
nscd 26
env 42
head 48
tr 58
dirname 60
rm 61
xfce4-session 80
uname 92
dsdm 98
firefox-bin 112
xfce-mcs-manager 176
xfterm4 222
init 292
exo-open 399
xfwm4 400
grep 486
dtrace 515
expr 530
netbeans 643
evince 651
xfce4-panel 806
SciTE 918
sh 1115
Terminal 1415
java 3219
Xorg 3422
Contador de llamadas al sistema con syscall,
leonidas ~ # dtrace -n 'syscall:::entry { @num[probefunc] = count(); }'
dtrace: description 'syscall:::entry ' matched 230 probes
^C
fcntl 1
getpid 1
mmap 1
open 1
schedctl 1
fstat64 2
so_socket 2
stat64 2
close 3
sysconfig 3
sigaction 5
brk 6
xstat 10
lwp_sigmask 11
setcontext 11
#2
Comunidad OpenSolaris Hispano
nanosleep 13
gtime 14
write 15
writev 16
setitimer 19
p_online 32
read 56
lwp_park 66
pollsys 239
ioctl 495
Se puede establece un valor particular para medir el tiempo
transcurrido y el tiempo en CPU de las llamadas al sistema, de forma
que nos explique el tiempo de carga y respuesta de la CPU. Por
ejemplo, la herramienta procsystime de DTraceToolkit realiza sta
funcin utilizando los flags -e y -o
:ntrada;Salida de disco 0Disk %;O1
Los eventos de disco se pueden seguir empleando el provider io,
el cual nos ofrece probes para la peticin y completacin de
Entrada/Salida de discos y clientes NFS.
Cada probe nos muestra detalles muy extensos sobre la
Entrada/Salida a travs de la matriz args[], como est documentado en
la gua DTrace.
Los siguientes listados nos muestran algunos de stas pruebas:
leonidas ~ # dtrace -ln 'io:genunix::'
ID PROVIDER MODULE FUNCTION NAME
3769 io genunix biodone done
3770 io genunix biowait wait-done
3771 io genunix biowait wait-start
3780 io genunix default_physio start
3781 io genunix bdev_strategy start
3782 io genunix aphysio start
Hay que tener en cuenta los siguientes puntos a la hora de
utilizar el provider io para el seguimiento de la actividad de disco:
sta es la peticin actual de Entrada/Salida de disco. Tu
aplicacin puede tener cargas de Entrada/Salida que pueden ser
absorvidas por el cache del sistema de ficheros.
Las I/O Completions (io:::done) son asncronas, as que pid y
execname podrian no identificar los procesos responsables. Las
peticiones de escritura en disco (io:::start) suelen ser a menudo
asncronas a los pocesos responsables, como el sistemas de ficheros ha
cacheado la escritura, ya no existir ms adelante en el medio de
almacenamiento. .
#3
Comunidad OpenSolaris Hispano
Los eventos io no significan necesariamente que las cabezas del disco
se estn moviendo. Algunos discos tienen buffers para cachear la
actividad de Entrada/Salida, especialmente los arrays de discos.
Algunos ejemplos de I/O en una nica lnea:
leonidas ~ # dtrace -n 'io:::start { printf("%d %s %d",pid,execname,args[0]>
b_bcount); }'
dtrace: description 'io:::start ' matched 3 probes
CPU ID FUNCTION:NAME
0 3781 bdev_strategy:start 0 sched 512
0 3781 bdev_strategy:start 0 sched 512
0 3781 bdev_strategy:start 0 sched 1024
0 3781 bdev_strategy:start 0 sched 1024
0 3781 bdev_strategy:start 0 sched 4608
0 3781 bdev_strategy:start 0 sched 4608
0 3781 bdev_strategy:start 0 sched 3584
0 3781 bdev_strategy:start 0 sched 3584
0 3781 bdev_strategy:start 0 sched 3584
0 3781 bdev_strategy:start 0 sched 7168
0 3781 bdev_strategy:start 0 sched 7168
Agregacin de tamao de disco,
leonidas ~ # dtrace -n 'io:::start { @size[execname] = quantize(args[0]-
>b_bcount); }'
dtrace: description 'io:::start ' matched 3 probes
^C
sched
value ------------- Distribution ------------- count
256 |
0
512 |@@@@@@@@@
9
1024 |@@@@@@@@@@@@
13
3KMJ 2RRRRRRRRRRRRRRR &<
MKI< 2 K
J&I3 2 K
&<LJM 2RRRR M
L3H<J 2 K
Otros ejemplos: el famoso Hola, mundo!,
Ya en nuestro editor de textos favorito escribimos el siguiente
cdigo y lo guardamos con el nombre hola.d :
#4
Comunidad OpenSolaris Hispano
BEGIN
{
trace(Hola, mundo!);
exit(0);
}
Para ejecutar el cdigo debemos utilizar el comando dtrace con el flag
-s :
leonidas ~ # dtrace -s hola.d
dtrace: script 'hola.d' matched 1 probe
CPU ID FUNCTION:NAME
0 1 :BEGIN Hola, mundo!
Para ms informacin:
En DTraceToolkit podremos encontrar numerosos scripts ms que nos
sirvan de ayuda.
Si tienes instalado Solaris Express Developer Edition, en el
directorio
/usr/demo/dtrace encontrars ms scripts.
Tambin puedes usar tu navegador web para verlos todos, escribiendo la
URL:
file:///usr/demo/dtrace/index.html en la barra de direccin.
#5
Comunidad OpenSolaris Hispano
Role 9ased &ccess
Control 0R9&C1
Desde hace ya bastantes aos tanto en la gestin de los usuarios
y grupos dentro del ambito tecnolgico de los gestores de Base de
Datos (BB.DD.) el uso de roles y perfiles era un concepto asumido y
conocido.
Sin embargo en el mundo de los sistemas operativos (OS) y sus
distribuciones binarias, mas an en concreto los clasificados como
UNIX o de tipo UNIX podian disponer de herramientas de terceros (ej:
SUDO) que en ningun caso permitian todas las funcionalidades de un
gestor de perfiles y roles integrado con el resto de funcionalidades
del sistema.
?@uA es R9&CB
Es una herramienta que posibilita la definicin de perfiles
asociados a la ejecucin de unos determinados binarios o conjunto de
ellos. Al mismo timepo estos nuevos atributos (perfiles) se pueden
asignar a un determinado usuario/s para conseguir la ejecucin de esos
binarios de forma controlada.
Una variante superior consiste en la agrupacion de estos perfiles
en lo que se conoce como roles, Ya no se trata de un atributo
concreto, sino que este ultimo concepto practicamente ya goza de
identidad dentro de la gestin de usuarios/grupos del sistema.
#6
Comunidad OpenSolaris Hispano
'erfiles
Basicamente en su definicin lo asociamos a la ejecucin de un
determinado/s binario con un identificador de usurios. En el ejemplo
posterior se relacciona el comando format con el uid=0 del usuario
root.
Posteriormente asignaremos a un usuario en particular (victor),
este nuevo atributo de tipo perfil Format y comprobaremos el
resultado de esta asociacin, ejecutando esa orden de linea de
comandos.
pluton ~ # vi /etc/security/prof_attr
...
Format:::Allow Users to run format command::
pluton ~ # vi /etc/security/exec_attr
...
Format:suser:cmd:::/usr/sbin/format:uid=0
pluton ~ # groupadd users
pluton ~ # useradd -s /bin/bash -g users -m -d /export/home/victor victor
pluton ~ # usermod -P Format victor
pluton ~ # more /etc/user_attr
victor::::profiles=Format,auths=solaris.*,solaris.grant;type=normal
pluton ~ # su - victor
pluton ~ # pfexec /usr/sbin/format
Roles
Basicamente en su definicin es similar el la parte de asignacin
de perfiles, pero en este caso la diferencia reside en la asociacin
de diferentes perfiles a un determinado rol/es.
En el ejemplo de mas abajo, creamos de forma sencilla el perfil
Snoop que asociamos con el binario snoop y con el uid=0 de root.
Posteriormente creamos el rol usrsnoop en el sistema y se lo
asignamos al usuario victor (previamente definido).
Posteriormente el usuario victor puede cambiar de identidad al
rol usrsnoop y ejecutar la orden de linea de comandos permitida.
pluton ~ # vi /etc/security/prof_attr
Snoop:::Allow Users to run snoop command::
pluton ~ # vi /etc/security/exec_attr
Snoop:suser:cmd:::/usr/sbin/snoop:uid=0
pluton ~ # roleadd -m -d /export/home/snoop -s /usr/bin/pfsh -P Snoop,All usrsnoop
pluton ~ # usermod -R usrsnoop victor
pluton ~ # more /etc/user_attr
usrsnoop::::type=role,profiles=Snoop,All
pluton ~ # su - victor
pluton ~ # su usrsnoop
pluton ~ # /usr/sbin/snoop
#
Comunidad OpenSolaris Hispano
En la distribucin binaria de tipo comercial Sun Solaris 10
(cualquier release hasta la 5/08) podemos realizar este tipo de
gestin de RBAC de forma mucho mas sencilla a travs de la herramineta
grfica: Solaris Management Console (SMC v2/3).
Esta misma funcionalidad se encuentra disponible en las dos
distribuciones binarias de tipo Solaris Express, como son la Community
Edition (SXCE Build 89) y la Developer Edition (SXDE 1/08).
En las otras distribuciones binarias (Nexenta, Belenix, etc...) y
en particular en la Release Candidate 3 (RC3) de INDIANA ya no se
encuentra disponible la SMC (v2/3), pero dicha funcionalidad existe
igualmente y podemos utilizar herramientas sencillas del escritorio
GNOME.
#!
Comunidad OpenSolaris Hispano
#"
Comunidad OpenSolaris Hispano
Solaris 3olume /anager
0S3/1
Ya desde sus versiones iniciales de la distribucin comercial Sun
Solaris 5, 6, 7 y 8 introduccian un gestor de discos (en particular de
metadispositivos) denominado Solstice -is0 Suite. Con grandes
innovaciones funcionales (aparicin del concepto de particiones de
tipo so!t) en la ltima de sus releases, incoporada en Sun Solaris 8.
La evolucin natural del producto y la tendencia del mercado ha
originado la nueva denominacin como Solaris Wolume .anager, sin
embargo incorpora (como veremos a los largo de este capitulo)
practicamente las mismas funcionalidades que su predecesor.
?@uA es S3/B
Es una herramienta que permite la gestin del almanecamineto de
cada uno de los discos del sistema (locales o remotos) en base a
particiones de tipo hard (especificado su tamao con un cilindro de
comienzo y otro de finalizacin) y de tipo so!t (especificado su
tamao como una cantidad definida en kilobytes:kb, megabytes:mb o
gigabytes: gb).
Adicionalmente posibilita la realizacin de configuraciones de
tipo RAID (Redundant Array of Inexpensive) entre las diferentes
particiones de tipo hard y so!t que hayamos definido. Los diferentes
niveles que permite son: RAID 0 (Concat o Stripe), RAID 1 (Mirror),
RAID 5 (Parity) y combinaciones de los mismos.
#!$
Comunidad OpenSolaris Hispano
R&%D * 0Concat1
Metadispositivo resultante como distribucin secuencial de al
menos dos particiones, cuyo tamao consiste en la suma del de sus
componentes.
pluton ~ # metainit -f d11 3 1 c0d1s4 c1d1s5 c2t0d0s6
d11: Concat/Stripe is setup
pluton ~ # metastat -p
d11 3 1 c0d1s4 \
1 c1d1s5 \
1 c2t0d0s6
pluton ~ # newfs /dev/md/rdsk/d11
R&%D * 0Stripe1
Metadispositivo resultante como distribucin NO secuencial (es
decir en paralelo) de al menos dos particiones, cuyo tamao consiste
en la suma del de sus componentes (deben ser iguales sino se pierde la
diferencia).
pluton ~ # metainit -f d11 1 3 c0d1s4 c1d1s5 c2t0d0s6
d11: Concat/Stripe is setup
pluton ~ # metastat -p
d11 1 3 c0d1s4 c1d1s5 c2t0d0s6
pluton ~ # newfs /dev/md/rdsk/d11
En ambos casos del RAID 0 (Concat y Stripe) unicamente se incrementa
el tamao y/o la velocidad, pero no disponemos de tolerancia a fallos.
R&%D F 0/irror1
Metadispositivo resultante como distribucin en espejo NO
secuencial (es decir en paralelo) de dos particiones del mismo tamao.
En este caso una de las particiones acta de origen y la otra destino
de la copia (en todo momento online) de los datos. Se pierde la mitad
del tamao total de sus componentes, pero se gana en tolerancia a
fallos de al menos una de las particiones implicadas.
pluton ~ # metainit -f d11 1 1 c0d1s4
d11: Concat/Stripe is setup
pluton ~ # metainit -f d12 1 1 c0d2s4
d12: Concat/Stripe is setup
pluton ~ # metainit d10 -m d11
d10: Mirror is setup
pluton ~ # metattach d10 d12
d10: submirror d12 is attached
pluton ~ # metastat -p
d10 -m d11 d12 1
d11 1 1 c0d1s4
d12 1 1 c0d2s4
#!#
Comunidad OpenSolaris Hispano
pluton ~ # newfs /dev/md/rdsk/d10
R&%D - 0'arit(1
Metadispositivo resultante como distribucin en paridad NO
secuencial (es decir en paralelo) de al menos 3 particiones del mismo
tamao. En este caso la informacin se guarda en bandas donde uno de
los componentes de la misma alberga la paridad. Con tres particiones
implicadas se pierde un tercio del tamao total, pero se gana en
tolerancia a fallos.
pluton ~ # metainit -f d10 -r c0d1s4 c1d1s5 c2t0d0s6
d10: RAID is setup
pluton ~ # metastat -p
d10 -r c0d1s4 c1d1s5 c2t0d0s6 -k -i 32b
pluton ~ # newfs /dev/md/rdsk/d10
En la distribucin binaria de tipo comercial Sun Solaris 10
(cualquier release hasta la 5/08) podemos realizar este tipo de
gestin de SVM de forma mucho mas sencilla a travs de la herramineta
grfica: Solaris Management Console (SMC v2/3).
#!2
Comunidad OpenSolaris Hispano
Esta misma funcionalidad se encuentra disponible en las dos
distribuciones binarias de tipo Solaris Express, como son la Community
Edition (SXCE Build 89) y la Developer Edition (SXDE 1/08).
En las otras distribuciones binarias (Nexenta, Belenix, etc...) y
en particular en la Release Candidate 3 (RC3) de INDIANA ya no se
encuentra disponible la SMC (v3/4). Existen varios proyectos en el
desarrollo de interfaz de usuario para este tipo de gestin de los
discos del sistema con SVM, en particular cabe destacar Simple Panels
Bhttp://tra!.neuroomante.!om/simplepanelsC.
#!3
Comunidad OpenSolaris Hispano
%'#ilter 0%'#1
A diferencia de RBAC y otras herramientas de Seguridad Lgica,
desde el punto de vista de la Seguridad Perimetral (a nivel de red y a
nivel de host) en la antigua version 8 (independientemente de la
release) de la distribucin comercial Sun Solaris se incluia como
utilidad (gratuita) de Firewall local y remoto el producto SunScreen
Lite v3.1 y todavia comptible con Sun Solaris. Actualmente dicho
producto esta discontinuado (deprecated) y se ha incluido de forma
estandard este nuevo componente del sistema, el cual esta 100%
integrado con otros componentes como SMF, etc.. y ademas no es
incompatible con otros productos de mercado que ofrecen la misma
fucnionalidad o ms.
?@uA es %'#B
Es una herramienta que permite el filtrado de trfico local y
remoto de tipo TCP / UDP junto con el enmascaramiento o traduccin de
direcciones IPv4/6 (Network Address Translation: NAT), incluyendo la
redireccin por puertos TCP (Network Addess Translatioon Port: NATP).
A diferencia de otros productos, NO es un proceso sino un cojunto
de modulos del kernel del sistema. Este hecho optimiza su rendimiento
y le permite conservar bastantes similitudes con otras utilidades de
Firewall de este tipo a nivel de linea de comnandos (CLI).
En este articulo vamos a configurar de forma sencilla la
proteccin de nuestro sistema con unas simples reglas y entender su
funcionamiento.
Inicialmente tenemos que inicializar los modulos del kernel y
habilitar el servicio IPFilter a travs de SMF.
#!4
Comunidad OpenSolaris Hispano
pluton ~ # ipf -E
pluton ~ # svcadm enable ipfilter
pluton ~ # svcs | grep ipfilter
online 11:17:24 svc:/network/ipfilter:default
pluton ~ # tail -f /var/svc/log/network-ipfilter\:default.log
[ abr 25 18:14:26 Disabled. ]
[ abr 25 18:14:26 Rereading configuration. ]
[ abr 25 18:30:41 Disabled. ]
[ sep 11 11:17:11 Enabled. ]
[ sep 11 11:17:14 Executing start method ("/lib/svc/method/ipfilter start") ]
[ sep 11 11:17:24 Method "start" exited with status 0 ]
pluton ~ # ipfstat -iol
empty list for ipfilter(out)
empty list for ipfilter(in)
Una vez comprobado que todo esta OK, es el momento para comenzar
con su configuracin. En este sencillo ejemplo se puede observar el
filtrado de todo el trfico TCP y UDP, unicamente permitiendo el
acceso a nuestro sistema por ssh desde la Ipv4 especificada en el
fichero de configuracin.
pluton ~ # ifconfig -a
lo0: flags=2001000849 mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
pcn0: flags=201000843 mtu 1500 index 2
inet 10.73.130.68 netmask ffffff00 broadcast 10.73.130.255
ether 0:c:29:ef:ed:da
pluton ~ # vi /etc/ipf/pfil.ap
P Filter pfil autopush setup
#
# See the autopush(1M) manpage for more information.
#
# Format of the entries in this file is:
#
#major minor lastminor modules
#iprb -1 0 pfil
#elxl -1 0 pfil
pcn0 -1 0 pfil
#e1000g -1 0 pfil
#bge -1 0 pfil
#nf -1 0 pfil
#fa -1 0 pfil
#ci -1 0 pfil
#el -1 0 pfil
#ipdptp -1 0 pfil
#lane -1 0 pfil
#dnet -1 0 pfil
#pcelx -1 0 pfil
#spwr -1 0 pfil
pluton ~ # vi /etc/ipf/ipf.conf
#
# ipf.conf
#
# IP Filter rules to be loaded during startup
#!5
Comunidad OpenSolaris Hispano
# See ipf(4) manpage for more information on
# IP Filter rules syntax.
# Block any packets which are too short to be real
block in quick all with short
# drop and log any IP packets with options set in them.
block in all with ipopts
# Allow all traffic on loopback.
pass in quick on lo0 all
pass out quick on lo0 all
# Public Network. Block everything not explicity allowed.
block in log on pcn0 from any to any port = 22
block out on pcn0 all
# Allow pings out.
pass out quick on pcn0 proto icmp all keep state
# for testing, allow pings from ben and jerry
pass in quick on pcn0 proto icmp from 10.73.130.122/32 to 10.73.130.68/32
# Allow outbound state related packets.
pass out quick on pcn0 proto tcp/uDp from any to any keep state
# Actually, allow ssh only from ben, jerry, MSU
pass in quick on pcn0 proto tcp from 10.73.130.122/32 to 10.73.130.68/32 port = 22
nicamente nos quedara reiniciar el servicio SMF asociado a
IPFilter y comenzar a observar la actividad de dicho modulo y sus
estadisticas.
pluton ~ # svcadm disable ipfilter
pluton ~ # svcadm enable ipfilter
pluton ~ # ipftsat -iol
pass out quick on lo0 all
block out on pcn0 all
pass out quick on pcn0 proto icmp from any to any keep state
pass out quick on pcn0 proto tcp/udp from any to any keep state
block in quick from any to any with short
block in from any to any with ipopts
pass in quick on lo0 all
block in log on pcn0 from any to any port = 22
pass in quick on pcn0 proto icmp from 10.73.130.122/32 to 10.73.130.68/32
pass in quick on pcn0 proto tcp from 10.73.130.122/32 to 10.73.130.68/32 port= ssh
pluton ~ # ipfstat -hio
0 pass out quick on lo0 all
3 block out on pcn0 all
0 pass out quick on pcn0 proto icmp from any to any keep state
2 pass out quick on pcn0 proto tcp/udp from any to any keep state
0 block in quick from any to any with short
0 block in from any to any with ipopts
0 pass in quick on lo0 all
7 block in log on pcn0 from any to any port = 22
0 pass in quick on pcn0 proto icmp from 10.73.130.122/32 to 10.73.130.68/32
2 pass in quick on pcn0 proto tcp from 10.73.130.122/32 to 10.73.130.68/32 port =
ssh
#!6
Comunidad OpenSolaris Hispano
Si no estamos acostumbrados a la administracin de este tipo de
firewall basados en ordenes de linea de comandos (CLI ), siempre
podemos recurrir a herramientas grficas de gestin de los mismos
inclyuendo herramientas de anlisis y almacenamiento de Logs en modo
Bitacora (ej: Firewall Builder y FWLogWatch)
#!
Comunidad OpenSolaris Hispano
%mage 'ackaging S(stem
0%'S1
A diferencia de las versiones mas clsicas de la distribucin
comercial Sun Solaris (5, 6, 7, 8, 9 e incluso 10), las distribuciones
binarias mas actuales bajo el marco de desarrollo del proyecto
internacional OpenSolaris incorporan un nuevo sistema de paquetes
denominado Image 1ac0aging S'stem (IPS).
?@uA es %'SB
En particular la distribucuion binaria mas novedosa en este
aspecto fue Nexenta (GNU/Solaris). Esta incorpora el conocido sistema
de paquetes APT (existente en las conocidas distribuciones Linux como
Debian, Fedora, Ubuntu...) de forma compatible junto con el
tradicional sistema de paquetes PGK de Sun Solaris. Ambos sistemas son
intercambiables mediante la definicin y modificacin de diferentes
variables de entorno del sistema sin dejar de ser 100% compatibles.
Sin embargo con la aparicin de la distribucin final de usuario
Indiana y en concreto la Release Candidate 3 (RC3), la cual sali a la
luz el pasado mes de Mayo del 2008 (OpenSolaris 2008.05) muchas cosas
han cambiado. Mantiene la compatibilidad con el anterior y esttico
sistema PKG, incorporando el nuevo sistema de paquetes IPS. Este
ltimo permite (entre otras cosas) actualizacin y mantenimiento
online al estilo APT / YUM / PORT como en las ms conocidas y citadas
distribuciones Linux o BSD.
?Cmo funcionaB
Una vez instalada nuestra distribucin binaria 2008.05 lo primero
que podemos comprobar es el conjunto de paquetes actuales, al mismo
tiempo que los verificamos.
#!!
Comunidad OpenSolaris Hispano
pluton ~ # pkg list -av
FMRI STATE UFIX
...
pkg:/SUNWtcat@5.25,5.11-0.75:20071114T203821Z Know ----
pkg:/SUNWtcat@5.25,5.11-0.79:20800205T165922Z Know ----
pkg:/SUNWtcat@5.26,5.11-0.86:20080422T222737Z Know ----
pkg:/SUNWtcat@5.26,5.11-0.86:20071114T203821Z installed ----
pluton ~ # pkg list
NAME (AUTHORITY) VERSION STATE UFIX
...
SUNWtcat 5.5.26-0.86 installed ----
pluton ~ # pkginfo
...
system SUNWtcatr Tomcat Servlet/JSP Container (root)
system SUNWtcatu Tomcat Servlet/JSP Container
pluton ~ # pkg verify
PACKAGE STATUS
...
pkg:/SUNWtcat ..... //
pluton ~ # pkgrm
pluton ~ # pkg info -l SUNWtcat
Name: SUNWtcat
Summary: Tomcat Servlet/JSP Container
State: Installed
Authority: opensolaris.org (preferred)
Version: 5.5.26
Build Release: 5.11
Branch: 0.86
Packaqing Date: Sat Apr 26 18:03:46 2008
Size: 24.4 MB
FRMI: pkg:/SUNWtcat@5.26,5.11-0.86:20071114T203821Z
pluton ~ # pkginfo -l
...
PKGINST: SUNWtcatr
NAME: system
ARCH: i386
VERSION: 11.11.0,REV=2008.03.19.13.46
VENDOR: Sun Microsystems
DESC: Tomcat Servlet/JSP Container (root)
HOTLINE: Please contact your local service provider
STATUS: Completely installed
PKGINST: SUNWtcatu
NAME: system
ARCH: i386
VERSION: 11.11.0,REV=2008.03.19.13.46
VENDOR: Sun Microsystems
DESC: Tomcat Servlet/JSP Container
HOTLINE: Please contact your local service provider
STATUS: Completely installed
En el primer comando listamos todos los paquetes del sistema y la
notacin resultante consiste en su estado y su UFIX. En el segundo
ejemplo unicamente listamos los paquetes que han sido instalados
utilizando los repositorios on line de IPS.
#!"
Comunidad OpenSolaris Hispano
En ambos casos aparece indicado el estado de ese paquete y su
atributo UFIX. Pero, que significa esta nomenclatura?
U = Upgradable (actualizable, existe una version superior)
F = Frozen (congelado, no existe nueva version prevista)
I = Incorporated (incorporado, es decir actualizacin reciente)
E = Excluded (excluido)
Sin embargo en el ltimo comando de este ejemplo, hemos utilizado
el clsico p0gin!o, similar en funcionalidad al segundo (es decir
unicamente lista en el antiguo formato los paquetes actualizados
online) con la salvedad que es capaz de discriminar la granuralidad de
cada uno de los paquetes y dependencias.
Como novedad incorpora la opcin de buscar un determinado paquete
en los distintos repositorios online, instalarlo junto con todas sus
dependencias, desinstalarlo y la posibilidad de comprobar su
integridad como la del resto de paquetes, asi:
pluton ~ # pkg search -r php
INDEX ACTION VALUE PACKAGE
basename file usr/php5/5.2.4/bin/php pkg:/SUNWphp524usr@5.2.4-0.79
basename file usr/php5/5.2.4/bin/php pkg:/SUNWphp524@5.2.4-0.86
basename file usr/php5/5.2.4/bin/php pkg:/SUNWphp524@5.2.4-0.86
basename file usr/php5/5.2.4/bin/php pkg:/SUNWphp524@5.2.4-0.89
basename file usr/php5/5.2.4/bin/php pkg:/SUNWphp524@5.2.4-0.90
pluton ~ # pkg install SUNWphp524
Creating Plan /
DOWNLOAD PKGS FILES XFER (MB)
Completed 11/11 829/829 44.52/44.52
PHASE ACTIONS
Install Phase 1268/1268
pluton ~ # pkg uninstall SUNWphp524
pluton ~ # pkg verify SUNWphp524
PACKAGE STATUS
pkg:/SUNWphp524 ..... //
En la distribucin binaria de tipo comercial Sun Solaris 10
(cualquier release hasta la 5/08) podemos realizar nicamente la
gestin de los parches (NO de los paquetes) del sistema de forma mucho
mas sencilla a travs de la herramienta grfica: Solaris .anagement
@onsole (SMC v2/3).
#"$
Comunidad OpenSolaris Hispano
Esta misma funcionalidad se encuentra disponible en las dos
distribuciones binarias de tipo Solaris Express, como son la Community
Edition (SXCE Build 89) y la Developer Edition (SXDE 1/08) al igual
que la herramienta :pdate .anager, la cual posibilita tanto la
actualizacin y mantenimiento de pa4uetes, como de parches.
#"#
Comunidad OpenSolaris Hispano
Como dato relevante antes de finalizar este articulo, destacar
que en todo momento tenemos garantizada la compatibilidad con el
modelo esttico de gestin de pa4uetes y parches PKG, tanto en su
instalacin, como desinstalacin de los mismos.
pluton ~ # pkgadd -d STATsrv-Sol86.pkg
pluton ~ # pkgadd -d .
pluton ~ # pkgrm STATsrv
pluton ~ # pkgchk
En el primer caso instalaremos ese paquete en particular, sino
especificamos el nombre del paquete. El segundo comando nos presentar
la posibilidad de instalar todos los PKGs de ese directorio y sucede
los mismo con su eliminacin. En el tercer ejemplo desinstalaremos ese
paquete en detalle y finalmente chequeamos el estado de los pa4uetes.
pluton ~ # patchadd 118976-07
pluton ~ # patchrm 118976-07
#"2
Comunidad OpenSolaris Hispano
En este sencillo ejemplo se muestra como instalar y desinstalar
ese parche en el sistema.
En las otras distribuciones binarias (Nexenta, Belenix, etc...) y
en particular en la Release Candidate 3 (RC3) de INDIANA ya no se
encuentra disponible ni la SMC (v2/3) ni la opcin del :pdate .anager
Sin embargo, si no estamos acostumbrados a la administracin de
este tipo de utilidades de gestin de paquetes basadas en ordenes de
linea de comandos (CLI), siempre podemos recurrir a sencillas
herramientas grficas de administracin (integradas en el escritorio
GNOME) como es el caso de Package Manager. Esta ultima utilidad
coincide el un alto % de similitudes al conocido paquete Synaptic,
existente en las distribuciones Linux ms conocidas y existentes.
#"3

También podría gustarte