guía del estudiante: community editionindex-of.co.uk/sistemas-operativos/gu%eda%20del%20...guía...

185
Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Upload: others

Post on 08-May-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: CommunityEdition

Versión 2.0

OpenSolaris Hispano

March 06, 2010

Page 2: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010
Page 3: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Índice general

1. Licencia 11.1. Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2. Changelog 3

3. OpenSolaris 53.1. Distribuciones OpenSolaris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53.2. OpenGrok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.3. Las comunidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.4. Proyectos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.5. Participa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

4. Instalando OpenSolaris 2008.05 74.1. Novedades de OpenSolaris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74.2. Requisitos de Instalación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74.3. Iniciando OpenSolaris 2008.05 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84.4. Iniciando el LiveCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

5. Arranque y Parada 215.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215.2. Gestor de arranque GRUB (Grand Unified Bootloader) . . . . . . . . . . . . . . . . . . . . . . . 22

6. Service Management Facility (SMF) 256.1. Introducción a SMF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256.2. Obtener información de los servicios (svcs) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296.3. Cambios de estado de un servicio (svcadm) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316.4. Ver la configuración de un servicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326.5. inetd como servicio SMF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336.6. Crear un nuevo servicio SMF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366.7. Delegar la gestión de SMF a otros usuarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

7. Gestión de Usuarios 417.1. Ficheros de configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417.2. Gestión de Usuarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437.3. Gestión de grupos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457.4. ¿Qué hacen los usuarios en el sistema? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

8. Procesos y Señales 498.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

I

Page 4: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

8.2. Ver los Procesos en Ejecución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498.3. Señales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518.4. Información sobre procesos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538.5. Trabajos Planificados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

9. Gestión de Discos 619.1. Nombres de Dispositivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619.2. Instalar y configurar un nuevo disco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639.3. La VTOC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679.4. Sistema de ficheros UFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689.5. Montar el nuevo sistema de ficheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689.6. Desmontar un sistema de ficheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699.7. Ver el tipo de un sistema de ficheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709.8. Montar un disco de forma permanente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

10. ZFS 7310.1. Introducción a ZFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7310.2. Propiedades de un ZFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7410.3. Gestión del POOL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7710.4. Crear un mirror (RAID 1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7810.5. Crear RAID-Z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8010.6. Snapshots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8010.7. Estados de ZFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

11. Zonas 8511.1. Zonas con OpenSolaris 2008.05 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8511.2. Crear una zona . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8511.3. Estados de una zona . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9211.4. Monitorizar una zona . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9211.5. Validarse en una zona . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9311.6. Desinstalar una zona . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9311.7. ¿Cómo funcionan las Zonas? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

12. BrandZ y Linux 9912.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9912.2. Linux dentro de un Brandz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9912.3. Técnica de interposición . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9912.4. Peculiaridades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10012.5. Caso Práctico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

13. Virtualizando con xVM 10313.1. Por qué utilizar xVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10313.2. Arquitectura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10513.3. Red . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10613.4. Dispositivos de bloque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10613.5. ¿Tiene nuestro sistema soporte para xVM? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10613.6. Los servicios de xVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10713.7. GRUB para xVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10713.8. Herramientas para xVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10713.9. Directorios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10813.10.Creando un domU con Linux Centos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10813.11.Parando un domU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11113.12.Pausando un domU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11213.13.Puntos de Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11213.14.Borrando un domU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11213.15.Asignando CPU a un domU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11313.16.Asignando memoria a un domU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11413.17.Asignando interfaz de red un domU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11513.18.Asignando un nuevo disco a un domU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

II

Page 5: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

13.19.Creando un domU con Solaris Express . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

14. Navegando en el /proc 12114.1. Espacio de direcciones de un proceso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12514.2. Comando truss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

15. Rendimiento/Tuning 13515.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13515.2. Procesos y procesadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13515.3. Estado del Sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13615.4. mpstat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13715.5. kstat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13815.6. truss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13915.7. lockstat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14015.8. cpustat y cputrack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

16. DTrace 14516.1. ¿Qué es DTrace? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14516.2. Arquitectura de DTrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14616.3. Lenguaje D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14616.4. dtrace(1M) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15016.5. Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15116.6. Integrar DTrace en las aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15116.7. Cómo crear nuestro propio provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15216.8. DTrace GUI - chime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15316.9. DTrace: Preguntas y Respuestas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15416.10.Ejemplos trabajando con DTrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

17. Role Based Access Control (RBAC) 16117.1. ¿Qué es RBAC? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16117.2. Perfiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16117.3. Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

18. Solaris Volume Manager (SVM) 16518.1. ¿Qué es SVM? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16518.2. RAID 0 (Concat) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16518.3. RAID 0 (Stripe) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16618.4. RAID 1 (Mirror) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16618.5. RAID 5 (Parity) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166

19. IPFilter (IPF) 16919.1. ¿Qué es IPF? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

20. Image Packaging System (IPS) 17320.1. ¿Qué es IPS? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17320.2. ¿Cómo funciona? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

21. Indices and tables 179

III

Page 6: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

IV

Page 7: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 1

Licencia

Esta obra está bajo una licencia de Creative Commons. Para ver una copia de esta licencia, visitehttp://creativecommons.org/licenses/by-sa/2.5/ o envíe una carta a Creative Commons, 559 Nathan Abbott Way,Stanford, California 94305, USA.

Usted es libre de:

Copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas.

Bajo las condiciones siguientes:

Reconocimiento. Debe reconocer los créditos de la obra de la manera especificada por el autor o el licen-ciador (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, sólo puededistribuir la obra generada bajo una licencia idéntica a ésta.

Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos 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.

1.1 Referencias

Todos los nombres propios de programas, sistemas operativos, equipos hardware, etc., que aparecen en este libroson marcas registradas de sus respectivas compañías u organizaciones.

1

Page 8: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

2 Capítulo 1. Licencia

Page 9: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 2

Changelog

Bajo el modelo de licenciamiento actual de tipo CC (Creative Commons) y con las condiciones de Reconoci-miento y Compartición de esta licencia ya citadas anteriormente, este apartado pretende ser una apuesta por lacolaboración y además un sistema de control de versiones/actualizaciones de cada uno de los nuevos anexos quese pueden añadir de forma libre y abierta.

Actualmente el estado de las diferentes contribuciones al documento, es el siguiente:

David Galan (http://davidgalan.opensolarisblog.org):

Introducción

Instalación

Arranque y Parada

Service Management Facility (SMF)

Gestion de Usuarios

Procesos y señales

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.wordpress.com):

Introducción a DTrace

Victor M. Fernández (http://vfernandezg.blogspot.com):

Role Based Access Control (RBAC)

Solaris Volume Manager (SVM)

IPFilter (IPF)

Image Packaging System (IPS)

3

Page 10: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

4 Capítulo 2. Changelog

Page 11: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 3

OpenSolaris

OpenSolaris nace en Junio de 2005 y es el resultado de la liberación de la mayor parte del código fuente de Solarispasando a ser un proyecto de software libre. Desde este nuevo enfoque nacen nuevas distribuciones que aportanmejoras al sistema además de enriquecerlas con más software.

3.1 Distribuciones OpenSolaris

De las diferentes aportaciones realizadas por comunidades de usuarios o desarrolladores nacen las siguientesdistribuciones:

Solaris 10 Es la versión oficial de Sun Microsystems disponible para arquitectura Sparc y x86. Es estable yrobusta estando diseñada para entornos de producción donde se necesita estabilidad. Es gratuita y podemosdescargarla del sitio web oficial de Sun.

Solaris Express Community Edition Su nombre en clave es “nevada” es una distribución binaria que se actua-liza cada dos viernes, es una versión que puede no ser compatible con otras versiones ya que incorporamuchos cambios.

Solaris Express Developer Edition Contiene todas las nuevas incorporaciones de funcionalidades y softwareque darán lugar a la próxima versión estable de Solaris por lo tanto esta recomendada para entornos dedesarrollo o preproducción. Se actualiza cada tres o cuatro meses.

OpenSolaris Developer Preview Más conocida como OpenSolaris 2008.05 es una distribución en un solo CDque combina livecd e instalación en disco. OpenSolaris 2008.05 esta en sus primeras fases de desarrollo. Lasversiones actualmente liberadas no son totalmente estables. Incluye un kit para crear tu propia distribucióny es instalable en una llave USB.

Nexenta OS Es una distribución totalmente independiente a Sun y esta basado en GNU libre y de código abier-to, integra el kernel de OpenSolaris y un conjunto de aplicaciones Open Source. Es una distribución quecomparte la filosofía de a Ubuntu.

Belenix LiveCD basado en OpenSolaris que esta dando pasos en convertirse en una distribución completa. Apor-ta un conjunto de software OpenSource. Incluye scripts para crear tu propio livecd y se puede instalar yarrancar 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 enNevada Build 17.

5

Page 12: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

3.2 OpenGrok

OpenGrok es el motor de búsqueda de código fuente, con OpenGrok podemos descargar el fuente de OpenSolarisy examinar su código además de poder hacer modificaciones para realizar modificaciones al ya existente.

Para entrar en OpenGrok entre en la dirección: http://cvs.opensolaris.org/source

3.3 Las comunidades

Las comunidades son puntos de encuentro dentro de OpenSolaris.org donde puedes encontrar otras personas conlas mismas inquietudes sobre una tecnología o aplicación.

Hay comunidades alrededor de ZFS, DTrace, SMF, Virtualización etc..

Algunas de las comunidades:

Teoría e investigación: http://www.opensolaris.org/os/community/edu

DTrace: http://www.opensolaris.org/os/community/dtrace

ZFS : http://www.opensolaris.org/os/community/zfs

Redes: http://www.opensolaris.org/os/community/networking

Zonas: http://www.opensolaris.org/os/community/zones

Documentación: http://www.opensolaris.org/os/community/documentation

Controladores de dispositivos: http://www.opensolaris.org/os/community/device_drivers

Herramientas: http://www.opensolaris.org/os/community/tools

Impulsores: http://www.opensolaris.org/os/community/advocacy

Seguridad: http://www.opensolaris.org/os/community/security

Rendimiento: http://www.opensolaris.org/os/community/performance

Almacenamiento: http://www.opensolaris.org/os/community/storage

3.4 Proyectos

Los proyectos alojados en www.opensolaris.org albergan las contribuciones de código, documentos, gráficos oproductos de varios autores. Los proyectos disponen de espacio para alojar código.

3.5 Participa

Puedes participar en la comunidad OpenSolaris Hispano de formas diferentes y da igual tu nivel de experienciacon OpenSolaris.

Si eres principiante puedes desarrollar documentos y alimentar la Wiki:http://www.genunix.org/wiki/index.php/OpenSolarisHispano con el conocimiento que vas aprendien-do, tu aportación será muy útil para otros recién llegados.

Si eres desarrollador puedes participar bien proponiendo un proyecto o unirte a un proyecto de la comunidadpara participar en su desarrollo.

Si eres un usuario experimentado puedes participar impartiendo charlas, desarrollando documentación, ali-mentado la Wiki y ayudando a otros usuarios.

6 Capítulo 3. OpenSolaris

Page 13: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 4

Instalando OpenSolaris 2008.05

4.1 Novedades de OpenSolaris

OpenSolaris 2008.05 incorpora importantes novedades sobre sus antecesores inmediatos. Veamos algunas de ellas:

Solaris Service Manager Es una nueva infraestructura que viene a sustituir al clásico inicio secuencial de UnixSystem V. Esta nueva infraestructura permite arrancar los servicios de forma paralela acorde a sus relacionesde dependencia. Permite al administrador observar, deshabilitar, arrancar y parar de una manera sencilla yeficiente.

Solaris Containers Es una tecnología de virtualización que permite la ejecución de servicios y aplicaciones deforma totalmente aisladas.

ZFS (Solaris Zeta File System) Nuevo sistema de archivos de 128bits. Su capacidad de almacenamientos espracticante ilimitada. Su implantación y administración 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 núcleo y de losusuarios. Se compone de más de 30.000 sensores que aportan información sobre las aplicaciones asociadasa estos.

Image Packaging System Es el nuevo sistema de paquetes de OpenSolaris 2008.05 que permite la instalaciónde paquetes de repositorios de una forma sencilla resolviendo problemas como dependencias. IPS instalar,actualizar y eliminar aplicaciones.

Slim Install Un nuevo instalador que solo necesita de seis pasos para instalar OpenSolaris 2008.05.

Sun xVM Hypervisor (basado en el trabajo de la comunidad Xen permitiendo correr Solaris, GNU/Linux yWindows en máquinas virtuales)

4.2 Requisitos de Instalación

Antes de comenzar la instalación debemos comprobar si la máquina destino cumple con los requisitos demandadospor OpenSolaris 2008.05.

En la siguiente tabla podemos ver dichos requisitos mínimos:

Arquitectura X86 Mínimo necesariosMemoria 512MB recomendados.Espacio en disco 10GB

7

Page 14: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

4.3 Iniciando OpenSolaris 2008.05

El proceso de instalación de OpenSolaris 2008.05 esta basado en Slim Install que nos permitirá instalar el sistemade forma sencilla.

Resumimos la instalación en:

Arranque del LiveCD de OpenSolaris 2008.05.

Arrancar el instalador Slim Install e inicia la instalación.

Reiniciar.

4.4 Iniciando el LiveCD

Comenzamos el proceso de instalación arrancando desde CD con el LiveCD de OpenSolaris 2008.05, lo primeroque veremos será el gestor de arranque GRUB.

OpenSolaris 2008.05 comenzará a iniciarse y solicitará el idioma del teclado y del escritorio como podemos veren las siguientes capturas:

8 Capítulo 4. Instalando OpenSolaris 2008.05

Page 15: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Después de seleccionar el idioma continúa el arranque del sistema y procede a arrancar el escritorio GNOMEdonde nos muestra la licencia.

4.4. Iniciando el LiveCD 9

Page 16: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

10 Capítulo 4. Instalando OpenSolaris 2008.05

Page 17: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Una vez aceptada la licencia veremos el escritorio donde tenemos el sistema totalmente operativo en modo live,ahora tenemos que iniciar la instalación.

Para ello arrancamos el instalador identificado en el escritorio como “Install OpenSolaris“.

4.4. Iniciando el LiveCD 11

Page 18: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Escritorio Live-CD OpenSolaris 2008.05

Al arrancar nos mostrará el proceso de instalación que consiste en un volcado a disco de todo el sistema. Los pasosdel instalador son:

1. Pantalla de bienvenida.

2. Seleccionar el disco o partición donde vamos a instalar.

3. Seleccionar la zona horaria.

4. Introducimos la contraseña, creamos un usuario y damos nombre al sistema.

5. Inicia la instalación.

6. Finaliza y reinicio.

Veamos una captura de cada uno de los pasos:

12 Capítulo 4. Instalando OpenSolaris 2008.05

Page 19: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Pantalla de bienvenida, seleccionamos instalar o realizar un Upgrade.

4.4. Iniciando el LiveCD 13

Page 20: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Elegimos en que disco queremos instalar o usar una partición ya existente.

14 Capítulo 4. Instalando OpenSolaris 2008.05

Page 21: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Seleccionamos nuestra zona horaria, fecha y hora.

4.4. Iniciando el LiveCD 15

Page 22: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Seleccionamos el entorno regional.

16 Capítulo 4. Instalando OpenSolaris 2008.05

Page 23: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Creamos un usuario de sistema, damos contraseña al root y establecemos el nombre de la máquina.

4.4. Iniciando el LiveCD 17

Page 24: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Pantalla que muestra información de las opciones elegidas.

18 Capítulo 4. Instalando OpenSolaris 2008.05

Page 25: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

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:

4.4. Iniciando el LiveCD 19

Page 26: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

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 creadodurante el proceso de instalación. Después de introducir el usuario y contraseña tenemos disponible el sistema conel escritorio GNOME.

Con la instalación base dispones de tecnologías como Zonas, BrandZ, SMF, ZFS y DTrace y xVM Hypervisor(basado en XEN).

20 Capítulo 4. Instalando OpenSolaris 2008.05

Page 27: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 5

Arranque y Parada

5.1 Introducción

En este capitulo veremos el proceso arranque y parada de OpenSolaris 2008.05, los comandos necesarios parareiniciar y parar el sistema.

5.1.1 Parada y reinicio del sistema

Cuando finaliza el arranque de la máquina se encuentra en el nivel de ejecución multi-user-server o run level 3. Enocasiones hay que reiniciar el sistema para realizar tareas de mantenimiento como añadir hardware. A continuaciónveremos las diferentes formas de reiniciar y parar el sistema.

5.1.2 Reinicio de la máquina

Si deseamos realizar un reinicio del sistema y queremos emitir un mensaje personalizado avisando a los usuariosusaremos el comando shutdown que permite los siguientes parámetros:

shutdown -i niveldeejecución -g segundosdeespera "mensaje de aviso"

Ejemplo del uso de shutdown para reiniciar:

# /usr/sbin/shutdown -i 6 -g 360 "Aviso a los usuarios. El sistema sereiniciará en 60 segundos. Cierre sus aplicaciones."

Con -i indicamos el nivel de ejecución, con -g damos 360 segundos a los usuarios para cerrar sus aplicacionesy ficheros. Cuando finalicen los 360 segundos el sistema solicita la confirmación del reinicio al administrador:

# Do you want to continue? (y or n):

Para reiniciar el sistema también podemos ejecutar la orden reboot

# /usr/sbin/reboot

El comando reboot ejecuta una parada inmediata e inicia el sistema en el nivel 3 de ejecución ahora llamadomulti-user-server.

21

Page 28: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

5.1.3 Parada de la máquina

Para parar el sistema de forma ordenada y después realizar un apagado eléctrico de la máquina ejecutamos:

# /usr/sbin/shutdown -i 0 -g 360 "Aviso a los usuarios. El sistema sereiniciará en 60 segundos. Cierre sus aplicaciones."

Si la ejecutamos el comando en una máquina SPARC se quedara en la OpenBoot momento en el que podemosrealizar el apagado eléctrico ejecutando desde la OpenBoot el comando:

ok power-off

Si es una máquina x86 mostrara el siguiente mensaje:

Svcd.startd: The system is down.Syncing file systems...donePres any key to reboot.

Podemos pulsar cualquier tecla y reiniciar o realizar directamente el apagado eléctrico de la máquina.

Si necesitáramos parar la máquina de forma urgente podemos utilizar el comando halt que realizara una paradainmediata no ordenada:

# /usr/sbin/halt

Para una parada urgente no ordenada pero con parada eléctrica:

# /usr/sbin/poweroff

Para reiniciar el sistema podemos ejecutar la orden reboot que antes proceder al reinicio actualiza el superblo-que:

# /usr/sbin/reboot

5.2 Gestor de arranque GRUB (Grand Unified Bootloader)

5.2.1 Introducción a GRUB

GRUB es el nuevo gestor de arranque para arquitecturas x86 que añade nuevas posibilidades de arranque a Open-Solaris 2008.05. GRUB se inicia en el MBR ocupando tan solo 512 bytes y este pequeño código comienza la cargadel 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 ysoftware, pero sin duda viene a mejorar las posibilidades de Solaris y su integración con otros sistemas operativoscomo Linux. GRUB es un gran conocido dentro de la comunidad Linux por lo que facilita aun mas el acercamientode administradores Linux a Solaris. GRUB nos ofrece tres interfaces diferentes para el uso y configuración deGRUB:

Interfaz de Menú Es la primera que vemos cuando arranca GRUB y muestra una lista con todas las opcionesdisponibles para elegir con que sistema queremos arrancar. (ver figura 4.4)

Interfaz de Edición Permite la edición de las opciones de arranque establecidas para cada sistema operativoconfigurado. Un ejemplo es cambiar de forma temporal el kernel para realizar pruebas. (ver figura 4.3)

Interfaz de Línea de Comandos Es una pequeña shell que permite configurar GRUB, realizare pruebas de dis-positivos, red etc..

eprom OpenSolaris se integra con GRUB con el comando eprom al igual que lo hace con la OpenBoot en SPARC.

22 Capítulo 5. Arranque y Parada

Page 29: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

5.2.2 Opciones de arranque

Cuando arrancamos la máquina lo primero que nos muestra GRUB es la Interfaz de menú donde podemos elegirel sistema operativo. Esta interfaz se basa en un fichero de configuración que permite añadir nuevos sistemas omodificar los ya existentes. El fichero de configuración se encuentra en /boot/grub/menu.lst.

Cuando finalizamos la instalación de Solaris el archivo queda de la siguiente forma:

#---------- ADDED BY BOOTADM - DO NOT EDIT ----------title Solaris 11 11/06 s10x_u3wos_10 X86root (hd0,0,a)kernel /platform/i86pc/multibootmodule /platform/i86pc/boot_archive#---------------------END BOOTADM--------------------#---------- ADDED BY BOOTADM - DO NOT EDIT ----------title Solaris failsaferoot (hd0,0,a)kernel /boot/multiboot kernel/unix -smodule /boot/x86.miniroot-safe#---------------------END BOOTADM--------------------

Podemos establecer el fichero /boot/grub/menu.lst los siguientes parámetros:

default Contiene un valor numérico que se corresponde con la posición en la lista que muestra GRUB paraseleccionar una opción de arranque. Comienza con el valor 0, para arrancar por defecto con la opciónfailsafe estableceríamos el valor a 1.

timeout Son los segundos que esperara para que el usuario elegía una opción de arranque, si no interviene elusuario arrancara el sistema establecido por defecto con el valor default . Con valor -1 espera indefini-damente.

Para cambiar estos valores editamos el fichero menu.lst con cualquier editor de texto y cambiamos el valor enla línea donde aparece default o timeout:

## default menu entry to bootdefault 0## menu timeout in second before default OS is booted# set to -1 to wait for user inputtimeout 10

5.2. Gestor de arranque GRUB (Grand Unified Bootloader) 23

Page 30: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

24 Capítulo 5. Arranque y Parada

Page 31: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 6

Service Management Facility (SMF)

6.1 Introducción a SMF

OpenSolaris 2008.05 incorpora un nuevo sistema de gestión del arranque que ofrece nuevas posibilidades y op-timiza el arranque del sistema, este nuevo componente se llama SMF (Service Management Facility) y formaparte de una nueva infraestructura que viene a sustituir al clásico inicio secuencial de Unix System V. Esta nuevainfraestructura 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 unamanera sencilla y eficiente.

Características de SMF

Ofrece los mecanismos para establecer relaciones de dependencia entre servicios. Un servicio no arrancahasta que estén correctamente arrancadas sus dependencias.

Repositorio que contiene toda la información referente a la configuración del servicio, modos de arranque,parada, reinicio y el estado en el que se encuentra.

Log con información de eventos de cada servicio.

Cambios de niveles de ejecución a mono usuario, red, mantenimiento, etc.

Beneficios de SMF

Los servicios al ser objetos pueden ser vistos y gestionados con sencillos comandos de administración.

Se puede definir que SMF monitorice un proceso del servicio y tomar acciones si detecta que el proceso amuerto o hay un fallo hardware.

Delegar en otros usuarios el poder arrancar o parar servicios de esta forma no necesitamos utilidades comosudo o la cuenta de root.

Un servicio definido en SMF no tiene por que estari necesariamente asociado a un proceso que se este ejecutandoen el sistema, un servicio puede ser el estado de un dispositivo, de una tarjeta de red o de un sistema de ficheros.

6.1.1 Repositorio (Repository SMF)

Es la pieza principal y en el se almacena la configuración de cada servicio tanto en local como en memoria.También contiene el procedimiento para parar, arrancar y verificar un servicio. Cuando un servicio se ha iniciadocorrectamente en el arranque del sistema es guardada una foto de la configuración de dicho servicio con el objetivode saber cual es la configuración correcta en caso de tener que restaurar el servicio.

25

Page 32: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

6.1.2 SMF Restarters: svc.startd

Es el proceso que permite reiniciar un servicio en caso de fallo, para ello consulta el repositorio para identificar elmétodo 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 conla dependencia para restaurar el servicio.

6.1.3 SMF Service Instances

Un servicio puede estar compuesto a su vez por otra serie de servicios a los que se denominan instancias. Unejemplo seria un servidor web Apache con el servicio web escuchando por el puerto 80, otro seguro por el 443 yun tercero por el 8080. Para gestionar el servicio deberíamos crear el servicio web con tres instancias.

6.1.4 Componentes de un servicio SMF

Un servicio en SMF esta formado por un conjunto de componentes que interactúan entre si. Veamos cada uno deestos componentes:

SMF manifiest Es un fichero XML en el que se definen las características de un servicio o una instancia delservicio. Los ficheros XML con las propiedades de los servicios se almacenan en /var/svc/manifest.Estos ficheros son cargados en el repositorio SMF.

Methods Los métodos 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 métodos de arranque, parada o reinicio de unservicio. Los métodos son almacenados en /lib/svc/method.

Service Log Files Es un servicio que escribe un log con todo los datos sucesos sobre un servicio, los logs seencuentran en /var/svc/log.

Service Identifiers 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 elsistema.

6.1.5 Estados de un servicio SMF

Los servicios pueden tener varios estados en los que podemos ver si el servicio esta parado, arrancado, degradadoo en mantenimiento.

Anteriormente se utilizaba el comando “ps -ef” para ver si un servicio estaba arrancado, ahora podemos utilizarlos comandos de SMF para ver el estado del servicio además de poder continuar haciéndolo con el comando “ps-ef” 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.

offline La instancia del servicio esta disponible pero no esta ejecutandose.

disabled La instancia del servicio no esta disponible y no esta ejecutándose.

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 límite de su capacidad.

uninitialized Este es el estado inicial de todos los servicios antes de iniciar su ejecución.

legacy_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 SMFson se pueden editar.

26 Capítulo 6. Service Management Facility (SMF)

Page 33: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

6.1.6 Dependencias

Cuando definimos un servicio podemos definir dependencias, estableciendo que no arranque el servidor Apachehasta que no este arrancado el sistema en multiusuario (run level 3) y la bbdd MYSQL iniciada. Para cada serviciopodemos establecer desde ninguna a varias dependencias.

Veamos las propiedades que podemos definir para las dependencias:

require_all Todos los servicios de la dependencia deben estar online (arrancados) antes de iniciar el servicio.

require_any Es suficiente con que uno de los servicios de la dependencia se ejecute para que el servicio seinicie.

optional_all Si los servicios de la dependencia están disponibles y pueden ejecutarse deben estar online odegraded antes de la ejecución del servicio. Si están en mantenimiento el servicio no arrancara.

exclude_all Significa que no todos los servicios de la dependencia deben estar corriendo para hincar elservicio.

6.1.7 Proceso de arranque con SMF

En arranque de Solaris se realiza como en versiones anteriores y el proceso init continua siendo el primer procesodel 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 conectarcon el repositorio SMF que reside en /etc/svc/repository.db. El repositorio tiene la propiedad de autorecuperarse si se producen daños ya que siempre mantiene una copia de respaldo. (ver figura 3.1)

Los primeros errores producidos durante la ejecución de SMF bien del repositorio o con problemas de inicio deun servicio se escriben en el directorio /etc/svc/volatile (montado en memoria) ya que todavía no estamontado o disponible “/var“, una vez sea accesible “/var” los logs son escritos en la ruta predeterminada“/var/svc/log“.

Nota: Si estás viendo esta nota es porque todavía no he hecho algo parecido a la figura 3.1 que puedes encontraren la version original.

6.1.8 Milestone Services

Con la llegada de SMF también se ha redefinido la forma de poner la máquina en diferentes niveles de ejecución.Los niveles de ejecución mas conocidos son sigle user y multi user. Ahora se les denomina milestone. Milestoneno es más que un servicio especial de SMF que agrupa las dependencias necesarias para establecer un nivel deejecución.

Se han añadido dos nuevos niéveles de ejecución: none que no ejecuta ningún servicio y all en el que se ejecutantodos los servicios disponibles.

Las equivalencias al sistema tradicional son las reflejadas en la siguiente tabla:

SMF Milestone Run Level Run Levelmilestone single-user Smilestone multi-user 2milestone multi-user-server 3milestone all 3milestone none No exite

Para pasar de un nivel de ejecución a otro podemos realizarlo sin problemas de la manera tradicional con elcomando init y el número del nivel de ejecución al que queremos pasar o con el comando svcadm de lasiguiente forma:

Pasar a single-user:

6.1. Introducción a SMF 27

Page 34: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

# 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 ejecutándose el sistema lanzamos el siguiente comando:

# svcprop svc:/system/svc/restarter:default | grep -i milestoneoptions_ovr/milestone astring svc:/milestone/multi-user-server:default

Podemos ver que el sistema se encuentra en el nivel de ejecución multi-user-server. Si la ejecución delcomando no muestra nada en pantalla significa que estemos en el nivel de ejecución all.

Un milestone es un servicio tiene definidas dependencias de otros servicios, por ejemplo el servicio multi-userdepende de los servicios de red. Obervando las dependencias de cada nivel de ejecución podemos averiguar queservicios 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-userSTATE STIME FMRIdisabled 12:52:37 svc:/system/auditd:defaultdisabled 12:52:37 svc:/application/print/server:defaultdisabled 12:52:37 svc:/network/ntp:defaultdisabled 12:52:39 svc:/system/mdmonitor:defaultdisabled 12:52:39 svc:/system/rcap:defaultonline 12:52:42 svc:/milestone/name-services:defaultonline 12:52:54 svc:/system/rmtmpfiles:defaultonline 12:52:55 svc:/system/power:defaultonline 12:52:55 svc:/system/name-service-cache:defaultonline 12:53:01 svc:/milestone/single-user:defaultonline 12:53:04 svc:/system/filesystem/local:defaultonline 12:53:04 svc:/system/cron:defaultonline 12:53:06 svc:/network/rpc/bind:defaultonline 12:53:09 svc:/platform/i86pc/kdmconfig:defaultonline 12:53:09 svc:/milestone/sysconfig:defaultonline 12:53:10 svc:/network/inetd:defaultonline 12:53:11 svc:/system/utmp:defaultonline 12:53:24 svc:/network/nfs/client:defaultonline 12:53:25 svc:/system/filesystem/autofs:defaultonline 12:53:26 svc:/system/system-log:defaultonline 12:53:26 svc:/system/system-log:defaultonline 12:53:26 svc:/network/smtp:sendmail

Como se puede ver el número de servicios que ejecuta multi-server es muy superior al single-user que norequiere de tantos servicios como podemos ver en el ejemplo:

bash-3.00# svcs -d milestone/single-userSTATE STIME FMRIdisabled 12:52:32 svc:/system/metainit:defaultonline 12:52:39 svc:/network/loopback:defaultonline 12:52:48 svc:/milestone/network:defaultonline 12:52:49 svc:/system/identity:nodeonline 12:52:51 svc:/system/keymap:default

28 Capítulo 6. Service Management Facility (SMF)

Page 35: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

online 12:52:52 svc:/system/filesystem/minimal:defaultonline 12:52:54 svc:/system/cryptosvc:defaultonline 12:52:55 svc:/system/sysevent:defaultonline 12:52:56 svc:/milestone/devices:defaultonline 12:53:00 svc:/system/manifest-import:default

6.1.9 Gestión de los servicios con SMF

A continuación vamos a ver los comandos que tiene SMF para la monitorizar el estado de los servicios, obte-ner información de un servicio y como parar o arrancar servicios. El conjunto de comandos que nos permite laadministración de SMF son:

svcs Proporciona información sobre el estado de un servicio y sus dependencias:

svcadm Permite realizar acciones administrativas como cambiar el estado de un servicio.

svccfg Tiene la función de crear nuevos servicios a partir de un fichero xml y modificar las propiedades de unservicio.

svcprop Obtenemos y cambiamos valores de la bbdd sobre un servicio.

6.2 Obtener información de los servicios (svcs)

Los servicios SMF están organizados en grupos con los siguientes nombres:

Application: Contiene los servicios asociados con aplicaciones. Device: Usado para las dependencias. Milestone:Equivalente a los niveles de ejecución SVR4. Network: Todos los servicios del antiguo inetd.conf. Platform:Servicios específicos de la plataforma. System: Servicios independientes de la plataforma. Site: Sin uso, reservadopara uso futuro.

El siguiente ejemplo muestra el grupo al que pertenece el servicio de telnet:

# svcs -a | grep telnetdisabled Dec_28 svc:/network/telnet:default

Como se puede observar pertenece a /network.

6.2.1 Ver el estado de un servicio

Para ver el estado todos los servicios recurrimos al comando svcs que en ejemplo lo ejecutamos con la opción-a para que muestre todos los servicios independientemente de su estado:

# svcs -aSTATE STIME FMRIlegacy_run 10:10:30 lrc:/etc/rcS_d/S50sk98sollegacy_run 10:10:31 lrc:/etc/rcS_d/S51installupdateslegacy_run 10:10:55 lrc:/etc/rc2_d/S10lulegacy_run 10:10:56 lrc:/etc/rc2_d/S20sysetuplegacy_run 10:10:56 lrc:/etc/rc2_d/S40llc2legacy_run 10:10:56 lrc:/etc/rc2_d/S42ncakmodlegacy_run 10:10:56 lrc:/etc/rc2_d/S47pppdlegacy_run 10:10:56 lrc:/etc/rc2_d/S70uucplegacy_run 10:10:56 lrc:/etc/rc2_d/S72autoinstalllegacy_run 10:10:59 lrc:/etc/rc2_d/S73cachefs_daemonlegacy_run 10:10:59 lrc:/etc/rc2_d/S81dodatadm_udaplt...........online 10:10:49 svc:/network/ftp:defaultonline 10:10:49 svc:/network/finger:default

6.2. Obtener información de los servicios (svcs) 29

Page 36: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

online 10:10:50 svc:/network/ssh:defaultonline 10:10:50 svc:/system/dumpadm:defaultonline 10:10:51 svc:/system/system-log:defaultonline 10:10:51 svc:/network/login:rloginonline 10:10:51 svc:/network/shell:defaultonline 10:10:52 svc:/network/rpc-100235_1/rpc_ticotsord:defaultonline 10:10:53 svc:/network/smtp:sendmail

En el ejemplo podemos observar el servicio legacy_run utilizado para guardar la compatibilidad con las prac-ticas administrativas de versiones anteriores de Solaris. Del servicio legacy_run solo se puede consultar suestado y no podemos realizar cambios sobre el.

Si añadimos un servicio de la forma tradicional con un script en el directorio ined.d y el enlace en el rc*correspondiente funcionara con normalidad viéndolo en el SMF como un servicio legacy_run.

En OpenSolaris 2008.05 no es recomendable seguir utilizando el viejo sistema para añadir servicios al arranquedebiendo utilizar SMF.

También podemos observar que los servicios tradicionales como ftp y ssh están en estado online.

6.2.2 Ver las dependencias de un servicio

Para ver las dependencias de un servicio, es decir que servicios tienen que estar arrancados para que pueda ejecu-tarse utilizamos el comando svcs con la opción -d.

Veamos el ejemplo:

# svcs -d svc:/network/http:apache2STATE STIME FMRIonline 10:10:12 svc:/milestone/network:defaultonline 10:10:33 svc:/system/filesystem/local:defaultonline 10:10:48 svc:/system/filesystem/autofs:default

En el ejemplo de la figura 3.2 vemos que para que pueda ejecutarse el servicio web Apache 2 necesitamos queestén levantados los servicios network, y filesystem.

6.2.3 Procesos asociados a un servicio

Para averiguar que procesos están asociados a un servicio ejecutamos el comando svcs con la opción -p. Elresultado de la ejecuión produce la siguiente salida:

# svcs -p svc:/network/smtp:sendmailSTATE STIME FMRIonline 10:10:53 svc:/network/smtp:sendmail

10:10:54 334 sendmail10:10:54 341 sendmail

En el ejemplo de la figura 3.3 podemos ver los pid asociados al servicio sendmail aunque podemos averiguarlotambien de la forma tradicional con la orden ps -ef | grep sendmail.

6.2.4 Obtener información detallada de un servicio

SMF puede aportar información detallada de un servicio como su nombre, si esta habilitado, su propio estado ylas dependencias.

Ejecutamos svcs con el parámetro -l

30 Capítulo 6. Service Management Facility (SMF)

Page 37: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

# svcs -l svc:/network/http:apache2fmri svc:/network/http:apache2nombre Apache 2 HTTP serverhabilitada Falsoestado disablednext_state nonestate_time Thu Dec 28 10:10:08 2006reiniciador svc:/system/svc/restarter:defaultdependency 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)

6.2.5 Diagnostico de fallos

SMF con el comando svcs puede aportarnos información sobre la causa de porque un servicio no puede arrancar,para ellos utilizamos el comando svcs con el parámetro -x. Para este ejemplo hemos deshabilitado manualmenteel servicio de apache.

Veamos el resultado del diagnostico:

# svcs -x svc:/network/http:apache2svc:/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-05Consulte: httpd(8)

Impacto: Este servicio no está funcionando.

La salida del comando nos indica que el servicio fue parado por un administrador, en que momento lo hizo y elimpacto sobre el servicio.

También nos remite a una url de Sun donde se nos amplia información sobre la causa por la que no esta arrancadoel servicio. Sea cual sea el error siempre nos dará una url para obtener información que nos ayude a diagnosticary solucionar el problema.

6.3 Cambios de estado de un servicio (svcadm)

6.3.1 Parada de un servicio

Para parar un servicio utilizamos el comando svcadm con los parámetros disable y -t seguido del nombre deservicio:

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 queno hay procesos de apache2 ejecutándose.

El resultado es el siguiente:

# svcs -p svc:/network/http:apache2STATE STIME FMRIdisabled 12:20:21 svc:/network/http:apache2ps -ef | grep -i apache2

root 1549 1444 0 12:22:51 pts/4 0:00 grep -i apache2

La opción -t estipula que es una para temporal si olvidamos poner el parámetro -t en el próximo arranque de lamáquina el servicio no arrancara quedando en disable.

6.3. Cambios de estado de un servicio (svcadm) 31

Page 38: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

6.3.2 Arrancar un servicio

Para arrancar un servicio utilizamos el comando svcadm con los parámetros enable y -t seguido del nombrede servicio:

# svcadm enable -t svc:/network/http:apache2

Y verificamos que ha arrancado correctamente:

# svcs -p svc:/network/http:apache2STATE STIME FMRIonline 12:31:23 svc:/network/http:apache2

12:31:23 1559 httpd12:31:24 1560 httpd12:31:24 1561 httpd12:31:24 1562 httpd12:31:24 1563 httpd12:31:24 1564 httpd

Tal como podemos ver en la figura 3.3 el servicio ha arrancado correctamente y podemos ver todos los pid de losprocesos en ejecución.

6.3.3 Reiniciar un servicio

Hasta el momento si queríamos reiniciar un servicio como por ejemplo ssh acudíamos a ejecutar:

/etc/init.d/sshd stop; /etc/init.d/sshd start

Ahora ejecutamos el comando svcs con la opción restart

# svcadm restart svc:/network/http:apache2

Y verificamos que los procesos han cambiado de pid:

# svcs -p svc:/network/http:apache2STATE STIME FMRIonline 12:37:27 svc:/network/http:apache2

12:37:27 1577 httpd12:37:28 1578 httpd12:37:28 1579 httpd12:37:28 1580 httpd12:37:28 1581 httpd12:37:28 1582 httpd

6.4 Ver la configuración de un servicio

Si deseamos saber los valores de las propiedades de un servicio disponemos del comando svcprop que extraedicha información del repositorio. Como ejemplo vamos a averiguar que método esta definido para arrancar elservicio apache2.

Ejecutamos primeramente el comando svcprop y el nombre del servicio para obtener una lista de las propiedadesdefinidas:

# svcprop svc:/network/http:apache2httpd/ssl boolean falsehttpd/stability astring Evolvingnetwork/entities fmri svc:/milestone/network:default

32 Capítulo 6. Service Management Facility (SMF)

Page 39: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

network/grouping astring require_all...............general/entity_stability astring Evolvingstart/exec astring /lib/svc/method/http-apache2\ startstart/timeout_seconds count 60start/type astring methodstop/exec astring /lib/svc/method/http-apache2\ stopstop/timeout_seconds count 60stop/type astring methodrefresh/exec astring /lib/svc/method/http-apache2\ refreshrefresh/timeout_seconds count 60refresh/type.......................restarter/state_timestamp time 1167305847.133954000general_ovr/enabled boolean truerestarter_actions/restart integer

En el ejemplo de la figura 3.4 podemos ver una lista con todas las propiedades del servicio, para nuestro ejemplonos centramos en la línea que pone:

start/exec astring /lib/svc/method/http-apache2\ start

Esta línea muestra el fichero que ejecuta el arranque del apache 2 que es /lib/svc/method/http-apache2pasándole el parámetro start.

Podemos ver el contenido del script realizando un more sobre /lib/svc/method/http-apache2.

Si queremos obtener datos formateados sobre una de las propiedades ejecutamos:

svcprop -p nombredelapropiedad nombredelservicio

En la figura 3.5 muestra la información sobre los valores de la propiedad start/exec ystart/timeout_seconds:

# svcprop -p start/exec svc:/network/http:apache2/lib/svc/method/http-apache2\ start# svcprop -p start/timeout_seconds svc:/network/http:apache260#

6.5 inetd como servicio SMF

El proceso inetd ha sido migrado completamente como un servicio SMF, ya no es necesario editar el fichero/etc/inet/inetd.conf 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 kill el proceso inet.d.

6.5.1 Ver servicios de inetd

Para ver todos los servicios del proceso inetd y el estado en el que se encuentran ejecutamos el comando inetadmy pulsamos intro:

# inetadmENABLED STATE FMRIenabled online svc:/application/x11/xfs:defaultenabled online svc:/application/font/stfsloader:default

6.5. inetd como servicio SMF 33

Page 40: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

enabled offline svc:/application/print/rfc1179:defaultenabled online svc:/network/rpc/mdcomm:defaultenabled online svc:/network/rpc/meta:defaultenabled online svc:/network/rpc/metamed:defaultenabled online svc:/network/rpc/metamh:defaultenabled online svc:/network/rpc/gss:default..........................enabled online svc:/network/ftp:defaultdisabled disabled svc:/network/comsat:defaultenabled online svc:/network/finger:defaultdisabled disabled svc:/network/login:eklogindisabled disabled svc:/network/login:kloginenabled online svc:/network/login:rlogindisabled disabled svc:/network/shell:kshelldisabled disabled svc:/network/talk:default

6.5.2 Deshabilitar un servicio inetd

Al ser un servicio mas de SMF recurrimos al comando svcadm y el parámetro disable. Ejemplo para nopermitir conexiones telnet:

Con la opción -t se volverá a habilitar el servicio al reiniciar la máquina:

# svcadm disable -t svc:/network/telnet:default

Sin la opción -t el cambio es permanente:

# svcadm disable svc:/network/telnet:default

6.5.3 Ver el valor de un servicio inetd

En versiones anteriores si queríamos cambiar un valor al servicio ftp editábamos la línea y cambiamos los valoresen el propio fichero. Con SMF es mas sencillo ya las propiedades están almacenadas en el repositorio. Antes deutilizar SMF editábamos la siguiente línea 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 ejecución para ver los valores del servicio ftp:

# inetadm -l ftpSCOPE NAME=VALUE

name="ftp"endpoint_type="stream"proto="tcp6"isrpc=FALSEwait=FALSEexec="/usr/sbin/in.ftpd -a"user="root"

default bind_addr=""default bind_fail_max=-1default bind_fail_interval=-1default max_con_rate=-1default max_copies=-1

34 Capítulo 6. Service Management Facility (SMF)

Page 41: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

default con_rate_offline=-1default failrate_cnt=40default failrate_interval=60default inherit_env=TRUEdefault tcp_trace=FALSEdefault tcp_wrappers=FALSE

6.5.4 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 parametroacambiar=nuevovalor

La ejecución del comando para cambiar el valor wait=FALSE del servicio ftp a valor wait=TRUE sería:

inetadm -m ftp wait=TRUE

y lo verificamos con:

# inetadm -l ftpSCOPE NAME=VALUE

name="ftp"endpoint_type="stream"proto="tcp6"isrpc=FALSEwait=TRUEexec="/usr/sbin/in.ftpd -a"user="root"

default bind_addr=""default bind_fail_max=-1default bind_fail_interval=-1default max_con_rate=-1default max_copies=-1default con_rate_offline=-1default failrate_cnt=40default failrate_interval=60default inherit_env=TRUEdefault tcp_trace=FALSEdefault tcp_wrappers=FALSE

6.5.5 Cambios en inetd.conf

El fichero /etc/inet/inetd.conf no puede sufrir cambios ya que toda la gestión recae sobre SMF pero encaso de producirse un cambio voluntario o por una aplicación el sistema nos alertara en /adm/messages queel fichero ha sido modificado para que el administrador determine su naturaleza:

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

6.5.6 Convertir un servicio de inetd.conf a SMF

En OpenSolaris 2008.05 se han migrado todos los demonios del fichero /etc/inet/inetd.conf, pero sinecesitamos añadir posteriormente un servicio contamos con la utilidad inetconv.

El procedimiento es el siguiente:

6.5. inetd como servicio SMF 35

Page 42: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

1. Creamos los directorio temporales:

1. /tmp/nuevoservicio

2. /tmp/destinoXML

1. Creamos en el directorio /tmp/nuevoservicio un fichero llamado migracion.conf que contengael nuevo demonio del servicio usando la sintaxis del fichero /etc/inetd.conf. Para nuestro ejemplohemos creado el fichero con la siguiente línea:

tftp dgram udp6 wait root /usr/sbin/in.tftpd in.tftpd-s /tftpboot

2. Ejecutamos el comando:

# inetconv -i /tmp/nuevoservicio/migracion.conf -n -o /tmp/destinoXML

3. En el directorio /tmp/destinoXML encontraremos un nuevo fichero con extensión .XML al que le hadado el nombre de tftp-udp6.xml para ser cargado en el repositorio.

4. Cargamos la nueva configuración en el repositorio con el comando svcconfig.

Ejecutamos el comando:

# svccfg import /tmp/destinoXML/tftp-udp6.xml

Verificamos que ha sido cargado con:

# svcs -a | grep -i tftponline 12:39:09 svc:/network/tftp/udp6:default

Ya podemos gestionar el servicio svc:/network/tftp como un servicio mas de SMF.

6.6 Crear un nuevo servicio SMF

Para crear un nuevo servicio SMF debemos definir un nuevo SMF manifiest que es fichero XML que contiene losmétodos para arrancar, parar, reiniciar, definición de dependencias, documentación etc..

Recordemos que los servicios SMF están organizados en grupos con los siguientes nombres:

Application: Contiene los servicios asociados con aplicaciones. Device: Usado para dispositivos. Milestone:Equivalente a los niveles de ejecución SVR4 Network: Todos los servicios del antiguo inetd.conf Platform:Servicios específicos de la plataforma. System: Servicios independientes de la plataforma Site: Sin uso, reservadopara 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 métodos de arranque, parada y reinicio.

4. Ubicación de la documentación.

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 Server6 para ello recopilamos la siguiente información:

36 Capítulo 6. Service Management Facility (SMF)

Page 43: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Vamos a crear el servicio dentro del grupo Application y a su vez dentro de un nuevo sub-grupo definido por nosotros llamado servidoresweb y finalmente el identificador del servicio Au-laUnix que se corresponde con el servidor web Sun One. Quedando se la siguiente forma:/application/servidoresweb/AulaUnix.

Definimos como dependencia el nivel de ejecución 3 o multi-user-server.

Los scripts de arranque, parada y reinicio son:

• /software/binarios/webserversunone/https-aulaunix.aulaunix.org/start

• /software/binarios/webserversunone/https-aulaunix.aulaunix.org/stop

• /software/binarios/webserversunone/https-aulaunix.aulaunix.org/restart

La documentación la ubicamos en /software/documentacion.

6.6.1 Creación del XML

En el ejemplo de la figura 3.6 podemos ver un XML completo en el que se define el servicio/application/servidoresweb/AulaUnix.

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 unidentificador:

<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.

En el siguiente se establece a que grupo pertenece y se define un subgrupo para albergar los servidores web:

<servicename=’application/servidoresweb/AulaUnix’

type=’service’version=’1’>

El nombre definido con name= será el que nos muestre el comando svcs cuando verifiquemos el estado delservicio. Debe ser un nombre sencillo y que permita identificar los servicios de forma practica. En este casohemos optado por organizar todos los servidores web por debajo de servidoresweb.

La propiedad de la figura 3.6 create_default_instance nos permite dos valores false y true con losque indicamos que el servicio se inicie o se detenga con las paradas y arranques del sistema. Anteriormente estolo hacíamos con los scripts dentro del run revel correspondiente pondiendo la S deltante del nombre para arrancaro la K para parar el servicio:

<create_default_instance enabled=’false’ />

Con <single_instance/> estamos definiendo una sola instancia, un servicio puede estar compuesto a suvez por otra serie de servicios a los que se denominan instancias. Un ejemplo seria un servidor web Apache conel servicio web escuchando por el puerto 80, otro seguro por el 443 y un tercero por el 8080. Para gestionar elservicio deberíamos crear el servicio web con tres instancias. Para nuestro ejemplo solo vamos el servicio con unasola instancia.

Tenemos que crear las dependencias para que solo arranque el servicio si están funcionando correctamente to-dos los servicios del nivel de ejecución 3. Podemos crear tantas dependencias como sean necesarias haciendoreferencia 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>

6.6. Crear un nuevo servicio SMF 37

Page 44: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Ya hemos definido las dependencias y ahora vamos a crear los métodos para arrancar, reiniciar y parar. Comovemos en el ejemplo de la figura 3.6 con la opción name= establecemos el valor start para arrancar, stop paraparar y restart para reiniciar.

Los métodos definidos se ejecutaran cuando llamemos al comando svcadm de la siguiente forma:

svcs Métodosvcadm enable nombredelservicio startsvcadm disable nombredelservicio stopsvcadm restart nombredelservicio restart

El valor de exec= contiene la ruta absoluta al script o binario que se ejecutara y con time timeout_secondsdefinimos los segundos que esperara SMF como limite para el arranque:

<exec_methodtype=’method’name=’start’exec=’/software/binarios/webserversunone/https-aulaunix.aulaunix.org/start’timeout_seconds=’30’ ></exec_method>

Ya tenemos creados los métodos y nos queda definir la información sobre la documentación del servicio en laetiqueta <documentation> donde establecemos el valor para manpage title con el titulo de la documen-tación y del valor manpath con el path absoluto del lugar donde se encuentra la máquina:

<documentation><manpage title=’Documentos Web Server’ section=’1M’manpath=’/software/documentacion’ /></documentation>

6.6.2 Importando el servicio en XML a SMF

Ya tenemos creado el fichero XML y nos queda cargarlo en el repositorio para poder ser gestionado. La carga enel repositorio la realizamos con el comando svccfg ejecutando la siguiente sentencia: svccfg -v importfichero.xml:

# svccfg -v import aulaunix.xmlsvccfg: Tomando captura "previous" desvc:/application/servidoresweb/AulaUnix:default.svccfg: Actualización de propiedades de svc:/application/servidoresweb/AulaUnix deacuerdo con la instancia "default".svccfg: svc:/application/servidoresweb/AulaUnix: Actualizando propiedad"tm_man_Documentos_Web_Server/manpath".svccfg: Tomando captura "last-import" parasvc:/application/servidoresweb/AulaUnix:default.svccfg: svc:/application/servidoresweb/AulaUnix:default actualizado.svccfg: Importación finalizada con éxito.

Y verificamos que ha cargado correctamente ejecutando:

# svcs -l svc:/application/servidoresweb/AulaUnixfmri svc:/application/servidoresweb/AulaUnix:defaultnombre Servicio SMF de ejemplo sobre SunONEhabilitada Falsoestado disablednext_state nonestate_time Tue Jan 02 17:56:41 2007reiniciador svc:/system/svc/restarter:defaultdependency require_all/none svc:/milestone/multi-user-server (online)

38 Capítulo 6. Service Management Facility (SMF)

Page 45: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Podemos ver las propiedades correctamente, el nombre es svc:/application/servidoresweb/AulaUnixtal como hemos definido en el XML y su estado es disabled.

El servicio ya esta disponible para gestionarlo con SMF. Verificamos el método start arrancando el servidorweb con el comando svcadm:

# svcadm enable svc:/application/servidoresweb/AulaUnix# svcs | grep -i aulaonline 10:41:16 svc:/application/servidoresweb/AulaUnix:default# svcs -p svc:/application/servidoresweb/AulaUnix:defaultSTATE STIME FMRIonline 10:41:16 svc:/application/servidoresweb/AulaUnix:default

10:41:06 3986 webservd-wdog10:41:06 3987 webservd10:41:07 3988 webservd

Podemos verificar el servidor web con ps -ef o ejecutando el comando svcs -p que nos mostrara los procesosy su pid asociados al servicio.

6.6.3 Modificar y eliminar un servicio SMF

Para modificar las propiedades de un servicio SMF es suficiente con modificar el fichero XML con los nuevosdatos y realizar la importación al repositorio con el comando svccfg

# svccfg -v import aulaunix.xml

Para eliminar un servicio del repositorio ejecutamos la orden: svcfg 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 descar-garlo 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 Galandgalan@aulaunix.orgwww.aulaunix.orgwikilaris.aulaunix.orgblog.aulaunix.org

--><service_bundle type=’manifest’ name=’SunOneWebAulaunix’><service

name=’application/servidoresweb/AulaUnix’type=’service’version=’1’><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’ >

6.6. Crear un nuevo servicio SMF 39

Page 46: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

</exec_method><exec_method

type=’method’name=’stop’exec=’/software/binarios/webserversunone/https-

aulaunix.aulaunix.org/stop’timeout_seconds=’60’ />

<exec_methodtype=’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>

6.7 Delegar la gestión de SMF a otros usuarios

En algún momento puede surgir la necesidad de delegar la gestión de un servicio a otro usuario del sistema parapoder arrancar, parar y reiniciar servicios.

En nuestro ejemplo vamos a dar permisos al usuario aulaunix para que pueda gestionar el servidor web. El primerpaso es añadir al servicio el atributo value_authorization utilizando el comando svcprop

svccfg -s /application/servidoresweb/AulaUnix setprop general/value_authorization = astring: solaris.smf.manage

Ahora añadimos al fichero /etc/user_attr la siguiente línea 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

$ /usr/sbin/svcadm disable /application/servidoresweb/AulaUnix$ /usr/sbin/svcadm enable /application/servidoresweb/AulaUnix

Si deseamos quitarle los permisos para que no pueda continuar gestionando el servicio ejecutamos el comandosvcprop para eliminar la propiedad value_authorization:

# svccfg -s /application/servidoresweb/AulaUnix delpropgeneral/action_authorization

40 Capítulo 6. Service Management Facility (SMF)

Page 47: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 7

Gestión de Usuarios

Las cuentas de usuario para el acceso al sistema no difieren en Solaris de otros sistemas unix, en el siguientecapitulo aprenderemos a:

Identificar los ficheros de configuración de usuarios

Gestión de usuarios (alta, modificación y borrado)

Gestión de grupos (alta, modificación y borrado)

Gestionar usuarios en grupos (alta, modificación y borrado)

Ficheros de inicialización

7.1 Ficheros de configuración

Los ficheros de configuración contienen la información sobre las cuentas de usuario, los grupos y contraseñas.Los ficheros son:

7.1.1 /etc/passwd

Cada una de las líneas del fichero contiene la información de un usuarios. Cada línea esta organizada en camposseparados por el carácter dos puntos que hace de separador de campo. Ejemplo de una línea del fichero passwd

aulaunix:x:65535:1:Nombre y apellidos:/export/home/aulaunix:/bin/bash

El formato tiene la siguiente estructura: IDlogin:x:UID:GID:comentario:home_directory:login_shell

Estos campos son:

IDlogin es el identificador con el que hacemos login en el sistema debe de ser único.

Contraseña la contraseña representada por x es almacenada en el fichero /etc/shadow.

UID esta representado por un número superior a 0 ya que 0 pertenece al usuario root. Los números del 1 al 99están reservados para usuarios administradores del sistema. Para el resto de usuarios se utiliza el rango del100 al 60000. Se reserva para el usuario nobody el 60001 y para el usuario noaccess el 60002.

GID número mayor de 0 que representa el grupo primario al que pertenece el usuario.

Comentario Nombre completo del usuario.

Directorio home (home_directory): ruta absoluta del directorio home para el usuario.

Shell (login_shell): Define la shell para el usuario (sh, ksh, csh, etc..)

41

Page 48: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

7.1.2 /etc/shadow

Contiene las contraseñas de las cuentas de usuario, al ser un fichero que puede comprometer la seguridad delsistema solo el usuario root debe de tener permisos de lectura para el archivo. El contenido del archivo es elsiguiente:

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::::::

El formato tiene la siguiente estructura: IDlogin:pwd:lastchg:min:max:warn:inactivo:expiracion:

Los datos que contiene cada línea del fichero shadow son:

IDlogin: identificador de entrada al sistema.

pwd: contraseña del usuario cifrada.

lastchg: días transcurridos entre el 11 de enero de 1970 y la ultima fecha de modificación.

min: establece el mínimo número de días antes de cambiar la contraseña.

max: establece el máximo numero de días que una contraseña esta activa.

warn: el número de días de antelación para el aviso al usuario de la expiración de la contraseña-

inactive: días que puede estar la cuenta inactiva (sin entradas al sistema) antes de bloquearse.

expiracion: Fecha de expiración de la cuenta.

7.1.3 /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 más grupos disponibles en el sistema denominados grupos secun-darios definidos en el fichero /etc/group. El siguiente ejemplo muestra las entradas por defecto en el ficherogroup

root::0:other::1:rootbin::2:root,daemonsys::3:root,bin,admadm::4:root,daemonuucp::5:rootmail::6:roottty::7:root,admlp::8:root,admnuucp::9:rootstaff::10:daemon::12:root

42 Capítulo 7. Gestión de Usuarios

Page 49: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

sysadmin::14:smmsp::25:gdm::50:webservd::80:postgres::90:nobody::60001:noaccess::60002:nogroup::65534:

El formato tiene la siguiente estructura: nonmbredelgrupo:group-password:GID:listausuarios.

Los datos que contiene cada línea del fichero group son:

nonmbredelgrupo: contiene el nombre del grupo.

group-password: Utilizado en versiones mas antiguas de unix. Actualmente no es utilizado.

GID: número que identifica al grupo y debe único en el sistema.

listausuarios: contiene la lista de usuarios separados por coma que pertenecen al grupo.

7.2 Gestión de Usuarios

7.2.1 Crear usuario

El comando empleado para crear usuarios es useradd con las siguiente sintaxis:

useradd [-u uid] -g [gid] -G [gid1,gid2, ...] [-d dir] -m [-s shell] [-c comment] [-e expire] usuario

Los parámetros admitidos son los siguientes:

-u define un uid único para el usuario.

-g define el grupo primario al que va a pertenecer el usuario.

-G 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 creación 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 duplicación del uid del usuario.

-e fecha de expiración de la cuenta.

-f tiempo máximo admitido de inactividad para la cuenta. Si el usuario no entraen el sistema en el tiempo establecido la cuenta se bloquea.

-k permite la copia de archivos de inicialización personalizados al home delusuario al crearlo.

7.2.2 Ejemplo de uso de useradd

Crear usuario:

El siguiente ejemplo muestra como crear el usuario aula, definir su UID manualmente e incluirlo en el grupoalumnos definiendo su home en /export/home/aulaunix, definimimos la shell como ksh.

Ejecución del comando:

7.2. Gestión de Usuarios 43

Page 50: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

# useradd -u 109 -g alumnos -d /export/home/aulaunix -m -s /bin/ksh -c “usuario de pruebas” aula

Inmediatamente se añade la siguiente línea al fichero /etc/passwd

aula:x:109:100:usuarios de pruebas:/export/home/aulaunix:/bin/ksh

7.2.3 Modificar un usuario

Si ya tenemos un usuario en el sistema y deseamos cambiar alguna de sus propiedades utilizamos el comandousermod:

Las opciones permitidas son:

-o permite la duplicación de un UID

-m Mueve el home del usuario

-l Cambio del nombre de inicio de sesión

-f Definimos el número de días puede estar inactiva. Si la cuenta no es usada enel número de días especificado se bloquea.

-e Define la fecha de caducidad de la cuenta. Cuando llega ldicha fecha la cuentaes inutilizable.

7.2.4 Ejemplo 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 /export/nuevohome y mueve todos losarchivos del viejo directorio al nuevo.

Vamos a ejecutar el ejemplo anterior pero además vamos a cambiar el nombre de inicio de sesión:

#usermod -m -d /export/nuevohome -l davidgalan

Después de ejecutar el comando tenemos un nuevo home y un nuevo nombre de inicio de sesión.

7.2.5 Borrado de usuarios

Borrar un usuario del sistema es muy sencillo utilizando el comando userdel:

userdel -r [usuario a borrar]

La opción -r elimina el home del usuario si este existe, pero no borra los archivos que el usuario pueda tenerrepartidos en otros directorios de la máquina.

Para eliminar todos los archivos del usuario deberíamos de recurrir a una búsqueda recursiva utilizando el comandofind. Buscaríamos todos los archivos y directorios pertenecientes al usuario eliminado.

Ejemplo de borrado de usuario:

userdel -r dgalan

Borramos el usuario dgalan y los contenidos de su directorio home.

44 Capítulo 7. Gestión de Usuarios

Page 51: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

7.2.6 Cambiar la contraseña de usuario

Para cambiar la contraseña de un usuario recurrimos al comando passwd:

passwd [usuario]

Ejemplo de cambio de contraseña:

bash-3.00# passwd dgalanNueva contraseña:Vuelva a escribir la nueva contraseña:passwd: la contraseña se ha cambiado por dgalan satisfactoriamentebash-3.00#

7.3 Gestión de grupos

Hemos visto como crear, modificar y eliminar usuarios. Ahora vamos a realizar el mismo recorrido pero esta vezgestionando grupos, para ello utilizaremos los comandos:

groupadd

groupmod

groupdel

7.3.1 Añadir un nuevo grupo al sistema

Para añadir un nuevo grupo al sistema recurrimos al comando groupadd. El GID y el nombre del grupo han deser únicos.

Ejemplo para añadir un grupo llamado operadores:

bash-3.00# groupadd -g 124 admins

Lo verificamos:

bash-3.00# grep admins /etc/groupadmins::124:bash-3.00#

Hemos buscado el nuevo usuario en el fichero de grupos y efectivamente se añada la nueva entrada de grupo.

7.3.2 Modificar un grupo

Podemos ejecutar cambios en un grupo existente con el comando groupmod que nos permite modificar el GIDo renombrar un grupo:

groupmod -d [GID] -n [nuevo nombre de grupo]

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

7.3. Gestión de grupos 45

Page 52: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

7.3.3 Eliminar un grupo

Eliminar un grupo existente es muy fácil con el comando groupdel:

groupdel [nombre del grupo]

Ejemplo:

bash-3.00# groupdel admins

7.3.4 Cambio de grupos

Siempre que entramos al sistema lo hacemos perteneciendo al grupo principal, pero un usuario que pertenece avarios grupos puede necesitar operar en cada uno de ellos en diferentes momentos de su sesión en el sistema.

Para cambiar de grupo recurrimos al comando newgrp, veamos un ejemplo práctico: Hemos entrado al sistemacon el usuario dgalan tal como se puede ver en el siguiente ejemplo:

$ iduid=109(dgalan) gid=1(other)

Para pasarnos al grupo admin ejecutamos:

# newgrp admins

Lo verificamos:

$ iduid=109(dgalan) gid=1(other) gid=45(admins)

A partir de este momento todos los ficheros y directorio creados pertenecerán al grupo admins.

7.4 ¿Qué hacen los usuarios en el sistema?

7.4.1 El comando who

Solaris al igual que el resto de sistemas Unix nos facilita una serie de comandos que nos permite averiguar queusuarios están 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 mostran-do datos como:

usuario

conexión

fecha de entrada

Ejemplo del comando who:

$ whoroot console Sep 1 19:41aula pts/1 Sep 1 19:45 (192.168.1.33)$

46 Capítulo 7. Gestión de Usuarios

Page 53: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

7.4.2 El comando w

Otro comando a nuestro alcance es w que muestra la lista de usuarios en el sistema como el comando who peroañadiendo datos como los procesos y carga de CPU.

Ejemplo del comando w:

$ w9:05pm en funcionamiento 1:26, 2 usuarios, promedio de carga: 0,01, 0,01, 0,21

User tty login@ idle JCPU PCPU whatroot console 7:41pm 1:21 -shaula pts/1 7:45pm 1 w

7.4.3 El comando finger

Muestra información detallada de los usuarios conectados al sistema y detalles de usuarios de forma individual,es un comando basado

Ejemplo de la salida del comando finger para todos los usuarios:

finder: no encontrado$ fingerLogin Name TTY Idle When Whereroot Super-User console 1:30 Sat 19:41aula ??? pts/1 Sat 19:45 192.168.1.33$

Ejemplo de la salida del comando finger para obtener detalles de un solo usuario:

Login name: root In real life: Super-UserDirectory: / Shell: /sbin/shOn since Sep 1 19:41:45 on console1 hour 31 minutes Idle TimeNo unread mailNo Plan.

El segundo ejemplo nos aporta información como la shell y el home del usuario así como el tiempo conectado.

7.4. ¿Qué hacen los usuarios en el sistema? 47

Page 54: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

48 Capítulo 7. Gestión de Usuarios

Page 55: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 8

Procesos y Señales

8.1 Introducción

En este capitulo veremos como gestiona Solaris los procesos que no difiere mucho del resto de unix existentesen el mercado. Igualmente si provienes de Linux te resultará fácil adaptarte a las singularidades de Solaris. Cadaprograma que se ejecuta en el sistema se corresponde con uno o varios procesos. Solaris como cualquier sistemamultiusuario permite a cualquier usuario ejecutar más de un proceso simultáneamente, los procesos de un mismousuario pueden comunicarse entre si pero no con los procesos de otro usuario. El usuario root es el único quepuede comunicarse con todos los procesos en ejecución.

Cada proceso está identificado por un PID único y a su vez tienen asociado un identificador de usuario (UID) y sugrupo (GID).

8.2 Ver los Procesos en Ejecución

Uno de los comandos mas habituales para un administrador de sistemas es sin duda el comando ps. El comandops permite ver los procesos en ejecución en el sistema y obtener información de cada uno de ellos.

Veamos un ejemplo de la ejecución del comando ps -ef:

UID PID PPID C STIME TTY TIME CMDroot 0 0 0 23:51:57 ? 30:42 schedroot 1 0 0 23:51:58 ? 0:00 /sbin/initroot 2 0 0 23:51:58 ? 0:00 pageoutroot 3 0 0 23:51:58 ? 0:01 fsflushdaemon 223 1 0 23:52:18 ? 0:00 /usr/sbin/rpcbindroot 7 1 0 23:51:58 ? 0:10 /lib/svc/bin/svc.startdroot 45 1 0 23:52:02 ? 0:00 /sbin/dhcpagentroot 9 1 0 23:51:58 ? 0:19 /lib/svc/bin/svc.configdroot 230 1 0 23:52:18 ? 0:00 /usr/lib/dmi/dmispdroot 419 1 0 23:52:29 ? 0:00 /usr/lib/autofs/automountdroot 139 1 0 23:52:14 ? 0:00 /usr/lib/sysevent/syseventdroot 71 1 0 23:52:09 ? 0:00 /usr/sfw/sbin/snmpd

La información que nos aporta la salida del comando:

UID: usuario propietario del proceso.

PID: número de identificación del proceso.

PPID: número que identifica el proceso padre.

STIME: fecha en la que se arrancó el proceso.

49

Page 56: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

TTY: terminal del proceso.

CMD: programa en ejecución.

La siguiente tabla contiene los parámetros más útiles para utilizar con el comando ps:

Parámetro Función -a Muestra los procesos mas solicitados. -e Muestra todos los procesos en ejecución. -f Muestrainformación ampliada de los procesos. -p Muestra el ID de la CPU asociada al proceso. -u Muestra todos losprocesos de un usuario específico. -c Muestra los datos con formato planificación y prioridad de procesos. -GMuestra los procesos ejecutados por un grupo.

Los siguientes ejemplos muestran el uso del comando ps:

Ver los procesos pertenecientes al usuario aulaunix:

$ ps -u aulaunixPID TTY TIME CMD712 pts/1 0:00 bash733 pts/1 0:00 ps682 ? 0:01 sshd684 pts/1 0:00 sh

Muestra los datos en formato planificación:

$ ps -cPID CLS PRI TTY TIME CMD712 TS 49 pts/1 0:00 bash734 TS 49 pts/1 0:00 ps684 TS 59 pts/1 0:00 sh

La opción ejecutada en el ejemplo con -c muestra información interesante como los valores CLS que indica eltipo de prioridad y PRI que muestra la prioridad del proceso.

Muestra los procesos en ejecución del grupo aulaunix:

$ grep -i aulaunix /etc/groupaulaunix::100:

$ ps -G 100PID TTY TIME CMD712 pts/1 0:00 bash742 pts/1 0:00 ps682 ? 0:01 sshd684 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.

8.2.1 El Comando prstat

El comando prstat muestra información de los procesos en ejecución ordenados por el uso de CPU. Ejemplode la ejecución delcomando prstat:

$ prstatPID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP

668 noaccess 159M 80M sleep 59 0 0:00:29 0,5% java/24744 aulaunix 4492K 2644K cpu0 39 0 0:00:00 0,4% prstat/1682 aulaunix 7952K 2100K sleep 59 0 0:00:00 0,0% sshd/1712 aulaunix 2484K 1612K sleep 49 0 0:00:00 0,0% bash/1131 root 3824K 2360K sleep 59 0 0:00:00 0,0% nscd/24535 root 4444K 1724K sleep 59 0 0:00:00 0,0% dtlogin/1670 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

50 Capítulo 8. Procesos y Señales

Page 57: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

269 root 4416K 3052K sleep 59 0 0:00:03 0,0% inetd/4278 root 2820K 1140K sleep 59 0 0:00:00 0,0% sh/1214 root 2272K 900K sleep 59 0 0:00:00 0,0% cron/1143 daemon 3932K 1968K sleep 59 0 0:00:00 0,0% kcfd/3111 root 2156K 1296K sleep 59 0 0:00:00 0,0% snmpdx/1258 root 1700K 896K sleep 59 0 0:00:00 0,0% sac/171 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 información aportada por la ejecución 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 parámetros para obtener mas información, los parámetros mas útilesson:

-t muestra información agrupada por usuario.

-n número máximo de procesos mostrados.

-p PID muestra solo la información para un solo proceso identificado por su PID.

8.3 Señales

Los procesos en ejecución puede ser necesario detenerlos por que su funcionamiento no es el esperado, no res-ponden o cualquier otra causa. El comando kill nos permite enviar una señal al proceso para que se detenga.

Las señales que podemos enviar son:

Nom-bre

Número deseñal

Descripción

SIGHUP 1 Señal de corte de señal, interrumpir la señal de la conexión telefónica o un terminal.SIGINT 2 Señal de Control-C (procedente del teclado).SIGKILL9 Señal de eliminación ningún proceso puede ignorar esta señal.SIGTERM15 Finalizar proceso de forma ordenada. Ejemplo para una BBDD, LDAP. etc; para

que cierre las conexiones, ficheros, etc.

Formato de kill:

kill -señal pidproceso

Ejemplo de kill, matar una sesión ssh:

# ps -ef | grep sshroot 449 1 0 Aug 20 ? 1:01 /usr/local/sbin/sshdroot 25618 449 0 17:51:52 ? 0:00 /usr/local/sbin/sshd -Rora9 18084 18082 0 20:25:28 ? 0:00 /usr/local/sbin/sshd -Rora9 8645 8476 0 20:22:26 ? 0:00 /usr/local/sbin/sshd -R

8.3. Señales 51

Page 58: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

# kill -9 25618#

La señal SIGHUP comúnmente conocida como interrumpir una conexión telefónica o de Terminal, esta señalpuede provocar en servicios como inetd que relean el fichero de configuración.

8.3.1 Señal en curso

En algún momento puede interesarnos ver todas las señales enviadas a un proceso en ejecución para ello recurrimosal comando psig.

Formato:

psig pid

Ejemplo de psig:

# psig 1393613936: /usr/lib/ssh/sshdHUP defaultINT defaultQUIT defaultILL defaultTRAP defaultABRT defaultEMT defaultFPE defaultKILL defaultBUS defaultSEGV defaultSYS defaultPIPE ignoredALRM caught 0x2d7fc RESETHAND,NODEFERTERM defaultUSR1 defaultUSR2 defaultCLD caught 0x40f14 0PWR defaultWINCH defaultURG default

Señales de proceso:

52 Capítulo 8. Procesos y Señales

Page 59: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Nom-bre

Número deseñal

Descripción

SIGHUP 1 Señal de corte de señal, interrumpir la señal de la conexión telefónica o un terminal.SIGINT 2 Señal de Control-C (procedente del teclado).SIGKILL9 Señal de eliminación ningún proceso puede ignorar essta señal.SIGTERM15 Finalizar proceso de forma ordenada. Ejemplo para una BBDD, LDAP, etc; para

que cierre las conexiones, ficheros, etc.SIGINT 3 SalirSIGILL 4 Instrucción ilegal.SIGTRAP5 Punto de rupturaSIGABRT6 AbortarSIGEMT 7 Trap de emulaciónSIGFPE 8 Excepción aritméticaSIGBUS 10 Error en busSIGSEGV11 Fallo de segmentaciónSIGSYS 12 Llamada al sistema erróneaSIGPIPE13 Pipe rotaSIGALRM14 Finalizada

8.3.2 Árbol de procesos

Disponemos de un comando llamado ptree que nos permite ver los procesos de forma jerárquica es decir pode-mos ver los procesos hijos desplegados de forma arbórea. El comando ptree se lanza sin opciones, veamos elejemplo de su ejecución:

# ptree51 /usr/lib/sysevent/syseventd60 /usr/lib/picl/picld137 /usr/lib/sparcv9/cpudiagd -i174 /usr/sbin/rpcbind197 /usr/sbin/inetd -s

326 rpc.metad5089 in.telnetd

5094 -ksh16041 bash28382 bash

15728 ptree22123 in.telnetd

22125 -ksh23114 bash

218 /usr/lib/nfs/statd219 /usr/lib/nfs/lockd221 /usr/lib/autofs/automountd

224 /usr/lib/autofs/automountd235 /usr/sbin/syslogd242 /usr/sbin/cron263 /usr/sbin/nscd266 /usr/lib/power/powerd

8.4 Información sobre procesos

A continuación vamos a ver una serie de comandos que nos aportaran información sobre los procesos en ejecución.

8.4.1 Ver las librerías en uso por un proceso

Para averiguar las librerías en uso por un proceso recurrimos al comando pldd:

8.4. Información sobre procesos 53

Page 60: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

pldd [PID del proceso]

El siguiente ejemplo muestra las librerías utilizadas por el proceso 6171 perteneciente a un servicio web de SunJava:

# pldd 67176717: ../../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/usr/lib/libc.so.1/usr/lib/libdl.so.1/usr/lib/libmp.so.2/usr/platform/sun4u-us3/lib/libc_psr.so.1

8.4.2 Descriptores de ficheros abiertos

El comando pfiles lista todos los descriptores de ficheros abiertos por un proceso:

pfiles [PID del proceso]

El resultado de la ejecución del comando pfiles para un servicio web es la siguiente:

# pfiles 67176717: ../../bin/https/bin/Cgistub -f /tmp/https-admserv-98ccc083/.cgistub_88

Current rlimit: 1024 file descriptors1: S_IFCHR mode:0666 dev:85,1 ino:72269 uid:0 gid:3 rdev:13,2

O_RDWR2: S_IFCHR mode:0666 dev:85,1 ino:72269 uid:0 gid:3 rdev:13,2

O_RDWR

8.4.3 Mapa de espacio de direcciones

El comando pmap muéstrela el uso que hace de la memoria un proceso mostrando una mapa del espacio dedirecciones:

pmap [PID del proceso]

El siguiente ejemplo muestra la salida del comando pmap

# pmap 67176717: ../../bin/https/bin/Cgistub -f /tmp/https-admserv-98ccc083/.cgistub_8800010000 24K read/exec/opt/app/SunWeb/ /bin/https/bin/Cgistub00024000 8K read/write/exec/opt/app/SunWeb/

0/bin/https/bin/Cgistub00026000 8K read/write/exec [ heap ]FF080000 688K read/exec /usr/lib/libc.so.1FF13C000 32K read/write/exec /usr/lib/libc.so.1FF1B0000 224K read/exec /usr/lib/libm.so.1FF1F6000 8K read/write/exec /usr/lib/libm.so.1FF200000 312K read/exec /usr/lib/libC.so.5FF25C000 32K read/write/exec /usr/lib/libC.so.5FF264000 64K read/write/exec /usr/lib/libC.so.5

54 Capítulo 8. Procesos y Señales

Page 61: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

FF280000 576K read/exec /usr/lib/libnsl.so.1FF310000 40K read/write/exec /usr/lib/libnsl.so.1FF31A000 24K read/write/exec /usr/lib/libnsl.so.1FF330000 16K read/exec /usr/lib/libmp.so.2FF344000 8K read/write/exec /usr/lib/libmp.so.2FF350000 8K read/write/exec /usr/lib/libdl.so.1FF360000 8K read/exec /usr/platform/sun4u-us3/lib/libc_psr.so.1FF370000 8K read/write/exec [ anon ]FF380000 40K read/exec /usr/lib/libsocket.so.1FF39A000 8K read/write/exec /usr/lib/libsocket.so.1FF3A0000 8K read/exec /usr/lib/libw.so.1FF3B0000 192K read/exec /usr/lib/ld.so.1FF3E0000 8K read/write/exec /usr/lib/ld.so.1FF3E2000 8K read/write/exec /usr/lib/ld.so.1FFBEA000 24K read/write/exec [ stack ]total 2376K

8.4.4 Información sobre las CPU

A continuación veremos una serie de comandos que nos permiten observar los procesos y la carga de trabajo delas CPU del sistema.

El comando ps pero en versión BSD alojado en /usr/ucb nos permite ver el consumo de CPU y memoria delos procesos:

/usr/ucb/ps -aux

El siguiente ejemplo muestra los diez primeros procesos que mas consumen recursos, se ha añade el comandohead para que solo muestra los diez primeros resultados:

# /usr/ucb/ps -aux | headUSER PID%CPU%MEM SZ RSS TT S START TIME COMMANDroot 792 0.5 0.271760 3528 ? S Aug 24 588:50 /usr/lib/mixer_approot 3 0.4 0.0 0 0 ? S Aug 24 842:00 fsflushj.vazque 20211 0.4 0.1 3040 1632 ? S 12:39:01 0:00 /usr/local/bin/cvsroot 790 0.2 1.713910434080 ? S Aug 24 230:50 /usr/bin/java -jarroot 438 0.2 1.04366418752 ? S Aug 24 189:06 /usr/openwin/bin/Xroot 607 0.2 0.314600 5968 pts/2 S Aug 24 197:45 /usr/lib/gconfd-2root 937 0.1 0.164576 1576 ? S Aug 24 144:52 /usr/lib/at-spi-reroot 677 0.1 0.176912 1800 ? S Aug 24 147:34 gnome-panel --sm-croot 20213 0.1 0.1 1384 952 pts/6 O 12:39:33 0:00 usr/ucb/ps -aux

Los comandos psinfo y mpstat nos muestran estadísticas sobre el estado de las CPU del sistema:

mpstat muestra la actividad de las CPU de forma individual, veamos la ejecución del comando mpstat

CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl1 7 1 120 412 309 168 4 21 3 0 638 1 4 0 953 7 1 13 115 107 179 7 21 3 0 633 1 3 0 96

La información más importante que vemos en el resultado de la ejecución del comando es:

mjf que corresponde con fallos importantes.

minf que corresponde con fallos de menor importancia.

xcal aporta información sobre la llamada entre las CPU.

intr indica el número de interrupciones.

wt indica en % el tiempo consumido por los procesos de usuario.

sys tiempo de CPU consumido por los procesos del sistema.

8.4. Información sobre procesos 55

Page 62: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

El comando psrinfo mostrará el estado de las CPU y cuando se iniciaron. Ejemplo de la salida del comandopsrinfo

# psrinfo0 on-line since 10/04/07 09:03:131 on-line since 10/04/07 09:03:132 on-line since 10/04/07 09:03:133 on-line since 10/04/07 09:03:134 on-line since 10/04/07 09:03:135 on-line since 10/04/07 09:03:136 on-line since 10/04/07 09:03:137 on-line since 10/04/07 09:03:0116 on-line since 10/04/07 09:03:1317 on-line since 10/04/07 09:03:1318 on-line since 10/04/07 09:03:1319 on-line since 10/04/07 09:03:1320 on-line since 10/04/07 09:03:1321 on-line since 10/04/07 09:03:1322 on-line since 10/04/07 09:03:1323 on-line since 10/04/07 09:03:1

8.5 Trabajos Planificados

8.5.1 El comando at

El comando at permite la ejecución de un trabajo una sola vez en una fecha y hora determinada. Sintaxis:

at [-m] [-r id_trabajo] [-q nombre_cola][-t hora] [fecha]

Parámetro Función -m Cuando termina el trabajo envía un correo al usuario. -r Elimina un trabajo programado. -qEstablece nombre de cola. -l Muestra los procesos en cola. hora Establece la hora de ejecución. fecha Establece lafecha de ejeución.

Ejemplos de utilización del comando at:

Programar un trabajo

El siguiente ejemplo planifica la parada de un servidor web para las 15:30:

# at 03:00 pmat> /opt/servidorweb/stop.shat> <pulsa Control-d para finalizar>at> <EOT>commands will be executed using /sbin/shjob 1195653600.a at Wed Nov 21 15:00:00 2007

#

El ejemplo primero establece la hora con at 03:00 pm seguidamente introducimos el comando que se va aejecutar /opt/servidorweb/stop.sh y salimos pulsando Control-d. Observa que el comando nos devuelveel nombre del trabajo job 1195653600.a.

Ver los trabajos en espera de ejecución

El comando at -l muestra los trabajos pendientes y su hora de ejecución:

56 Capítulo 8. Procesos y Señales

Page 63: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

# at -luser = root 1195653600.a Wed Nov 21 15:00:00 2007

El ejemplo muestra el trabajo 1195653600.a que se ejecutará el Miércoles 21 de Noviembre a las 15:00.

Eliminar un trabajo programado

Para eliminar la ejecución de un trabajo programado utilizamos el comando at -r nombredeltrabajo : Elsiguiente ejemplo muestra como eliminar un trabajo:

# at -r 1195653600.a

Permitir la ejecución del comando at

No todos los usuarios del sistema pueden ejecutar el comando at, para autorizar o denegar el uso del comandoat hay que editar los ficheros /etc/cron.dat.deny o /etc/cron.d/at.allow ambos ficheros de root.

El fichero at.deny contiene los usuarios a los que se deniega el uso del comando at:

Contenido del fichero at.deny:

# cat /etc/cron.d/at.denydaemonbinsmtpnuucplistennobodynoaccess

El fichero at.allow contiene los usuarios que pueden ejecutar el comando at, en ocasiones el fichero puede noexistir por lo que hay que crearlo.

Contenido del fichero at.allow

# cat /etc/cron.d/at.allowwebldapdgalan

Logs de at

Toda la actividad realizada con el comando at queda registrada en el log ubicado en /var/cron/log.

8.5.2 crontab

El comando crontab permite la ejecución de tareas programadas y forma repetitiva.

A modo de ejemplo práctico 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, miércoles y viernes.

Un parada de un servicio todos los domingos a las 12:00.

8.5. Trabajos Planificados 57

Page 64: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Cuando programamos una tarea con el comando crontab estas se almacenan en/var/spool/cron/crontabs.

El comando crontab almacena la información en diferentes líneas con el siguiente formato:

1 2 3 4 5 /usr/local/bin/iniciobackup.sh

Comienza con cinco campos separados por espacios seguido de la tarea a ejecutar. Los cinco campos representan:

Campo Descripción 1 El primer campo contiene los minutos. Valores entre 0 y 59. 2 El segundo campo tiene lahora. Valores entre 0 y 23. 3 Día del mes, valore entre 1 y 31. 4 El mes del año, valores entre 1 y 12. 5 Día de lasemana, valores entre 0 y 6.

Usando crontab

El comando crontab permite ver, crear, modificar o eliminar un trabajo planificado.

Ver tareas planificadas

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/logadm15 3 * * 0 /usr/lib/fs/nfs/nfsfind1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&130 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 excepción el usuario root que puede ver laplanificación de cualquier usuario del sistema utilizando el comando crontab de la siguiente forma:

crontab -l nombre_de_usuario

Editor o crear entradas en el crontab

En los siguientes ejemplos vamos a mostrar como editar el crontab para editar o añadir nuevas entradas.

Para comenzar tenemos que establecer el editor por defecto ejecutando:

EDITOR=viexport EDITOR

Abrimos el fichero crontab ejecutando:

crontab -e

Ahora veremos en el editor vi las diferentes entradas programadas:

58 Capítulo 8. Procesos y Señales

Page 65: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

# 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/logadm15 3 * * 0 /usr/lib/fs/nfs/nfsfind1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&130 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 añadir nuevas líneas, modificar las existentes o eliminar entradas para eliminarlas de laplanificación.

La siguiente tabla muestra ejemplos de entradas crontab:

Entrada en el crontab Descripción0 0 * * * /opt/miscript.sh Se ejecuta todos los días a las 00.00.30 6 9 * * /opt/miscript.sh Se ejecuta el día 9 de cada mes las 6:30.00 7 1,3,7,12,15,20 * */opt/miscript.sh

Se ejecuta los días 1, 2, 3, 4, 5, 6 de cada mes a las19:00.

0,10,20,30,40,50 * * * */opt/miscript.sh

Se ejecuta cada diez minutos.

Permitir la ejecución del comando crontab

No todos los usuarios del sistema pueden ejecutar el comando crontab‘, para autorizar o denegar el uso del co-mando at hay que editar los ficheros /etc/cron.dat.deny o /etc/cron.d/at.allow ambos ficherosde root.

El fichero at.deny contiene los usuarios a los que se deniega el uso del comando at: Contenido del ficheroat.deny

# cat /etc/cron.d/at.denydaemonbinsmtpnuucplistennobodynoaccess

El fichero at.allow contiene los usuarios que pueden ejecutar el comando at, en ocasiones el fichero puede noexistir por lo que hay que crearlo. Contenido del fichero at.allow

# cat /etc/cron.d/at.allowwebldapdgalan

8.5. Trabajos Planificados 59

Page 66: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

60 Capítulo 8. Procesos y Señales

Page 67: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 9

Gestión de Discos

El siguiente capitulo comprende la gestión de discos con OpenSolaris 2008.05 aprendiendo a configurar y divi-dir el disco en particiones. También aprenderemos el nuevo sistema de ficheros ZFS (Zettabyte) incorporado aOpenSolaris 2008.05.

9.1 Nombres de Dispositivos

Solaris gestiona los nombres de los dispositivos con la siguiente referencia:

Dispositivos lógicos Son nombres sencillos para una identificación cómoda e intuitiva de un dispositivo. Losdispositivos de disco están en los directorios /dev/dsk para acceso a dispositivos mediante bloques y/dev/rdsk para acceso a dispositivos mediante raw o character.

Un nombre lógico se forma de la siguiente forma: número de controladora, número de target, el número dedisco y su partición.

El siguiente ejemplo muestra un nombre de dispositivo lógico con su respectivo enlace a un dispositivofísico:

# cd /dev/dsk# ls -llrwxrwxrwx 1 root root 50 Dec 19 16:59 c0d0s0

->../../devices/pci@0,0/pci-ide@7,1/ide@0/cmdk@0,0:alrwxrwxrwx 1 root root 50 Dec 19 16:59 c0d0s1

->../../devices/pci@0,0/pci-ide@7,1/ide@0/cmdk@0,0:b............

Dispositivos físicos Los nombres para los dispositivos físicos identifican su ubicación en el hardware de la má-quina. Son mas complejos de utilizar en la administración diaria por lo que es mas práctico la utilización delos nombres lógicos. Ejemplo de un dispositivo físico: /devices/pci@0,0/pci-ide@7,1/[email protected] nodo esta separado con una / que se corresponde también con su ruta en disco, es decir podemos ir aldirectorio ejecutando:

cd /devices/pci@0,0/pci-ide@7,1/ide@0

Nombres de instancia Es un nombre de dispositivo abreviado que es creado por el propio kernel. Un ejemplodel uso de los nombres de instancia lo encontramos en la ejecución del comando ifconfig -a dondepodemos ver en negrita el nombre de la instancia que corresponde con la interfaz de red:

61

Page 68: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

# ifconfig -alo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> mtu 8232 index 1

inet 127.0.0.1 netmask ff000000hme0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2

inet 10.65.164.155 netmask fffffc00 broadcast 10.65.167.255karol@un19009>>

9.1.1 Ver los dispositivos con prtconf

Para obtener información sobre todos los dispositivos instalados en el sistema ejecutamos el comando prtconf:

# prtconf | grep -v notSystem Configuration: Sun Microsystems sun4uMemory size: 384 MegabytesSystem Peripherals (Software Nodes):SUNW,Ultra-1

options, instance #0sbus, instance #0

zs, instance #0zs, instance #1SUNW,fas, instance #0

sd, instance #0sd, instance #6

SUNW,hme, instance #0SUNW,ffb, instance #0pseudo, instance #0

La opción de grep -v not mostrada en el ejemplo es añadida para que no muestre los dispositivos que notienen el driver cargado. Si no ponemos dicha opción que aparecen con el texto “driver not attached“.

Si ejecutamos el comando prtconf con la opción -v obtenemos mas detalles sobre todos los dispositivos delsistema.

9.1.2 Ver los dispositivos con /etc/path_to_inst

Todos los dispositivos reconocidos por el sistema son registrados en el fichero /etc/path_to_inst que con-tiene una lista de los dispositivos y su nombre de instancia. Un ejemplo del contenido del archivo:

# 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"

62 Capítulo 9. Gestión de Discos

Page 69: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

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

9.1.3 Ver discos con format

Para ver los discos reconocidos por el sistema ejecutamos el comando format:

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,01. c0d1 <DEFAULT cyl 2044 alt 2 hd 128 sec 32>

/pci@0,0/pci-ide@7,1/ide@0/cmdk@1,0Specify disk (enter its number):

El comando format muestra los discos reconocidos por el sistema. Para salir pulsamos ctrl + c. Muestra losdiscos numerados y con su nombre de dispositivo asignado. No olvidar que cada partición viene definida en elnombre lógico por la letra s (slice), es decir que para el disco c0t0d0 las particiones son c0t0d0s0, c0t0ds1,c0t0d0s2, etc.

9.2 Instalar y configurar un nuevo disco

Hemos visto como ver los dispositivos instalados en una máquina y ahora vamos a explicar como reconocer unnuevo disco instalado en la máquina para su división en particiones.

Cuando queremos añadir un nuevo disco al sistema pueden ocurrir dos circunstancias: añadir el disco con lamáquina arrancada por que alberga un servicio 24x7 o tenemos que parar sistema y hardware para instalar eldisco. La primera opción es viable con el hardware apropiado obligando al sistema a detectar el nuevo disco sinreiniciar.

9.2.1 Detectando nuevo hardware parando el sistema

Para una máquina que no admite añadir discos en caliente tenemos que realizar una parada completa de la máquinapara añadir el nuevo hardware. Para reconocer nuevo componente en el sistema actuaríamos de la siguiente forma:

1. Realizamos una copia del fichero /etc/path_to_inst.

2. Creamos el fichero /reconfigure ejecutando: touch /reconfigure esto obliga al sistema en elpróximo arranque a detectar y reconfigurar todo el hardware.

3. Paramos la máquina con init 5.

4. Instalamos el nuevo hardware.

5. Arrancamos nuevamente la máquina.

6. Ejecutamos el comando prtconf para ver si esta el nuevo hardware, también podemos comparar con elcomando diff el backup del fichero /etc/path_to_inst con el nuevo siendo las diferencias el nuevohardware instalado.

9.2. Instalar y configurar un nuevo disco 63

Page 70: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

9.2.2 Detectando nuevo hardware online

Ahora vamos a proceder a reconocer un nuevo disco sin necesidad de detener la máquina para ello ejecutamos elcomando devfsadm.

La ejecución de este comando implica la regeneración de los directorios:

/dev

/devices

Actualización del fichero /etc/path_to_inst

Antes de la ejecución del comando devfsadm es recomendable realizar un backup del fiche-ro /etc/path_to_inst para poder realizar una comparación entre el backup y el nuevo fichero/etc/path_to_inst generado por el comando devfsadm. La comparación de ambos fichero nos mostrarael nuevo hardware detectado.

Ejemplo de la comparación del fichero /etc/path_to_inst antes de la ejecución devfsadm y el nuevofichero generado por devfsadm:

# diff path_to_inst path_to_inst.backup30d29< "/pci@0,0/pci1000,30@10/sd@0,0" 0 "sd"

Ejecutamos el comando prtconf para ver si esta el nuevo hardware detectado por el sistema.

9.2.3 Crear nuevas particiones en disco

El nuevo disco ya es visible para sistema y podemos proceder a crear las particiones (slices). Para crear lasparticiones utilizamos el comando format. 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 format y veremos el siguiente menú:

# formatSearching for disks...doneAVAILABLE 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 format muestra de forma numerada los discos disponibles con su nombre de lógico, selecciona-mos el disco con el que queremos trabajar y pulsamos intro:

selecting c1d1Controller working list found[disk formatted, defect list found]FORMAT MENU:

64 Capítulo 9. Gestión de Discos

Page 71: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

disk - select a disktype - select (define) a disk typepartition - select (define) a partition tablecurrent - describe the current diskformat - format and analyze the diskfdisk - run the fdisk programrepair - repair a defective sectorshow - translate a disk addresslabel - write label to the diskanalyze - surface analysisdefect - defect list managementbackup - search for backup labelsverify - read and display labelssave - save new disk/partition definitionsvolname - set 8-character volume name

!<cmd> - execute <cmd>, then returnquit

La utilizad format nos muestra un nuevo menú donde vamos a elegir la opción partition. Para entrar en lautilizad de particiones tecleamos partition y pulsamos intro; nos mostrara un nuevo menú:

PARTITION MENU:0 - change ‘0’ partition1 - change ‘1’ partition2 - change ‘2’ partition3 - change ‘3’ partition4 - change ‘4’ partition5 - change ‘5’ partition6 - change ‘6’ partition7 - change ‘7’ partitionselect - select a predefined tablemodify - modify a predefined partition tablename - name the current tableprint - display the current tablelabel - write partition map and label to the disk!<cmd> - execute <cmd>, then returnquit

partition>

Ahora teclea print para ver la tabla de particiones que existe actualmente:

partition> printCurrent 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) 01 unassigned wm 0 0 (0/0/0) 02 backup wu 0 - 2043 3.99GB (2044/0/0) 83722243 unassigned wm 0 0 (0/0/0) 04 unassigned wm 0 0 (0/0/0) 05 unassigned wm 0 0 (0/0/0) 06 unassigned wm 0 0 (0/0/0) 07 unassigned wm 0 0 (0/0/0) 08 boot wu 0 - 0 2.00MB (1/0/0) 40969 alternates wm 1 - 2 4.00MB (2/0/0) 8192

La partición numero dos es solo informativa y muestra el tamaño total del disco disponible. Podemos definir hastasiete 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 información es:

Part: numero de la partición

9.2. Instalar y configurar un nuevo disco 65

Page 72: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Tag: etiqueta predefinida.. Los valores posibles son: - unassigned - boot - root - swap - usr - backup - stand- home - alternates

Flag: etiqueta predefinida. Los valores posibles son: - wm: la partición se puede leer y escribir. Se puedemontar - wu: la partición es solo de lectura y no se pude montar. - rm: la partición es solo de lectura y sepuede montar. - ru: la partición es solo de lectura y no se puede montar

Cylinders: Numero de cilindro de comienzo y final de la partición.

Size: tamaño de la partición

Blocks: numero total de cilindros y bloques de la partición.

Para crear una partición seguimos los siguientes pasos:

Seleccionamos la partición 0, tecleamos 0 y pulsamos intro:

Part Tag Flag Cylinders Size Blocks0 unassigned wm 0 0 (0/0/0) 0

Seguidamente nos pregunta el valor para el tag. Tecleamos ? y pulsamos intro para que muestre todos losvalores posibles. Elegimos la opción alternates ya que ninguna de las opciones mostradas será el usofinal del disco:

Enter partition id tag[unassigned]: ?Expecting one of the following: (abbreviations ok):

unassigned boot root swapusr backup stand varhome alternates reserved

Enter partition id tag[unassigned]: alternates

Ahora tenemos que definir los permisos para la partición, elegimos la opción por defecto wm que permite laescrita en disco y su montaje:

Enter partition permission flags[wm]:

Ahora nos pedirá el cilindro de inicio. Esta opción la dejamos por defecto para que el sistema la complete:

Enter new starting cyl[1]:

Definimos el tamaño para la partición. Para nuestro ejemplo definimos un 1gb:

Enter partition size[0b, 0c, 1e, 0.00mb, 0.00gb]: 1gb

Tecleamos print para ver el resultado:

partition> printCurrent partition table (unnamed):Total disk cylinders available: 2044 + 2 (reserved cylinders)Part Tag Flag Cylinders Size Blocks0 alternates wm 1 - 512 1024.00MB (512/0/0) 20971521 unassigned wm 0 0 (0/0/0) 02 backup wu 0 - 2043 3.99GB (2044/0/0) 83722243 unassigned wm 0 0 (0/0/0) 04 unassigned wm 0 0 (0/0/0) 05 unassigned wm 0 0 (0/0/0) 06 unassigned wm 0 0 (0/0/0) 07 unassigned wm 0 0 (0/0/0) 08 boot wu 0 - 0 2.00MB (1/0/0) 40969 alternates wm 1 - 2 4.00MB (2/0/0) 8192

Podemos observar que la partición denominada 0 tiene asignado un tamaño de 1024MB.

Si todo es correcto tecleamos el comando label para grabar la información de la partición:

66 Capítulo 9. Gestión de Discos

Page 73: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

partition> labelReady to label disk, continue? y

Repetiremos el proceso para el resto de particiones que necesitamos crear. Cuando finalicemos podemos salir dela utilidad format tecleando el comando quit.

9.2.4 Crear una nueva tabla de particiones

Si al ejecutar el comando partition de la utilidad format responde el siguiente mensaje: Please runfdisk first debemos ejecutar el comando fdisk para crear la tabla de particiones. El siguiente ejemplomuestra la ejecución del comando:

format> partitionPlease run fdisk first.format> fdiskNo fdisk table exists. The default partition for the disk is:

a 100% "SOLARIS System" partitionType "y" to accept the default partition, otherwise type "n" to edit the

partition table.y

Al teclear fdisk y pulsar intro nos informa de que va a crear una tabla de particiones por defecto y nos pideconfirmación. Tecleamos y pulsamos intro. Ya podemos continuar gestionando el disco.

9.3 La VTOC

Todos los discos en Solaris tienen un área especial que esta definida para almacenar toda la información sobre elcontrolador de disco y sus particiones. A esta información sobre las particiones se la denomina label y contieneinformación sobre las particiones que contiene el disco como su tamaño, los límites de inicio y final de cadapartición con datos sobre los cilindros.

Para ver la información de la VTOC dentro de la utilidad format seleccionamos el disco y ejecutamos el coman-do verify.

9.3.1 Backup la VTOC

Para realizar un backup de la VTOC hay que ejecutar el comando prtvtoc redirigiendo la salida a un archivoque contendrá el backup de la VTOC.

Ejemplo:

prtvtoc /dev/rdsk/c0d1s0 > /backup/vtoc/cod1s0

9.3.2 Restaurar la VTOC

Restaurar nuevamente la VTOC es sencillo con el comando fmthard:

fmthard -s backupdelavtoc disodestinodelavtoc

Ejemplo sobre la restauración de una VTOC:

# fmthard -s /backup/vtoc/cod1s0 /dev/rdsk/c0d1s0fmthard: New volume table of contents now in place.

9.3. La VTOC 67

Page 74: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Nota: los comandos fmthard y prtvtoc necesitan tener acceso a los discos en modo raw por lo que hay queutilizar siempre la ruta /dev/rdsk/nombre_del_disco.

9.4 Sistema de ficheros UFS

Hemos visto como crear los slices o particiones con la utilidad format ahora hay que crear un sistema de ficherospor cada partición creada y posteriormente poder montarla. El comando que permite la creación de un sistema deficheros ufs es newfs.

9.4.1 Creación del sistema de ficheros UFS

El siguiente ejemplo muestra la ejecución del comando newfs que solicita confirmación antes de ejecutar elcomando ya que borra de forma irreversible todos los datos:

# newfs /dev/rdsk/c0d1s0newfs: construir un nuevo sistema de archivos /dev/rdsk/c0d1s0: (y/n)? y/dev/rdsk/c0d1s0: 8368128 sectores en 2043 cilindros de 128 pistas, 32

sectores4086,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,8202688, 8309216

El comando newufs utiliza el acceso a disco en modo raw por lo que siempre hay que darle la ruta del dispositivo/dev/rdsk. Si creamos varias particiones o slices tenemos que ejecutar el comando newfs por cada una deellas. Recordar que cada partición viene definida en el nombre lógico por la letra s (slice), es decir que para eldisco c0t0d0 las particiones son c0t0d0s0, c0t0ds1, c0t0d0s2, etc.

9.4.2 El directorio lost+found

Cuando el comando newufs crea el nuevo sistema de ficheros reserva un pequeño porcentaje de disco para crearel directorio lost+found en el que se guarda la información necesaria para una posible reparación del discocon la utilidad fsck. Este espacio reservado se le denomina minfree.

9.5 Montar el nuevo sistema de ficheros

Ya tenemos creado el sistema de ficheros utilizando el comando newufs ahora hay que definir un punto demontaje y montar el disco.

El comando que nos permite montar un sistema de ficheros es mount. El siguiente ejemplo crea un punto demontaje y monta la partición:

# mkdir /nuevodisco# mount /dev/dsk/c0d1s0 /nuevodisco/# cd /nuevodisco/# lslost+found

Si ejecutamos el comando df -kh veremos el nuevo sistema de ficheros montado:

# df -khSistema de archivos tamaño usados aprovechar capacidad Montado en/dev/dsk/c0d0s0 4,6G 3,2G 1,4G 70% //devices 0K 0K 0K 0% /devices

68 Capítulo 9. Gestión de Discos

Page 75: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

ctfs 0K 0K 0K 0% /system/contractproc 0K 0K 0K 0% /procmnttab 0K 0K 0K 0% /etc/mnttabswap 341M 648K 341M 1% /etc/svc/volatileobjfs 0K 0K 0K 0% /system/object/usr/lib/libc/libc_hwcap1.so.1

4,6G 3,2G 1,4G 70% /lib/libc.so.1fd 0K 0K 0K 0% /dev/fdswap 341M 520K 341M 1% /tmpswap 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/c0d1s0 3,9G 4,0M 3,9G 1% /nuevodisco

Hemos finalizado todo el proceso y ya podemos comenzar a utilizar el sistema de ficheros.

9.5.1 El comando mount

El comando mount lo utilizaremos para montar unidades de forma manual desde una partición de un disco, a unCDROM o un disquete.

La sintaxis del comando mount es:

mount [opciones] [dispositivo] [punto de montaje]

Las opciones mas interesantes de las que disponemos son:

ro: monta el sistema de fichero para solo lectura.

noatime: no guarda información sobre el ultimo acceso a los ficheros. Si esta información son es impres-cindible aumentamos el rendimiento.

nolargefile: no permite ficheros con un tamaño 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 parámetro -F. Los sistemas deficheros soportados por Solaris son:

ufs: sistema de ficheros UNIX estándar.

pcfs: sistema de ficheros que permite acceder a FAT32 para lectura y escritura.

hsfs: sistema de ficheros High Sierra es el estándar 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/

9.6 Desmontar un sistema de ficheros

Desmontar un sistema de ficheros es sencillo solo tenemos que ejecutar el comando umount seguido del puntode montaje. Un ejemplo para desmontar una unidad:

#umount /nuevodisco

9.6. Desmontar un sistema de ficheros 69

Page 76: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

9.7 Ver el tipo de un sistema de ficheros

Para averiguar el formato de un sistema de ficheros utilizamos el comando fstyp:

El siguiente ejemplo muestra como obtener la información sobre el sistema de ficheros de /dev/dsk/c0d1s0:

# bashbash-3.00# fstyp /dev/dsk/c0d1s0ufs

9.8 Montar un disco de forma permanente

Hasta el momento todos los comandos que hemos ejecutados no permanecen si reiniciamos la máquina. Es decirsi montamos un disco y lo utilizamos en el próximo arranque no esta montado y solo veremos su punto de mon-taje. Para dejar una unidad montada de forma permanente en el sistema tenemos que añadir los datos al fichero/etc/vfstab.

El contenido del vfstab es leído en el arranque del sistema y montadas todas las unidades que en el se encuen-tran. En contenido del fichero es el siguiente:

Se compone de siete campos separados por tabulación y los campos sin valor se representan con un guión “-“.Los campos que contiene son:

device to mount: dispositivo que se va montar con su nombre lógico. Ejemplo /dev/dsk/cd1s0s0.

device to fsck: dispositivo que cuqueara la utilidad fsck con formato raw. Ejemplo/dev/rdsk/cd1s0s0.

mount point: directorio que se establece como punto de montaje.

FS type: tipo de sistema de ficheros que se va montar.

fsck pass: activa el chequeo en al arranque. Se activa con un número como valor, excepto 0 que desactiva elchuequeo.

mount at boot: con valor yes se monta el sistema de ficheros en el arranque, y con valor no se queda sinmontar. Esto es utilizado para una desactivación temporal del sistema de ficheros.

mount options: opciones separadas por comas que se pasan al comando mount cuando se monta file sys-tems. Un ejemplo puede ser montarlo solo en modo lectura.

Para añadir una partición de forma permanente al sistema editamos el archivo /etc/vfstab y añadimos lanueva línea:

/dev/dsk/c0d1s0 /dev/rdsk/c0d1s0 /nuevodisco ufs 1 yes -

En el próximo arranque el sistema montara automáticamente el sistema de ficheros.

70 Capítulo 9. Gestión de Discos

Page 77: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

9.8.1 El comando umount

El comando umount permite desmontar un sistema de ficheros, su uso es muy sencillo:

umount [nombre dispositivo a desmontar o nombre punto de montaje]

Ejemplo:

bash-3.00# df -kSistema 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 opción -f en el comando umount desmontamos de forma forzosa el sistema de ficheros, si lo hacemosde esta manera podemos generar daños o inconsistencias de ficheros que estuvieran siendo utilizados por unaaplicación.

9.8.2 Consideraciones para desmontar un filesytem

Para desmontar un disco con seguridad ningún usuario o aplicación tiene que estar haciendo uso del filesystem. Sial intentar desmontar un disco nos da el mensaje de ocupado es porque hay accesos al file system y al desmontarlopodemos generar errores en una aplicación. Ejemplo de aviso al intentar desmontar un disco:

bash-3.00# umount /nuevodisco/umount: /nuevodisco ocupadobash-3.00#

Para averiguar que procesos están haciendo uso de un file system recurrimos al comando fuser:

#fuser -cu /nuevodisco

9.8. Montar un disco de forma permanente 71

Page 78: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

72 Capítulo 9. Gestión de Discos

Page 79: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 10

ZFS

10.1 Introducción a ZFS

ZFS (Zettabyte File System ) es el nuevo sistema de archivos incorporado a OpenSolaris. Es un sistema de archivosde 128 bits y su límite de tamaño máximo es de 256 cuatrillones de zettabytes 1.

En la wikipedia se hace la siguiente referencia sobre la capacidad de ZFS:

“Como ejemplo de las capacidades expresadas por estos números, si un usuario crease 1000 ficherospor segundo, tardaría unos 9000 años en alcanzar el límite impuesto por el número de ficheros.”

En este capitulo pretendemos ver la parte práctica de ZFS, si deseas conocer los límites teóricos de ZFS puedesver los valores de referencia en la wikipedia o en www.sun.com.

Las principales características de ZFS son:

Tamaño máximo de 256 cuatrillones de zettabytes

Administración sencilla por comandos o web. (nos olvidamos de format, newfs, mount, vfstab, etc..)

Copy-on-write (ZFS no sobrescribe los nuevos datos directamente, crea los datos en un nuevo bloque yposteriormente cambia los punteros de datos y realiza la escritura definitiva. Con este método siempre estagarantizada la integridad de los datos y no es necesario el uso de utilidades como fsck)

Snapshots (capturas). Podemos sacar un “foto” de forma rápida a todo un sistema de ficheros. Podemosinstalar un paquete en el sistema y si este no cumple nuestras expectativas podemos realizar un rollbackpara volver al estado anterior.

Comprensión. Podemos definir un sistema de ficheros donde toda la información este comprimida.

Mirror y RAID-Z: Se pueden definir de forma muy sencilla mirroring entre discos y RAID-Z.

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 configuración y estado de todos los volúmenes.Todo esto implica la ejecución de comandos como prtvtoc, fmthard, metadb, metainit y metarootsin contar las modificaciones en el fichero /etc/vfstab.

Con ZFS todo se resume a dos comandos zfs y zpool. Tal como podemos ver en la figura 4.1 ZFS trabaja conun pool que esta formado por todos los dispositivos físicos. Las características del pool son:

El pool esta formado por dispositivos de almacenamiento de igual o diferentes capacidades.

El pool puede crecer y encoger añadiendo y quitando discos.

Los sistemas de ficheros ZFS comparten el pool y se puede definir cuotas y reservar de espacio para un solosistema de ficheros.

1 Información detallada sobre la unidad de medida en la wikipedia: http://es.wikipedia.org/wiki/Zettabyte

73

Page 80: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Nota: Si estás viendo esta nota es porque todavía no he hecho algo parecido a la figura 4.1 que se encuentra en laversion original.

10.1.1 Crear un pool

Vamos a crear un pool de 4GB comprendido por lo discos c1d0 y c1d1 ambos con un tamaño de 2GB. Paracrear un pool llamado babilonia utilizamos el comando zpool de la siguiente forma:

zpool create -f [nombre del pool] [lista de dispositivos]

# /usr/sbin/zpool create -f babilonia c1d0 c1d1

Para verificar que se ha creado correctamente ejecutamos el comando zpool list:

# zpool listNAME SIZE USED AVAIL CAP HEALTH ALTROOTbabilonia 3,88G 59,5K 3,87G 0% ONLINE -#

Podemos ver que el tamaño del pool es de 3,88GB y es accesible desde /babilonia.

10.1.2 Crear sistemas de ficheros ZFS

Ya tenemos creado el pool y ahora podemos comenzar a definir sistemas de ficheros. Vamos a crear dos sistemasde ficheros uno para instalar aplicaciones y otro para datos utilizando el comando zfs con la opción create:

zfs create [nombre del pool/sistema de ficheros]

# /usr/sbin/zfs create babilonia/aplicaciones# /usr/sbin/zfs create babilonia/datos

Para ver los nuevos sistema de ficheros ejecutamos el comando zfs con la opción list:

# zfs listNAME USED AVAIL REFER MOUNTPOINTbabilonia 138K 3,81G 27,5K /babiloniababilonia/aplicaciones 24,5K 3,81G 24,5K /babilonia/aplicacionesbabilonia/datos 24,5K 3,81G 24,5K /babilonia/datos

La salida muestra los dos nuevos sistemas de ficheros que también son visibles con el comando df -k. Se puedeobservar que todos los sistemas de ficheros comparten el mismo espacio de 3,81GB que es el tamaño del pool.

Los sistemas de ficheros creados con ZFS se montan automáticamente y de forma persistente. Con ZFS nos hemosahorrado los pasos con los comandos format, newfs, mount y la posterior edición del fichero /etv/vfstabpara dejarlo de forma persistente.

10.2 Propiedades de un ZFS

Los sistemas de ficheros ZFS tienen propiedades que pueden ser activadas o desactivadas según nuestras necesi-dades. Para establecer el valor de una propiedad se ejecuta el comando zfs con las opciones set para establecero get para leer. Veamos algunos de los mas interesantes:

74 Capítulo 10. ZFS

Page 81: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

10.2.1 Creación cuotas y reserva de espacio

ZFS nos da la posibilidad de controlar el espacio de los sistemas de ficheros estableciendo cuotas y reservade espacio para los sistemas de ficheros. Continuando con el pool de los ejemplos anteriores vamos a esta-blecer una cuota para el sistema de ficheros babilonia/aplicaciones y reservar espacio del pool parababilonia/datos.

Estableciendo una cuota a un sistema de ficheros limitamos el espacio máximo que puede tener. Para crear unacuota utilizamos el comando zfs y la opción set quota=1GB:

zfs set quota=[tamaño] [nombre del pool/sistema de ficheros]

# /usr/sbin/zfs set quota=1GB babilonia/aplicaciones

Si ejecutamos el comando zfs list para ver los sistemas de ficheros observaremos que se ha establecido lacuota correctamente:

# zfs listNAME USED AVAIL REFER MOUNTPOINTbabilonia 138K 3,81G 27,5K /babiloniababilonia/aplicaciones 24,5K 1024M 24,5K /babilonia/aplicacionesbabilonia/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 espaciopara un sistema de ficheros dentro del pool ejecutamos zfs con el parámetro set reservation=1GB:

zfs set reservation=[tamaño] [nombre del pool/sistema de ficheros]

# /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 poolno peligra nuestro espacio reservado. Ejecutando zfs list se puede ver que el pool babilonia tiene comousado 1GB y para el resto de sistemas de ficheros hay disponible 2,81GB. Salida de zfs list:

# zfs listNAME USED AVAIL REFER MOUNTPOINTbabilonia 1,00G 2,81G 27,5K /babiloniababilonia/aplicaciones 24,5K 1024M 24,5K /babilonia/aplicacionesbabilonia/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 todoel tamaño del pool. Se pueden combinar las opciones de cuota y reserva para un sistema de ficheros.

10.2.2 Sistema de ficheros comprimido

ZFS ofrece nuevas posibilidades como tener un sistema de ficheros con información comprimida. El comandopara habilitar la compresión del sistema de ficheros es zfs con el parámetro compression=on. El siguienteejemplo activa la compresión para el sistema de ficheros babilonia/datos:

zfs set compression=[on/off] [nombre del pool/sistema de ficheros]

#/usr/sbin/zfs set compression=on babilonia/datos

Para obtener datos del ratio de compresión del sistema de ficheros:

zfs get [nombre de la propiedad] [nombre del pool/sistema de ficheros]

#zfs get compressratio babilonia/datos

10.2. Propiedades de un ZFS 75

Page 82: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

NAME PROPERTY VALUE SOURCEbabilonia/datos compressratio 1.00x -

10.2.3 Sistema de ficheros de solo lectura

Para establecer un sistema de ficheros como solo lectura utilizamos el comando zfs con el parámetroreadonly=on:

zfs set readonly =[on/off] [nombre del pool/sistema de ficheros]

#/usr/sbin/zfs set readonly=on babilonia/datos

10.2.4 Cambiar el punto de montaje

Para cambiar el punto de montaje de un sistema de ficheros ejecutamos el comando zfs estableciendo el nue-vo punto de montaje con el parámetro mountpoint. El siguiente ejemplo muestra como cambiar el punto demontaje de babilonia/datos a /aulaunix:

zfs set mountpoint =[/punto de montaje] [nombre del pool/sistema de ficheros]

# cd /# zfs set mountpoint=/aulaunix babilonia/datos

Verificamos el cambio ejecutando zfs list:

# zfs listNAME USED AVAIL REFER MOUNTPOINTbabilonia 1,00G 2,81G 25,5K /babiloniababilonia/aplicaciones 24,5K 1024M 24,5K /babilonia/aplicacionesbabilonia/datos 24,5K 3,81G 24,5K /aulaunix

10.2.5 Ver las propiedades de un ZFS

Hasta ahora hemos utilizado el comando zfs set para establecer propiedades del sistema de archivos. Para verlos valores de las propiedades de un ZFS ejecutamos zfs con la opción get:

zfs get [nombre de la propiedad] poll/sistemdeficheros

# zfs get quota babilonia/aplicacionesNAME PROPERTY VALUE SOURCEbabilonia/aplicaciones quota 1G local

Con la opción all podemos ver todos los valores de las propiedades de un ZFS y cuales son sus valores pordefecto:

# zfs get all babilonia/aplicaciones

NAME PROPERTY VALUE SOURCEbabilonia/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

76 Capítulo 10. ZFS

Page 83: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

babilonia/aplicaciones reservation none defaultbabilonia/aplicaciones recordsize 128K defaultbabilonia/aplicaciones mountpoint /babilonia/aplicaciones defaultbabilonia/aplicaciones sharenfs off defaultbabilonia/aplicaciones checksum on defaultbabilonia/aplicaciones compression off defaultbabilonia/aplicaciones atime on defaultbabilonia/aplicaciones devices on defaultbabilonia/aplicaciones exec on defaultbabilonia/aplicaciones setuid on defaultbabilonia/aplicaciones readonly off defaultbabilonia/aplicaciones zoned off defaultbabilonia/aplicaciones snapdir hidden defaultbabilonia/aplicaciones aclmode groupmask defaultbabilonia/aplicaciones aclinherit secure default

10.3 Gestión del POOL

10.3.1 Añadir nuevos discos al pool

Para ampliar el espacio disponible en un pool tenemos que añadir nuevos discos a la máquina o utilizar particiones(slices) no usada en otro disco. Para ampliar el pool utilizamos el comando zpool con la opción add:

zpool add -f [nombre del pool] [dispositivo a añadir]

bash-3.00# zpool list -Hbabilonia 1,98G 77,5K 1,98G 0% EN LÍNEA -

bash-3.00# /usr/sbin/zpool add -f babilonia c0d1

bash-3.00# zpool list -Hbabilonia 3,97G 184K 3,97G 0% EN LÍNEA -

Tal como podemos ver en la salida de la ejecución de zpool add el espacio a aumentado de 1,89G a 3,97G. Sepueden añadir tantos discos como sean necesarios.

10.3.2 Quitar discos al pool

Se pude sacar un disco que forma parte del pool utilizamos la orden zpool remove:

zpool remove [nombre del pool] [dispositivo aquitar]

# zpool remove babilonia c0d1

10.3.3 Eliminar un pool

Si tenemos que eliminar un pool por completo y dejar los dispositivos libres para otro uso utilizamos el comandozpool:

zpool destroy -f [nombre del pool]

# /usr/sbin/zpool destroy -f babilonia

Esta opción es “destructiva” por lo que tenemos que estar muy seguros de que no tenemos información valiosa enel pool a borrar.

10.3. Gestión del POOL 77

Page 84: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

10.3.4 Reemplazar un disco del pool

En caso de que un de los discos falle y se tenga que reemplazar utilizamos el comando zpool con el parámetroreplace:

zpool replace -f [pool] [dispositivo a reemplazar] [dispositivo nuevo]

Antes del cambio:

# zpool statusconjunto: babilonia

estado: ONLINElimpiar: resilver completed con 0 errores en Wed Jan 31 16:46:57 2007

config:

NAME STATE READ WRITE CKSUMalmoroz ONLINE 0 0 0mirror ONLINE 0 0 0

c0d1 ONLINE 0 0 0c1d1 ONLINE 0 0 0

errores: ningún error de datosconocido

10.4 Crear un mirror (RAID 1)

Si tuviéramos que crear un espejo de dos discos utilizando herramientas como Solaris Volume Manager realiza-ríamos varias tareas para lograr nuestro objetivo. Con ZFS es muy sencillo tan solo necesitamos con los comandoszpool y zfs.

zpool create -f [nombre del pool] mirror [dispositivos]

# zpool create -f babilonia mirror c0d1 c1d1

Con zpool status verificamos si se ha creado correctamente:

bash-3.00# zpool statusconjunto: babilonia

estado: ONLINElimpiar: no se ha solicitado ninguna

config:

NAME STATE READ WRITE CKSUMbabilonia EN LÍNEA 0 0 0mirror EN LÍNEA 0 0 0c0d1 EN LÍNEA 0 0 0c1d1 EN LÍNEA 0 0 0

10.4.1 Crear un mirror desde un disco existente

Si tenemos un pool de un disco y queremos crear un mirror del disco acudimos al comando zpool con el pará-metro attach:

zpool attach -f [pool] [dispositivo] [nuevo dispositivo]

# zpool attach -f almoroz c0d1 c1d1

La ejecución del comando creara un mirror formado por los discos c0d1 ya existente y el nuevo disco c1d1.

78 Capítulo 10. ZFS

Page 85: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

10.4.2 Reemplazar un disco del mirror

En caso de que un de los discos falle y se tenga que reemplazar utilizamos el comando zpool con el parámetroreplace:

zpool replace -f [pool] [dispositivo a reemplazar] [dispositivo nuevo]

Antes del cambio:

# zpool statusconjunto: almoroz

estado: ONLINElimpiar: resilver completed con 0 errores en Wed Jan 31 16:46:57 2007

config:

NAME STATE READ WRITE CKSUMalmoroz ONLINE 0 0 0mirror ONLINE 0 0 0

c0d1 ONLINE 0 0 0c1d1 ONLINE 0 0 0

errores: ningún error de datosconocido

Realizamos el cambio del disco c1d1 por c0d1s0:

#/usr/sbin/zpool replace -f babilonia c0d1 c1d1

Y lo verificamos:

zpool statusconjunto: almorozestado: ONLINElimpiar: resilver completed con 0 errores en Wed Jan 31 16:46:57 2007

config:

NAME STATE READ WRITE CKSUMalmoroz ONLINE 0 0 0mirror ONLINE 0 0 0c0d1 ONLINE 0 0 0replacing ONLINE 0 0 0c0d1 ONLINE 0 0 0c1d1 ONLINE 0 0 0

errores: ningún error de datosconocido# zpool status

conjunto: almorozestado: ONLINElimpiar: resilver completed con 0 errores en Wed Jan 31 16:46:57 2007

config:

NAME STATE READ WRITE CKSUMalmoroz ONLINE 0 0 0mirror ONLINE 0 0 0

c0d1 ONLINE 0 0 0c0d1s0 ONLINE 0 0 0

10.4. Crear un mirror (RAID 1) 79

Page 86: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

10.5 Crear RAID-Z

ZFS permite la creación de RAID-Z muy similar a RAID 5. RAID 5 se compone como mínimo de tres discos yen cada uno de ellos se reserva un espacio con información de paridad.

RAID-Z cuenta con ventajas como la paridad distribuida simple y doble. La doble paridad permite asumir erroresen uno dos discos que componen el RAIDZ.

Para crear un RAID-Z con paridad simple ejecutamos el comando zpool:

zpool create -f [pool] raidz [dispositivos]

El ejemplo siguiente muestra la creación y su posterior verificación:

#/usr/sbin/zpool create -f babilonia raidz c0d1 c1d1 c2t0d0# zpool status

conjunto: babiloniaestado: ONLINElimpiar: no se ha solicitado ninguna

config:

NAME STATE READ WRITE CKSUMbabilonia ONLINE 0 0 0raidz1 ONLINE 0 0 0

c0d1 ONLINE 0 0 0c1d1 ONLINE 0 0 0c2t0d0 ONLINE 0 0 0

errores: ningún error de datos conocido

Para crear un RAID-Z con paridad doble ejecutamos el comando zpool:

zpool create -f [pool] raidz2 [dispositivos]

# zpool create -f babilonia raidz2 c0d1 c1d1 c2t0d0# zpool status

conjunto: babiloniaestado: ONLINElimpiar: no se ha solicitado ninguna

config:

NAME STATE READ WRITE CKSUMbabilonia ONLINE 0 0 0raidz2 ONLINE 0 0 0

c0d1 ONLINE 0 0 0c1d1 ONLINE 0 0 0c2t0d0 ONLINE 0 0 0

errores: ningún error de datos conocido

10.6 Snapshots

Los snapshots son fotos de los datos de un sistema de ficheros, esto se hace de forma instantánea y comparteel espacio de los datos no modificados. Tiene gran utilidad para realizar modificaciones sobre servicios y si nofuncionan realizar un rollback de forma sencilla. Vamos un caso práctico:

Disponemos de los siguientes sistemas de ficheros en el pool llamado babilonia:

80 Capítulo 10. ZFS

Page 87: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

# zfs listNAME USED AVAIL REFER MOUNTPOINTbabilonia 500M 3,42G 27,5K /babiloniababilonia/prueba1 500M 3,42G 500M /babilonia/prueba1babilonia/prueba2 24,5K 3,42G 24,5K /babilonia/prueba2

El sistema de ficheros babilonia/prueba1 contiene los siguientes archivos:

# ls -lrttotal 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 zfs y elparámetro snapshots:

zfs snapshot [pool/sistemadeficheros]@nombrefoto

Ejecutamos el comando:

# zfs snapshot babilonia/prueba1@nombredelafoto

Con zpool list observamos que se ha creado la foto:

# zfs list

NAME USED AVAIL REFER MOUNTPOINTbabilonia 300M 3,61G 27,5K /babiloniababilonia/prueba1 300M 3,61G 300M /babilonia/prueba1babilonia/prueba1@nombredelafoto 0 - 300M -babilonia/prueba2 24,5K 3,61G 24,5K /babilonia/prueba2

Ahora vamos a simular un pequeño desastre borrando los archivos fichero4 y fichero5:

# rm fichero4 fichero5# ls -lrttotal 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 zfs y el pará-metro rollback:

zfs rollback [pool/sistemadeficheros]@nombrefoto

Ejecutamos el comando:

#zfs rollback -r babilonia/prueba1@nombredelafoto# ls -lrttotal 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

10.6. Snapshots 81

Page 88: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Y el resultado es la recuperación de los archivos fichero4 y fichero5. Tal como se decía al principio la foto compartelos datos con los no modificados, en nuestro ejemplo se traduce con que la foto comparte el espacio de fichero1,fichero2 y fichero3 que no se han modificado ocupando realmente solo el tamaño de fichero4 y fichero5.

10.6.1 Borrar snapshots o fotos

Cuando ya no sea necesario conservar un snapshot podemos borrarlo con el comando zfs y el parámetrodestroy, ejemplo:

# zfs list

NAME USED AVAIL REFER MOUNTPOINTbabilonia 300M 3,61G 27,5K /babiloniababilonia/prueba1 300M 3,61G 300M /babilonia/prueba1babilonia/prueba1@nombredelafoto 0 - 300M -babilonia/prueba2 24,5K 3,61G 24,5K /babilonia/prueba2

# zfs destroy -f babilonia/prueba1@nombredelafoto

10.7 Estados de ZFS

Con el comando zpool status obtenemos información sobre el estado de un pool:

zpool status [pool]

# zpool status babiloniaconjunto: babilonia

estado: ONLINElimpiar: no se ha solicitado ninguna

config:

NAME STATE READ WRITE CKSUMbabilonia ONLINE 0 0 0mirror ONLINE 0 0 0

c0d1 ONLINE 0 0 0c1d1 ONLINE 0 0 0

errores: ningún error de datosconocido

Los estados posibles son:

ONLINE: el dispositivo esta operando normalmente.

DEGRADED: el dispositivo virtual tiene fallos pero continúa en funcionamiento. Este caso de puede darcuando falla un dispositivo que forma parte de un RAIDZ. Hay que sustituir lo antes posible dispositivodañado.

OFFLINE: dispositivo parado manualmente por el administrador.

UNAVAILABLE: dispositivo no disponible. Este estado es el siguiente a DEGRADED cuando finalmente eldispositivo es inaccesible.

Con el comando zpool status -x obtenemos de forma rápida sin un pool esta teniendo problemas:

El siguiente ejemplo muestra un mirror compuesto por dos dispistivos fallando c0d1 que esta totalmente inaccesi-ble. Al ser un mirror el servicio continuo operativo pero se degrada el rendimiento y perdemos alta disponibilidadhasta que se reponga el disco dañado.

Ejemplo de un disco dañado:

82 Capítulo 10. ZFS

Page 89: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

# zpool status -xconjunto: babilonia

estado: DEGRADEDestado: no se pudieron abrir uno o varios dispositivos. Hay réplicas suficientes para

que el conjunto pueda seguir funcionando con un menor rendimiento.acción: adjunte el dispositivo que falta y establézcalo en línea mediante ’zpool online’.

consulte: http://www.sun.com/msg/ZFS-8000-D3limpiar: no se ha solicitado ninguna

config:

NAME STATE READ WRITE CKSUMbabilonia DEGRADED 0 0 0mirror DEGRADED 0 0 0

c0d1 UNAVAIL 0 62 0 no es posible abrirc1d1 ONLINE 0 0 0

errores: ningún error de datosconocido

La información que ofrece es detallada indicándonos el estado en el que se encuentra el mirror. En la salidadel comando nos remite a la dirección web de Sun Microsystems http://www.sun.com/msg/ZFS-8000-D3 dondepodemos encontrar información y soluciones al problema.

Para solucionar este problema tenemos que añadir un nuevo disco al sistema o utilizar un slice de otro disco. Unavez localizado el disco que sustituye a c0d1 lo remplazamos con el comando zpool replace:

Pasos para reemplazar el disco dañado:

# zpool replace babilonia c0d1 c2t0d0

# zpool status babiloniaconjunto: babilonia

estado: ONLINElimpiar: resilver completed con 0 errores en Fri Feb 2 15:04:57 2007

config:

NAME STATE READ WRITE CKSUMbabilonia ONLINE 0 0 0mirror ONLINE 0 0 0

c2t0d0 ONLINE 0 0 0c1d1 ONLINE 0 0 0

errores: ningún error de datosconocido

En el ejemplo hemos reemplazado el disco c0d1 por c2t0d0 y automáticamente el mirror para a estado ONLINEy replica los datos de c0d1 a c2t0d0.

También podemos optar por sacar el disco del mirror para repararlo. Tenemos que desasociar el disco c0d1 delmirror con el comando zpool detach:

zpool detach [pool] [dispositivo]

#zpool detach babilonia c0d1

El disco c0d1 ya no forma parte del mirror babilonia. Podemos someterlo a pruebas y volver a añadirlo almirror o añadir otro disco distinto se la siguiente forma:

zpool attach -f [pool] [chisposito] [nuevo dispositivo]

# zpool attach -f babilonia c1d1 c0d1# zpool status

conjunto: babiloniaestado: ONLINElimpiar: resilver completed con 0 errores en Fri Feb 2 15:18:50 2007

10.7. Estados de ZFS 83

Page 90: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

config:

NAME STATE READ WRITE CKSUMbabilonia ONLINE 0 0 0mirror ONLINE 0 0 0c1d1 ONLINE 0 0 0c0d1 ONLINE 0 0 0

errores: ningún error de datosconocido

10.7.1 Operaciones entrada y salida

ZFS proporciona el comando zpool iostat que reporta e sobre operaciones de lectura, escritura y ancho debanda. El siguiente ejemplo muestra la salida del comando zpool iostat:

zpool iostat [pool]

# zpool iostat babiloniacapacity operations bandwidth

pool used avail read write read write---------- ----- ----- ----- ----- ----- -----babilonia 10,1M 1,97G 0 0 41 2

Para obtener información de todos los dispositivos virtuales:

zpool iostat -v [pool]

# zpool iostat -v babiloniacapacity 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 2c1d1 - - 0 0 44 111c0d1 - - 0 0 0 52

---------- ----- ----- ----- ----- ----- -----

Si omitimos el nombre del pool en el comando lista la información de todos los pool disponibles.

84 Capítulo 10. ZFS

Page 91: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 11

Zonas

11.1 Zonas con OpenSolaris 2008.05

La tecnología de contendedores permite la virtualización de Solaris 10 en zonas aisladas del resto del sistema. Ladenominación de contenedores es la suma de el SRM (Gestor de Recursos de Solaris) + Zonas.

Las zonas ejecutan los procesos de forma aislada al sistema anfitrión sin comunicación con otros procesos fuerade la zona.

Las zonas solo pueden ejecutar entornos virtuales con el operativo OpenSolaris 2008.05 compartiendo el kerneldel sistema anfitrión.

Las zonas se dividen en:

Zona Global Es la primera instalación que se realiza de OpenSolaris 2008.05 físicamente en la máquina y en laque se basan el resto de zonas. Tiene el control de todo el sistema y el hardware de la máquina.

Zona no global: Es un contenedor aislado de la zona global donde se pueden ejecutar OpenSolaris 2008.05 yaplicaciones forma aislada a la zona global.

11.2 Crear una zona

La zonas no globales pueden compartir directorios con la zona global o estar aislada. Una zona no global puedecompartir 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 zonaglobal tal como se puede ver en la figura 5.1.

Nota: Si estás viendo esta nota es porque todavía no he hecho algo parecido a la figura 5.1

figura 5.1 Zona compartida

Nota: Si estás viendo esta nota es porque todavía no he hecho algo parecido a la figura 5.2

Figura 5.2 Zona no compartida

Las zonas no compartidas o zonas grandes ocupan 4GB ya que no comparten sistema de ficheros. Al no compartirsistemas de ficheros con la zona global podemos aplicar parches a la zona distintos a los de la zona global.

85

Page 92: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Podemos tener varias zonas con niveles de parche distintos según las necesidades de las aplicaciones. En la figura5.2 se representa una zona no compartida.

11.2.1 Control de recursos

Cuando creamos una zona tenemos que asignarlas recursos como red, memoria, CPU etc..

Asignar CPU

El control de recursos sobre la CPU en zonas puede ser de tres tipos:

CPU fija: una zona puede tener asignada una o mas CPUs de forma fija. Esta forma puede ser útil cuandolicenciamos aplicaciones por el numero de CPU. Esta opción tiene una desventaja si la zona no requieremucho uso de CPU ya que perdemos capacidad de procesamiento estando la CPU solamente asignada unazona.

CPUs dinamicas: se asigna un mínimo y un máximo de CPU´s para una zona. El demonio poold se encargade balancear el numero de CPUs disponibles según la necesidades de cada zona.

CPUs compartidas: consiste en un pool de CPUs asignado a todas las zonas. El sistema repartirá las CPUsegún las necesidades de cada zona.

Memoria

El control de memoria para zonas antes de OpenSolaris 2008.05 no se podía realizar de forma directa utilizando. Seha incluido una nueva propiedad denominada zone.max-locked-memory que establece el limite de memoriapara una zona.

Espacio en disco

La zonas puedes ser creadas en:

Discos independientes o particiones (slices): una zona puede ser creada en un directorio de cualquier sistemade ficheros, una partición o en un disco independiente.

Volúmenes independientes: puede instalarse las zonas en volúmenes de Solaris Volume Manager y benefi-ciarse de políticas como RAID1, RAIRD 5 etc..

ZFS: Puede instalarse una zona en uns sistema de ficheros ZFS o compartir un sistema de ficheros de lazona global.

RED

Cuando creamos una zona se le asigna una dirección IP e interfaz de red de la zona global.

11.2.2 Creación de una zona compartida o Small-Zone

En el siguiente apartado vamos a seguir los pasos necesarios para crear una zona OpenSolaris 2008.05 no com-partida ocupando tan solo 100MB . La zona a crear tiene un dirección IP asociada a la interfaz pcn1 y se instalaen /babilonia/mizona.

Ejecutamos el comando zonecfg con la opción -z 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 zonatenemos que introducir los comandos de configuración el editor de zonezfg. Los datos a introducir son:

86 Capítulo 11. Zonas

Page 93: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

autoboot=true: este parámetro define si la zona es persintente a los reinitos del sistema. Si reiniciamosla máquina anfitriona la zona también arrancara.

zonepath: PATH donde se instalara la zona Solaris 10.

set address: asigna una dirección IP para la zona.

set physical: asocia una interfaz de la zona no global para su uso en la zona.

El ejemplo siguiente muestra el proceso completo para la creación de la zona:

# zonecfg -z mizona

mizona: No se ha configurado esa zonaUse ’create’ para comenzar a configurar una zona nueva.

zonecfg:mizona> createzonecfg:mizona> set autoboot=truezonecfg:mizona> set zonepath=/babilonia/mizonazonecfg:mizona> add netzonecfg:mizona:net> set address=10.73.111.25zonecfg:mizona:net> set physical=pcn1zonecfg:mizona:net> endzonecfg:mizona> info

zonename: mizonazonepath: /babilonia/mizonaautoboot: truepool:limitpriv:inherit-pkg-dir:

dir: /libinherit-pkg-dir:

dir: /platforminherit-pkg-dir:

dir: /sbininherit-pkg-dir:

dir: /usrnet:

address: 10.73.130.25physical: pcn1

zonecfg:mizona> verifyzonecfg:mizona> commitzonecfg:mizona> exit

Con los pasos anteriores hemos creado la zona. Al realizar el commit se crea un fichero XML en /etc/zonescon los datos de la zona: Ejemplo de mizona.xml:

1 <?xml version="1.0" encoding="UTF-8"?>2 <!DOCTYPE zone PUBLIC "-//Sun Microsystems Inc//DTD Zones//EN" "file:///usr/share/lib/xml/dtd/zonecfg.dtd.1">3 <!--4 DO NOT EDIT THIS FILE. Use zonecfg(1M) instead.5 -->6 <zone name="mizona" zonepath="/babilonia/mizona" autoboot="true">7 <inherited-pkg-dir directory="/lib"/>8 <inherited-pkg-dir directory="/platform"/>9 <inherited-pkg-dir directory="/sbin"/>

10 <inherited-pkg-dir directory="/usr"/>11 <network address="10.73.130.25" physical="pcn1"/>12 </zone>

Para comprobar que la máquina esta correctamente creada ejecutamos el comando:

11.2. Crear una zona 87

Page 94: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

zoneadm list -cv

# zoneadm list -cvID NAME STATUS PATH0 global running /- mizona configured /babilonia/mizona

Ya esta creada la zona y tenemos que inicializarla para que se instalen los paquetes necesarios. Este paso puedetardar varios minutos por que implica la copia de todos los paquetes necesarios.

Antes de iniciar la instalación de paquetes para la zona debemos de comprobar los permisos de la zona par elloacudimos al comando zoneadm para verificar que la zona tiene los permisos necesarios para su creación.

Para verificar ejecutamos:

zoneadm -z [nombre de la zona] verify

Al lanzar el comando nos muestra un mensaje avisando que los permisos sobre los ficheros de la zona no son loscorrectos:

bash-3.00# zoneadm -z mizona verify/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.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 700:

# chmod 700 /babilonia/mizona/

Si ejecutamos nuevamente el comando zoneadm para verificar la zona no observaremos ningún error. Instalamosla máquina ejecutando la orden:

zoneadm -z [nombre de la zona] install

bash-3.00# zoneadm -z mizona installPreparing 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 instalación por zonas.

Una vez finalizada la copia de paquetes comprobamos que la maquina esta instalada correctamente ejecutandozoneadm list -cv:

bash-3.00# zoneadm list -cvID NAME STATUS PATH0 global running /- mizona installed /babilonia/mizona

Arrancar la zona

La máquina ya esta configurada e instalada ahora tenemos que arrancar la zona con el comando zoneadm y elparámetro boot:

88 Capítulo 11. Zonas

Page 95: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

zoneadm -z [nombre de la zona] boot

bash-3.00#zoneadm -z mizona bootbash-3.00# zoneadm list -cv

ID NAME STATUS PATH0 global running /4 mizona running /babilonia/mizona

Para verificar que la zona esta arrancada ejecutamos el comando zoneadm list -cv y veremos que su estadoes running.

Zlogin entrar en la nueva zona

Tenemos la máquina virtual ejecutándose correctamente y queda realizar el ultimo paso supone entrar en la má-quina y responder unas preguntas sobre la configuración que queremos para la zona. Las preguntas son las mismasque en una instalación normal de Solaris, realizará las siguientes preguntas:

Nombre de la máquina

Idioma del sistema

Idioma del teclado

Tipo de Terminal

Zona geográfica

Contraseña de root

Compatibilidad NTFS v4

Para entrar en la máquina ejecutamos la orden zlogin con el parámetro -C:

zlogin -C [nombre de la zona]

Como se aprecia en el siguiente ejemplo se inicia un pequeño instalador que pregunta nuestras preferencias parael sistema:

bash-3.00# zlogin -C mizona[Conectado a la consola de la zona ’mizona’]

Select a Language

0. English1. Spanish2. it

Please make a choice (0 - 2), or press h or ? for help:

Sobre el Terminal:

¿Qué tipo de terminal esta usando?1) Estandar ANSI CRT2) DEC VT523) DEC VT1004) Heathkit 195) Lear Siegler ADM316) Consola PC7) Herramienta de comandos Sun8) Estacion de Trabajo (Workstation) Sun9) Televideo 91010) Televideo 925

11.2. Crear una zona 89

Page 96: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

11) Wyse, modelo 5012) Emulador X Terminal (xterms)13) Emulador de terminal CDE (dtterm)14) Otros

Introduzca el número seleccionado y presione Intro:

Cuando finalizamos la preguntas se configura e inicia el arranque del sistema operativo OpenSolaris 2008.05 comoen cualquier máquina:

SunOS Release 5.10 Version Generic_118855-33 32-bitCopyright 1983-2006 Sun Microsystems, Inc. All rights reserved.Use is subject to license terms.Hostname: 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 máquina virtual babilonia y podemos hacer login con el usuario introducido en las preguntasde la instalación de la zona. Ahora podemos instalar y configurar la máquina virtual como cualquier otra.

Ahora se puede hacer telnet o ssh a la dirección IP que tenemos asociada a nuestra máquina virtual e instarcualquier servicio normalmente.

Parar la Zona virtual

Para parar una máquina virtual podemos proceder de dos formas diferentes:

1. Al ser una máquina virtual responde a los mismos comandos de parada que cualquier instalación normal deSolaris por lo tanto podemos parar con comandos como init 0, shutdown o halt.

2. Desde la zona global podemos o reiniciar la máquina utilizando el comando zoneadm con los parámetrosreboot y halt:

a) zoneadm -z [nombre de la zona] reboot

b) zoneadm -z [nombre de la zona] halt

11.2.3 Crear una zona no compartida o BIG-ZONE

Tal como hemos visto al comienzo una zona no compartida no comparte los directorios /usr, /lib, /sbin y/platform por lo tanto ocupa 4GB de espacio aportando la ventaja de tener una zona totalmente independientedonde 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 montadoen /bigzone.

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 instalación el espacio ocupado por la zona es igual a una instalación completa de OpenSolaris2008.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 queno se compartan los sistemas de ficheros /usr, /lib, /sbin y /platform con los parámetros:

remove inherit-pkg-dir dir=/sbin

remove inherit-pkg-dir dir=/usr

90 Capítulo 11. Zonas

Page 97: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

remove inherit-pkg-dir dir=/platform

remove inherit-pkg-dir dir=/lib

Los pasos a realizar son los siguientes:

# zonecfg -z mibigzonemibigzone: No se ha configurado esa zonaUse ’create’ para comenzar a configurar una zona nueva.zonecfg:mibigzone> createzonecfg:mibigzone> remove inherit-pkg-dir dir=/sbinzonecfg:mibigzone> remove inherit-pkg-dir dir=/usrzonecfg:mibigzone> remove inherit-pkg-dir dir=/platformzonecfg:mibigzone> remove inherit-pkg-dir dir=/libzonecfg:mibigzone> set autoboot=truezonecfg:mibigzone> set zonepath=/bigzonezonecfg:mibigzone> add netzonecfg:mibigzone:net> set address=127.0.0.100zonecfg:mibigzone:net> set physical=lo0zonecfg:mibigzone:net> endzonecfg:mibigzone> infozonename: mibigzonezonepath: /bigzoneautoboot: truepool:limitpriv:net:

address: 127.0.0.100physical: lo0

zonecfg:mibigzone> verifyzonecfg:mibigzone> commitzonecfg:mibigzone> exit

Establecemos los permisos de fichero para la zona:

chmod 700 /bigzone

Verificamos la zona y procedemos a la instalación de los paquetes necesarios para la ejecución de la zona:

bash-3.00# zoneadm -z nocompartida verifybash-3.00# zoneadm -z 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 registrdela instalación por zonas.

Arrancamos la zona:

# zoneadm list -cvID NAME STATUS PATH0 global running /- nocompartida installed /bigzone

# zoneadm -z nocompartida boot# zoneadm list -cv

ID NAME STATUS PATH

11.2. Crear una zona 91

Page 98: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

0 global running /2 nocompartida running /bigzone

Y finalizamos el proceso de instalación estableciendo el nombre de máquina, contraseña de root, zona geográficaetc..

bash-3.00# zlogin -C nocompartida[Conectado a la consola de la zona ’nocompartida’]

Select a Language

0. English1. Spanish2. it

Please make a choice (0 - 2), or press h or ? for help:

11.3 Estados de una zona

Hemos visto como crear una zona, configurarlas y las operaciones de parada y arranque. Ahora veremos comodetectar el estado de una máquina desde la zona global. Con el comando zoneadm list -cv obtenemosinformación sobre el estado de una zona:

# zoneadm list -cvID NAME STATUS PATH0 global running /- nocompartida installed /bigzone

Los estados posibles son:

Configured: se encuentra en estado estado cuando finalizamos la configuración y realizamos uncommit.

Incomplete: mostrará este estado muestran se están instalando los paquetes al ejecutar zoneadm con laopción install.

Installed: la zona tiene todos los paquetes necesarios para su funcionamiento.

Ready: la zona esta lista tiene creado el kernel, los controladores de red están cargados y los sistemas deficheros montados.

Running: la zona esta arrancada.

Shutting Down: la zona esta en proceso de parada.

11.4 Monitorizar una zona

Una zona puede ser monitorizada desde la zona global utilizando el comando zlogin con la opción -S quepermite la ejecución de un comando dentro la zona y enviar la salida del comando a la zona global:

Zlogin -S [nombre de la zona] "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

92 Capítulo 11. Zonas

Page 99: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

FileSystems:

## zlogin -S nocompartida "df -k"Filesystem kbytes used avail capacity Mounted on/ 5783070 2964445 2760795 52% //dev 5783070 2964445 2760795 52% /devproc 0 0 0 0% /procctfs 0 0 0 0% /system/contractswap 513036 260 512776 1% /etc/svc/volatilemnttab 0 0 0 0% /etc/mnttab/usr/lib/libc/libc_hwcap1.so.1 5783070 2964445 2760795 52% /lib/libc.so.1fd 0 0 0 0% /dev/fdswap 512812 36 512776 1% /tmpswap 512796 20 512776 1% /var/run

Uname -a:

# zlogin -S nocompartida "uname -a"SunOS babilonia 5.10 Generic_118855-33 i86pc i386 i86pc

11.5 Validarse en una zona

Para entrar a una zona podemos realizar un telnet o ssh a la dirección IP asociada a la zona o entrar porconsola con la utilizad zlogin:

zlogin -l [usuario] [nombre de zona]

Ejemplo de conexión 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$ iduid=100(aulaunix) gid=1(other)$

11.6 Desinstalar una zona

Para desinstalar una zona tenemos que detener la zona y ejecutar el comando zoneadm con la opciónuninstall. Hay que usar esta opción con mucha precaución 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 desinstalación de la zona puede tardar varios minutos al igual que al crearla.

11.5. Validarse en una zona 93

Page 100: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

11.7 ¿Cómo funcionan las Zonas?

11.7.1 Introducción

Debemos imaginar una zona de OpenSolaris como un contenedor de procesos, es decir la zona es una jaulacuyo contenido no puede ver lo que hay fuera de ella. Para que los procesos puedan ejecutarse el kernel debeproporcionar una serie de recursos a dicha zona, como pueden ser acceso a discos, interfaces de red, etc. Dichosrecursos no pueden ser compartidos entre zonas.

La excepción es la zona global con id 0, esta se crea cuando arranca el sistema y tiene asociado todos los recursossin 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.

11.7.2 Notas sobre el kernel

En nuestro sistema solo tenemos un Kernel ejecutándose, los procesos de las distintas zonas se ejecutan todos enel mismo que, lógicamente es el que se inicia al arrancar la zona global.

Esto tiene grandes beneficios a nivel de performance, especialmente si el diseño de las zonas ha sido bien pensado.

Las páginas de texto (el código de los ejecutables y librerías) que ha cargado en memoria una zona soncompartidas con las demás.

La caché de nombres de directorios del sistema (DNLC) también es compartida.

Las tareas que periódicamente se ejecutan en el kernel (p.ej. todas las de la callout table) no se duplican porcada zona.

Teniendo en cuenta lo anterior interesa, desde el punto de vista de la performance, que las distintas zonas sean losmas parecidas posible y compartan el mayor número de directorios posibles.

P. ej. mientras que levantar el sistema consume en mi equipo 339 megas de la memoria física, arrancar una zonaadicional consume solo 79 mb:

####sistema solo con la zona globalbash-3.00# mdb -kLoading modules: [ unix genunix specfs dtrace uppc pcplusmp scsi_vhci ufs iphook neti sctp arp usba fctl nca lofs mpt audiosup zfs random cpc crypto fcipnsctl ptm sppp ipc ]> ::memstatPage 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 503Physical 128909 503###iniciamos una nueva zona> ::memstatPage 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%

94 Capítulo 11. Zonas

Page 101: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Total 128910 503Physical 128909 503>

11.7.3 Notas sobre la seguridad

Si bien ejecutar todos los hilos en el mismo kernel es un beneficio para la performance también supone un retode cara a la seguridad. El modelo de permisos de OpenSolaris va más allá del tradicional en *nix, root (id =0)todos los privilegios, los demás usuarios ninguno. En su lugar tenemos un modelo mas granular, donde podemosasignar a los procesos/usuarios un set de privilegios específicos 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 usuarioprivilegios para que sus procesos puedan hacer un bind al puerto 80. El hecho que cada proceso pueda ejecutarsecon los mínimos privilegios necesarios, en contra del todo o nada tradicional, favorece enormemente la seguridadglobal del sistema.

Los privilegios que tienen los procesos dentro de una zona no global están prefijados y no pueden ser alterados porel administrador, este set está diseñado de manera que evita la interacción de los threads entre zonas , así como eluso de algún 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 podrán adquirir los procesos ejecutándose en una zona noglobal:

Privilege DescriptionPRIV_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 están ejecutando en sumisma zona.

Obviamente, a parte de la restricción nivel de privilegios, es vital para la seguridad de las zonas, que los derechosde acceso a los distintos recursos sean correctos. Es decir, los privilegios nos indican que “acciones” podemosrealizar (p. ej. Un chown), pero donde realizarlas está controlado a nivel de objetos (p. ej. Usando zonecfgdamos acceso a los filesystem que nos interesa.).

Es la combinación de ambas cosas, privilegios y restricciones de acceso, lo que finalmente garantiza la seguridadentre zonas.

Como pequeño ejemplo práctico podemos comprobar como desde la zona global vemos los pids de las demás yno así a viceversa. En ambos casos el id del usuario es 0 (root):

#ps dentro de la zona testbash-3.00# iduid=0(root) gid=0(root)bash-3.00# uname -aSunOS test 5.11 snv_70b i86pc i386 i86pcbash-3.00# ps

PID TTY TIME CMD11227 console 0:01 bash29665 console 0:02 sh26806 console 0:00 ps

#ps desde la zona global con un grep para ver el proceso bash de la zona testbash-3.00# id

11.7. ¿Cómo funcionan las Zonas? 95

Page 102: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

uid=0(root) gid=0(root)bash-3.00# ps -ef | grep 11227

root 11227 29665 1 Jan 18 zoneconsole 0:01 bashroot 26809 555 1 09:45:14 pts/2 0:00 grep 11227

#ps desde la zona globalbash-3.00# ps

PID TTY TIME CMD555 pts/2 0:03 bash551 pts/2 0:00 sh26812 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 grepbash-3.00#

Como consecuencia de lo anterior existen algunas tareas que no están 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.

Cargar módulos personalizados del kernel.

11.7.4 Procesos que gestionan una Zona

Existen dos nuevos procesos por cada zona no global que tenemos en el sistema, su función gestionar los recursosde ellas:

El primero es el zoneadmd. 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 enviarmensajes de cambio de estado a la zona como halt, reboot, ...

Hay una completa descripción de este proceso en el fichero zoneadmd.c del código fuente.

El otro proceso es el zsched, sus tareas son:

* Es el padre de todos los threads del kernel de su zona.

* Lanza el proceso init de la zona cuando arranca.

11.7.5 Ciclo de vida de una zona

Estos son los estados (a nivel de kernel) en los que se puede encontrar una zona, ordenados por el flujo natural dearranque a parada.

ZONE_IS_UNINITIALIZED: la zona se ha añadido a la lista de zonas activas pero aun no es accesible.

ZONE_IS_READY: el proceso zsched esta preparado.

ZONE_IS_BOOTING: es un estado de transición el proceso zsched esta tratando de lanzar el init de la zona.

96 Capítulo 11. Zonas

Page 103: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

ZONE_IS_RUNNING: zsched a lanzado correctamente el init, la zona esta lista para trabajar. Permanece en esteestado hasta que se le haga un shutdown.

ZONE_IS_SHUTTING_DOWN: se ha ejecutado la llamada zone_shutdown(), el sistema esta matando todoslos procesos dentro de la zona.

ZONE_IS_EMPTY: no quedan mas procesos de esta zona ejecutándose.

ZONE_IS_DOWN: todos los threads del kernel relacionados con la zona han terminado.

11.7.6 La estructura zone_t

Por cada zona existente en el sistema hay una estructura zone_t en el kernel, en ella tenemos información acercadel estado y configuración de esta.

Podemos ver su definición 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 parámetros con los que hemos configurado la zona, entre ellos los que limitan elconsumo, como por ejemplo el máximo de memoria, el número de semáforos, etc. Vamos hacer un breve repaso alos mas destacados:

*zone_name; /* nombre de la zona */zoneid_t zone_id; /* ID de la zona */rctl_qty_t zone_locked_mem_ctl; /* límite máximo dememoria*/rctl_qty_t zone_max_swap_ctl; /* límite máximo deswap */[...]

También hay información de la zona, como por ejemplo:

char *zone_rootpath; /* path de la raíz de la zona */zone_status_t zone_status; /* en que estado esta actualmente lazona*/rctl_qty_t zone_nlwps; /* número de hilos ejecutándose */[...]

Podemos acceder fácilmente a ella usando mdb:

11.7. ¿Cómo funcionan las Zonas? 97

Page 104: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

bash-3.00# mdb -kLoading modules: [ unix genunix specfs dtrace uppc pcplusmp scsi_vhci ufs iphook neti sctp arp usba fctl nca lofs mpt audiosup zfs random sppp crypto ptmmd nfs cpc fcip fcp logindmux nsctl sdbc sv ii rdc ]> ::walk zonefec7f028d5072b40d884ac40> ::walk zonefec7f028d5072b40d884ac40> d5072b40 ::zone

ADDR ID NAME PATHd5072b40 1 linux /zone/root/> d884ac40 ::zone

ADDR ID NAME PATHd884ac40 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+8list_prev = 0xd5072b54

}zone_id = 0x3zone_ref = 0x13zone_cred_ref = 0x1ezone_rootvp = 0xd5074240zone_rootpath = 0xd884ed10 "/zone_OS/root/"zone_flags = 0zone_status = 3 (ZONE_IS_RUNNING)zone_ntasks = 0x11zone_nlwps_lock = {

_opaque = [ 0, 0 ]}

[...]

98 Capítulo 11. Zonas

Page 105: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 12

BrandZ y Linux

12.1 Introducción

Brandz es un tipo específico de zona que permite la ejecución de binarios no nativos dentro de ella. Esta tecno-logía se está desarrollando dentro de el proyecto OpenSolaris, puesto que aun no está finalizado puede que estedocumento quede obsoleto tras pasar algunos meses, sin embargo es difiícil que se produzca un cambio radical dediseño por lo que en su mayoría debería ser aplicable.

12.2 Linux dentro de un Brandz

Aunque con la tecnología de los brandz podríamos ejecutar binarios de múltiples S.O. lo cierto es que actualmentesolo está probados versiones anteriores de Solaris y Linux. En este artículo nos centraremos en este último.

Dado que el formato de los ejecutables de Linux y OpenSolaris es el mismo (ELF) idealmente deberíamos poderprocesarlos sin más, sin embargo estos esperan unos servicios por parte del kernel, a los que suelen accedermediante llamadas al sistema que, lógicamente, son distintas en ambos S.O.. En el caso de Linux el problema vaincluso un paso más allá, ya que existen diferencias entre las distintas distribuciones dependiendo del nivel dekernel y de la versión de glibc.

12.3 Técnica de interposición

En Linux un proceso para usar una llamada al sistema ejecuta la interrupción 80, este método no existe en OpenSo-laris, para emularlo se ha diseñado una macro BRAND_CALLBACK() que captura ese punto de entrada. Una vezcapturado, en lugar de seguir el flujo normal dentro del kernel, esos hilos son procesados por un módulo específicopara tareas dentro de un brandz.

Existen otros puntos de interposición situados en el flujo de vida de un proceso para asegurar que el kernel prestatodos los servicios necesarios, como por ejemplo en la creación/salida de hilos, tratamiento de señales, etc.

Dicho módulo hace de traductor, es decir modifica el formato de la llamada al sistema de Linux a su equivalentea OpenSolaris. El ciclo de vida sería el siguiente:

1. El proceso Linux ejecuta la interrupción 80.

2. La macro BRAND_CALLBACK() comprueba si la interrupción tiene origen en un Brandz.

3. Opensolaris pasa el control del thread al módulo específico para brandz.

4. El módulo lx lanza la librería de emulación.

5. Dicha librería modifica la llamada al sistema para que sea compatible con OpenSolaris.

99

Page 106: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

6. El kernel de OpenSolaris procesa la llamada y devuelve la salida a la librería.

7. Otra vez se realizan las operaciones oportunas, ahora para adaptar la salida a lo que espera el proceso Linux.

8. La librería devuelve el resultado al proceso.

Puesto que los servicios del kernel tienen pequeñas variaciones dependiendo de la versión y de que las libreríasglibc usadas, a día de hoy (febrero del 2008) está probado y funciona de forma estable RHEL 3, se está trabajandopara que funcione RHEL 4 pero aun quedan algunos flecos.

12.4 Peculiaridades

A pesar que lo expuesto parece sencillo, su implementación práctica es compleja, ya que son numerosas laspeculiaridades con las que topamos, teneís una lista detallada en la web de la comunidad. A continuación explicoun par de ejemplos:

Algunas llamadas al sistema son muy diferentes entre OpenSolaris y Linux, algunas ni siquiera tienen equivalente.

Quizás el caso más llamativo es la llamada clone(), que Linux usa para crear un hijo y que no existe enOpenSolaris. 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 número de señales existentes en Linux y OpenSolaris para procesos en Real Time esdistinto, 32 vs 7, afortunadamente esas señales extras no tienen uso en la actualidad, por lo que directamente seignoran.

12.5 Caso Práctico

Crear un Brandz es sencillo, el procedimiento es identico a como crear una zona, solo que al ejecutar el createdebemos espcificar que use el módulo lx, por otro lado, cuando hacemos el install debemos especificar lafuente de donde se deben copiar los binarios.

Para ir rápido podeís descargar un tar de Centos 3.5 directamente de la web de la comidad OpenSolaris, os dejouna captura de la shell de todo el proceso:

# zonecfg -z linuxlinux: No such zone configuredUse ’create’ to begin configuring a new zone.zonecfg:linux> create -t SUNWlxzonecfg:linux> set zonepath=/linux-zonezonecfg:linux> commitzonecfg:linux> exit# mkdir /linux-zone# chmod 700 /linux-zonebash-3.2# zoneadm -z linux install -d /centos_fs_image.tarInstalling 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 -cvID NAME STATUS PATH BRAND IP

100 Capítulo 12. BrandZ y Linux

Page 107: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

0 global running / native shared- linux installed /linux-zone lx shared

bash-3.2# zomadm -z linux bootbash-3.2# zoneadm list -cv

ID NAME STATUS PATH BRAND IP0 global running / native shared1 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]

12.5. Caso Práctico 101

Page 108: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

102 Capítulo 12. BrandZ y Linux

Page 109: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 13

Virtualizando con xVM

En esta entrada vamos a hablar sobre una de las opciones de virtualización que podemos encontrar en OpenSolaris,se trata de xVM, un hypervisor basado en Xen, que nos permite arrancar varias instancias de distintos SO, comoLinux, Windows y Solaris, en una máquina 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 virtualización, HVM y PVM.

Migración de “invitados” en caliente.

Soporte para Intel VT-x y AMD-V.

13.1 Por qué utilizar xVM

En el siguiente esquema, podemos ver los cuatro nichos, que Solaris tiene para la gestión de los recursos.

No podemos olvidar que las distintas técnicas de virtualización, tienen como fin, no el que podamos disfrutar enuna máquina de un SO Linux, un Windows y varias versiones distintas de Solaris, aunque aparentemente suenatentador. El objetivo principal de utilizar tecnología de virtualización consiste en mejorar la forma en la que sehace uso de los recursos disponibles en un sistema.

103

Page 110: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Cualquier persona que haya administrado un número considerable de máquinas, conoce perfectamente que el usode CPU y memoria está muy por debajo de las posibilidades reales de la propia máquina, es normal que la mayoríade las máquinas se encuentren entre un 30 % y un 60 %, en entornos de desarrollo estos valores decrecen consi-derablemente. Si realizamos el ejercicio de calcular los recursos utilizados normalmente en nuestras máquinas ysumamos estos resultados, nos llevaremos una grata sorpresa, LOS RECURSOS DE LOS QUE DISPONEMOSESTÁN MUY POR ENCIMA DEL USO REAL QUE SE HACE DE LOS MISMO, os recomiendo que esta informa-ción nunca llegue al departamento financiero, porque el año siguiente recibiréis una desagradable sorpresa, al verreducido el presupuesto de vuestra área.

El objetivo de la virtualización es aprovechar de la mejor manera posible los recursos disponibles en nuestrossistemas. Sin entrar en detalles, los recursos mas preciados en un sistema son:

Tiempo de ejecución de CPU

Uso de la memoria

Entrada/Salida

13.1.1 Particiones físicas

En una máquina realizamos una serie de particiones a nivel físico de forma que se reparten los recursos disponiblesentre los distintos SO que van a ser ejecutados en la máquina. A todos los efectos disponemos de varias máquinas,esa es la visión que tiene el SO.

13.1.2 Máquinas virtuales

En una máquina podemos tener corriendo varias máquinas virtuales con distintos SO. En este caso los recursosson asignados mediante la utilización de un Hypervisor que se encarga de gestionar el acceso al HW, los distintosSO tienen asignados unos recursos que son controlados por el Hypervisor.

13.1.3 Virtualización de SO

La virtualicación de SO, consiste en que un SO anfitrión ejecuta varias instancias del mismo SO, asignando ygestionando los recursos del sistema. La impresión es de disponer varios sistemas con el mismo SO.

104 Capítulo 13. Virtualizando con xVM

Page 111: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

13.1.4 Control de recursos

Solaris dispone de una serie de herramientas para controlar los recursos del sistema. CPU, memoria, tiempo deCPU, de esta forma los recursos no son asignados a un SO invitado, sino que se asigna mediante políticas a losprocesos o grupos de procesos que están ejecutándose en el sistema.

xVM se encuentra dentro del nicho de máquinas virtuales y sería para x86 lo mismo que LDoms para SPARC.

13.2 Arquitectura

La arquitectura de un sistema con xVM consiste en:

Un hypervisor que controla el acceso a los recursos del sistema y sirve como capa de abstracción, entre losSO huéspedes y el HW.

Un dominio principal, denominado dom0, que se encarga de gestionar los recursos y los SO huéspedes.

Dominios de usuario, denominados domU, estos dominios son los distintos SO huéspedes que se ejecutaránen la máquina. Como SO huéspedes podemos tener:

• PVM (paravirtualización), todos aquellos SO cuyo kernel tenga soporte para Xen.

• HVM (virtualización total), el SO no necesita que su kernel disponga de soporte para Xen, la únicacondición es que los procesadores de nuestro sistema tengan, en caso de Intel® que tenga soporte paraVirtualization Technology y en AMD®, AMD-V.

13.2. Arquitectura 105

Page 112: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

13.3 Red

Los distintos domU acceden a dispositivos virtuales, que están asociado a dispositivos virtuales en el dom0 que asu vez se encuentran asociados a un dispositivo físico, como en este caso una interfaz de red bge0.

13.4 Dispositivos de bloque

Un dominio, puede ser bien el dominio de control dom0, bien cualquiera de los dominios de usuarios domU,pueden exportar un dispositivo de bloques, que puede ser a su vez, un dispositivo físico, como un disco o bienpuede ser un fichero del FS, el cual es exportado al domU y éste la visión que tendrá será la de que está accediendoa un dispositivo de bloques.

Dispositivo físico disk = [‘phy:dispositivo_dom0, disp_domU, rw’]

Fichero disk = [‘file:file_dom0, disp_domU, rw’]

13.5 ¿Tiene nuestro sistema soporte para xVM?

xVM esta disponible desde la build 75 de Solaris Express. Para comprobar que tenemos instalado en nuestramaquina xVM, podemos chequear el directorio /boot/:

bash-3.2# cd /boot/bash-3.2# lsacpi grub solaris x86.miniroot-safe xen.gzamd64 platform solaris.xpm xen-symsbash-3.2#

En la salida anterior podemos comprobar que existe un kernel con soporte para Xen, el fichero es xen.gz. Tambiénpodemos chequear el estado de los servicios en SMF:

bash-3.2# svcs | grep xvmdisabled 23:36:20 svc:/system/xvm/store:default

106 Capítulo 13. Virtualizando con xVM

Page 113: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

disabled 23:36:20 svc:/system/xvm/domains:defaultdisabled 23:36:21 svc:/system/xvm/console:defaultdisabled 23:36:22 svc:/system/xvm/xend:defaultbash-3.2#

13.6 Los servicios de xVM

xVM cuenta con 4 servicios en el sistema de arranque SMF, estos 4 servicios deben estar habilitados para quepodamos trabajar con xVM.

svc:/system/xvm/store:default controla la configuración de los distintos dominios creados en el sis-tema.

svc:/system/xvm/xend:default gestiona al demonio que controla todos los dominios

svc:/system/xvm/console:default se encarga de controlar las consolas de los dominios.

svc:/system/xvm/domains:default se encarga de la parada/arranque de los dominios durante la para-da/arranque del sistema.

13.7 GRUB para xVM

En el apartado anterior hemos comprobado que nuestro sistema puede correr con xVM, el siguiente paso consistesen arrancar el kernel con soporte para Xen, para ello, vamos añadir a GRUB las siguientes líneas:

bash-3.2# cat /boot/grub/menu.lst#--------------------- xVM 64bits--------------------title Solaris xVMkernel$ /boot/$ISADIR/xen.gzmodule$ /platform/i86xpv/kernel/$ISADIR/unix /platform/i86xpv/kernel/$ISADIR/unixmodule$ /platform/i86pc/$ISADIR/boot_archive#----------------------------------------------------

#--------------------- xVM 32bits--------------------title Solaris xVM 32bitskernel$ /boot/xen.gzmodule$ /platform/i86xpv/kernel/unix /platform/i86xpv/kernel/unixmodule$ /platform/i86pc/boot_archive#----------------------------------------------------

Hemos añadido 2 entradas en GRUB, una para que arranque xVM en 64bits y otra en 32bits. La razón principalpara añadir una entra para 32bits, es que si el dom0 esta en 64bits,los SO de los distintos domU también debencorrer en 64bits y si el dom0 esta corriendo a 32bits, todos los domU deben correr a 32bits.

13.8 Herramientas para xVM

La gestión de los distintos domU que vayamos a tener en nuestro sistema la podemos realizar con 4 herramientas:

virt-install consiste en un script que nos ayuda en el proceso de instalación de un nuevo domU, podemosejecutarlo, pasando una serie de parámetros o bien ejecutarlo sin ningún parámetro e iremos contestando auna serie de preguntas.

virsh es una shell con la que podemos gestionar los distintos domU que tengamos creados en nuestro sistema.

xm este comando nos permite realizar la gestión de los domU desde la linea de comando, mediante la utilizaciónde una serie de parámetros.

virt-manager es un sencillo GUI que nos ayuda con la gestión de los domU.

13.6. Los servicios de xVM 107

Page 114: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

13.9 Directorios

Entre los directorios utilizados por xVM, vamos a destacar los siguientes, por que son donde se almacenan losficheros que vamos a necesitar cuando comencemos a trabajar con xVM:

/var/log/xen se utiliza para almacenar los logs, es importante echar un vistazo a este directorio, ya que loserrores que devuelven los distintos comandos no son demasiado descriptivos.

/var/lib/xend/domains cada dominio que creemos disponde de un directorio, identificado con el ID deldominio. Existe un directorio por cada dominio.

/var/xen/dump en este directorio se almacenan, por defecto, los ficheros cores que se crean cuando los soli-citamos con el subcomando dump-core de xm.

13.10 Creando un domU con Linux Centos

La creación de un nuevo domU, es un proceso bastante sencillo, la parte más complicada está en la propia instala-ción del SO que se realizará sobre el nuevo domU. Para el ejemplo, vamos a utilizar una imagen ISO del DVD deinstalación de Centos 5.1, esta es la imagen de uno de los mirror oficiales.

Vamos a realizar la instalación utilizando el comando virt-install, al que pasaremos los siguientes paráme-tros:

-n centos_x64_2 nombre para el nuevo domU

-r 512 cantidad de memoria asignada al nuevo dominio, en MB

-f /export/home/xen/CentOS-5.1/centos_51_x64_2.img fichero de imagen se se utilizará co-mo disco root del nuevo dominio.

-s 5 tamaño en GB de disco.

-nographics no queremos configurar la consola gráfica para el nuevo dominio.

-paravirt vamos a utilizar la paravirtualización

-os-type=linux el SO que vamos a instalar en el domU es de tipo linux.

-l /export/home/root/Desktop/CentOS-5.1-x86_64-bin-DVD.iso es el fichero con la ima-gen 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:00Creating domain... 0 B 00:06Bootdata ok (command line is method=/export/home/root/Desktop/CentOS-5.1-x86_64-bin-DVD.iso)Linux version 2.6.18-53.el5xen ([email protected]) (gcc version 4.1.2 20070626 (Red Hat 4.1.2-14)) #1 SMP Mon Nov 12 02:46:57 EST 2007BIOS-provided physical RAM map:Xen: 0000000000000000 - 0000000020800000 (usable)

No mptable found.Built 1 zonelists. Total pages: 133120Kernel command line: method=/export/home/root/Desktop/CentOS-5.1-x86_64-bin-DVD.isoInitializing CPU#0PID hash table entries: 4096 (order: 12, 32768 bytes)Xen reported: 2194.498 MHz processor.Console: colour dummy device 80x25Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)Inode-cache hash table entries: 65536 (order: 7, 524288 bytes)Software IO TLB disabledMemory: 500480k/532480k available (2357k kernel code, 23224k reserved, 1326k data, 172k init)Calibrating delay using timer specific routine.. 5489.47 BogoMIPS (lpj=10978940)

108 Capítulo 13. Virtualizando con xVM

Page 115: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Security Framework v1.0.0 initializedSELinux: 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 || || +----+ || | OK | || +----+ || || |+---------------------------------------+

/ between elements | selects | next screen

Para el ejemplo utilizaremos la opción de instalar mediante NFS, para ellos utilizaremos como servidor NFSnuestro dom0 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, también 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

13.10. Creando un domU con Linux Centos 109

Page 116: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Una vez terminado el proceso de instalación, podemos arrancar el nuevo domU en el que hemos instalado nuestroCentOS, con el comando xm start arrancaremos el dominio centos_x64:

(huelva@dom0)# xm start centos_x64(huelva@dom0)# xm listName ID Mem VCPUs State Time(s)Domain-0 0 774 2 r----- 389.4centos_x64 30 720 2 -b---- 39.0(huelva@dom0)#

Nuestro CentOS está arrancando, podemos conectarnos a la consola del nuevo dominio, utilizando el comando xmconsole:

bash-3.2# xm console centos_x64rtc: 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...Found volume group "VolGroup00" using metadata type lvm22 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 filesystemsChecking 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: 3Entering non-interactive startupApplying 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)

110 Capítulo 13. Virtualizando con xVM

Page 117: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Kernel 2.6.18-53.el5xen on an x86_64trantor login:

La siguiente imagen muestra como podemos exportar el display de nuestra máquina virtual centos_x64 paratrabajar con el entorno KDE, desde una ventana de Xnest

13.11 Parando un domU

Para parar un domU, podemos utilizar varios subcomandos del comando xm:

xm destroy esto es parecido a meter un botonazo al domU:

(huelva@dom0)# xm listName ID Mem VCPUs State Time(s)Domain-0 0 774 2 r----- 389.4centos_x64 30 720 2 -b---- 39.0(huelva@dom0)#(huelva@dom0)# xm destroy centos_x64(huelva@dom0)# xm listName ID Mem VCPUs State Time(s)Domain-0 0 774 2 r----- 391.7centos_x64 512 1 0.0(huelva@dom0)#

xm reboot provoca un reboot en el domU.

13.11. Parando un domU 111

Page 118: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

13.12 Pausando un domU

Tenemos dos formas de suspender la ejecución de un domU y volver a ejecutarla cuando nosotros deseemos:

xm pause provoca una pausa en la ejecución del domU. Para que el dominio vuelva a ejecutarse utilizaremos elcomando xm unpause:

(huelva@dom0)# xm pause centos_x64(huelva@dom0)# xm listName ID Mem VCPUs State Time(s)Domain-0 0 1485 2 r----- 256.9centos_x64 6 512 1 --p--- 40.7solaris_11_x64 750 1 64.8(huelva@dom0)#

xm suspend en este caso se provoca una suspensión del dominio, se almacena en disco el estado de ejecucióndel dominio y se para, de echo podriamos volver a ejecutar el dominio, bien con el comando xm resume obien volviendo a arrancarlo con el comando xm start, es este caso arrancaría como si hubiéramos dadoun botonazo al dominio:

(huelva@dom0)# xm listName ID Mem VCPUs State Time(s)Domain-0 0 1479 2 r----- 366.0centos_x64 8 511 1 -b---- 0.1solaris_11_x64 750 1 64.8(huelva@dom0)#(huelva@dom0)# xm suspend centos_x64(huelva@dom0)# xm listName ID Mem VCPUs State Time(s)Domain-0 0 1479 2 r----- 374.7centos_x64 1 1 0.1solaris_11_x64 750 1 64.8

Como podemos ver en el ejemplo, al suspender un dominio no tiene estado en la columna state.

13.13 Puntos de Control

Tenemos la posibilidad de almacenar en un fichero, la ejecución de un dominio en un determinado instante, estonos 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 línea anterior hemos creado un fichero con la imagen de la ejecución del dominio centos_x64 en unmomento determinado, justo después hemos utilizado el comando xm restore para continuar la ejecución. Eltiempo que el dominio ha estado parado correspondo con el tiempo que hemos tardado en almacenar en disco elfichero. Si no ejecutamos el comando xm restore el dominio estará offline.

13.14 Borrando un domU

Para borrar un domU, necesitamos que primero esté parado y posteriormente podemos utilizar el comando xmdelete:

(huelva@dom0)# xm listName ID Mem VCPUs State Time(s)Domain-0 0 774 2 r----- 391.7

112 Capítulo 13. Virtualizando con xVM

Page 119: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

centos_x64 512 1 0.0(huelva@dom0)#(huelva@dom0)# xm delete centos_x64(huelva@dom0)# xm listName ID Mem VCPUs State Time(s)Domain-0 0 774 2 r----- 392.6(huelva@dom0)#

El domU centos_x64 ha sido eliminado, pero el fichero que hemos utilizado como disco root continua en sudirectorio original, por lo que podemos utilizarlo para otra prueba. El comando xm delete solo elimina lasconfiguraciones del domU que utiliza xVM.

13.15 Asignando CPU a un domU

Al crear el domU se le asigna un número de CPUs determinado, con el comando xm podemos cambiar, posterior-mente, el número de CPUs asignados a un domU:

(huelva@dom0)# xm listName ID Mem VCPUs State Time(s)Domain-0 0 774 2 r----- 389.4centos_x64 30 512 1 -b---- 39.0(huelva@dom0)# xm vcpu-set centos_x64 2(huelva@dom0)# xm listName ID Mem VCPUs State Time(s)Domain-0 0 774 2 r----- 389.4centos_x64 30 512 2 -b---- 39.0

Si modificamos el número de CPUs, debemos reiniciar el domU para que el cambio tenga efecto:

[trantor@domU ~]# init 6...[trantor@domU ~]# cat /proc/cpuinfoprocessor : 0vendor_id : GenuineIntelcpu family : 6model : 15model name : Intel(R) Core(TM)2 Duo CPU E4500 @ 2.20GHzstepping : 13cpu MHz : 2194.500cache size : 2048 KBphysical id : 0siblings : 1core id : 0cpu cores : 1fpu : yesfpu_exception : yescpuid level : 10wp : yesflags : fpu tsc msr pae mce cx8 apic mca cmov pat pse36 clflush dts acpi mmx fxsrsse sse2 ss ht tm syscall nx lm constant_tsc pni monitor ds_cpl est tm2 cx16 xtpr lahf_lmbogomips : 5489.33clflush size : 64cache_alignment : 64address sizes : 36 bits physical, 48 bits virtualpower management:processor : 1vendor_id : GenuineIntelcpu family : 6model : 15

13.15. Asignando CPU a un domU 113

Page 120: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

model name : Intel(R) Core(TM)2 Duo CPU E4500 @ 2.20GHzstepping : 13cpu MHz : 2194.500cache size : 2048 KBphysical id : 1siblings : 1core id : 0cpu cores : 1fpu : yesfpu_exception : yescpuid level : 10wp : yesflags : fpu tsc msr pae mce cx8 apic mca cmov pat pse36 clflush dts acpi mmx fxsrsse sse2 ss ht tm syscall nx lm constant_tsc pni monitor ds_cpl est tm2 cx16 xtpr lahf_lmbogomips : 5489.33clflush size : 64cache_alignment : 64address sizes : 36 bits physical, 48 bits virtualpower management:[trantor@domU ~]

13.16 Asignando memoria a un domU

Al crear un nuevo domU se le asigna una cantidad de memoria, con el comando xm mem-set y xm mem-maxpodemos modificar la cantidad de memoria asignada a un domU:

(huelva@dom0)# xm listName ID Mem VCPUs State Time(s)Domain-0 0 774 2 r----- 389.4centos_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 listName ID Mem VCPUs State Time(s)Domain-0 0 774 2 r----- 389.4centos_x64 30 720 2 -b---- 39.0(huelva@dom0)#

Al igual que ocurre con los cambios en el número de CPUs, cuando realizamos cambios en la cantidad de memoriaasignada a un domU, debemos reiniciar el domU para que los cambios tengan efecto:

[trantor@domU ~] init 6...[trantor@domU ~]# cat /proc/meminfoMemTotal: 737280 kBMemFree: 462248 kBBuffers: 12920 kBCached: 152432 kBSwapCached: 0 kBActive: 70148 kBInactive: 144184 kBHighTotal: 0 kBHighFree: 0 kBLowTotal: 737280 kBLowFree: 462248 kBSwapTotal: 1081336 kBSwapFree: 1081336 kBDirty: 764 kBWriteback: 0 kB

114 Capítulo 13. Virtualizando con xVM

Page 121: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

AnonPages: 49060 kBMapped: 9012 kBSlab: 18428 kBPageTables: 2996 kBNFS_Unstable: 0 kBBounce: 0 kBCommitLimit: 1449976 kBCommitted_AS: 94868 kBVmallocTotal: 34359738367 kBVmallocUsed: 1160 kBVmallocChunk: 34359736511 kB

13.17 Asignando interfaz de red un domU

Podemos añadir interfaces de red a un domU ya creado utilizando el comando xm network-attach, estecomando acepta una serie de parámetros, que nos permitirán definir las características del nuevo interfaz:

(huelva@dom0)# xm network-attach centos_x64Si vemos el fichero /var/log/messages del domU.[trantor@domU]# tail -f /var/log/messages | grep devicetrantor kernel: netfront: device eth1 has flipping receive path.

Vemos como el dispositivo eth1 ha sido añadido al sistema, al contrario de lo que ocurre con los cambios enCPUs y memoria, en este caso no necesitamos reiniciar el domU.

13.18 Asignando un nuevo disco a un domU

Vamos a ver cómo podemos asignar un nuevo disco a un domU que está corriendo. Lo primero que tenemos quehacer es decidir, qué vamos a utilizar como almacenamiento, para nuestro ejemplo utilizaremos un fichero de50MB, que crearemos con el comando dd:

(huelva@dom0)# dd if=/dev/zero of=/var/prueba/discos1.img count=100000100000+0 records in100000+0 records out(huelva@dom0)#

Una vez creado el fichero, lo asignamos al dominio centos_x64:

(huelva@dom0)# xm block-attach centos_x64 file:/var/prueba/discos1.img hdd1 w(huelva@dom0)#

Le hemos dado el nombre hdd1 al nuevo dispositivo asignado al domU. Si antes de asignar el dispositivo, tenemosuna sesión abierta con la consola del domU centos_x64, veremos como el sistema registra el nuevo dispositivo yaparece un mensaje parecido a “Registering block device major 22”, este mensaje dependerá el SO que tenemosinstalado en el domU. Con el comando ls podemos comprobar que en el directorio /dev/ del domU a aparecidoel dispositivo hdd1, ejecutamos el comando fdisk sobre el nuevo disco:

[trantor@domU ]# Registering block device major 22[trantor@domU ]# lsconsole loop3 parport3 ram4 tty tty22 tty37 tty51 tty9core loop4 port ram5 tty0 tty23 tty38 tty52 ttyS0cpu loop5 ppp ram6 tty1 tty24 tty39 tty53 ttyS1disk loop6 ptmx ram7 tty10 tty25 tty4 tty54 ttyS2evtchn loop7 pts ram8 tty11 tty26 tty40 tty55 ttyS3fd MAKEDEV ram ram9 tty12 tty27 tty41 tty56 urandomfull mapper ram0 ramdisk tty13 tty28 tty42 tty57 vcs

13.17. Asignando interfaz de red un domU 115

Page 122: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

gpmctl md0 ram1 random tty14 tty29 tty43 tty58 vcsahdd1 mem ram10 rawctl tty15 tty3 tty44 tty59 VolGroup00initctl net ram11 root tty16 tty30 tty45 tty6 X0Rinput null ram12 rtc tty17 tty31 tty46 tty60 xvc0kmsg nvram ram13 shm tty18 tty32 tty47 tty61 xvdalog oldmem ram14 stderr tty19 tty33 tty48 tty62 xvda1loop0 parport0 ram15 stdin tty2 tty34 tty49 tty63 xvda2loop1 parport1 ram2 stdout tty20 tty35 tty5 tty7 xvdbloop2 parport2 ram3 systty tty21 tty36 tty50 tty8 zero[trantor@domU ]# fdisk /dev/hdd1Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabelBuilding a new DOS disklabel. Changes will remain in memory only,until you decide to write them. After that, of course, the previouscontent won’t be recoverable.Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)Command (m for help): pDisk /dev/hdd1: 51 MB, 51200000 bytes255 heads, 63 sectors/track, 6 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Blocks Id SystemCommand (m for help):

13.19 Creando un domU con Solaris Express

Vamos a realizar una instalación básica de un Solaris en un nuevo domU, para la instalación utilizaremos la imagenISO del primer disco. Utilizaremos el comando virt-install y utilizaremos los siguientes parámetros:

-n solaris_11_x64 nombre para el nuevo domU

-r 512 cantidad de memoria asignada al nuevo dominio, en MB

-f /export/home/xen/Solaris_11/solaris_11_x64.img fichero de imagen se se utilizará comodisco root del nuevo dominio.

-s 5 tamaño en GB de disco.

-nographics no queremos configurar la consola gráfica para el nuevo dominio.

-paravirt vamos a utilizar la paravirtualización

-os-type=solaris el SO que vamos a instalar en el domU es de tipo linux.

-l /export/home/IMAGES/Solaris_11_x86_1.iso es el fichero con la imagen de un SO que utili-zaremos 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:00Creating domain... 0 B 00:07v3.0.4-1-xvm chgset ’Mon Nov 12 23:09:42 2007 -0800 13228:ed897008a4c9’SunOS Release 5.11 Version snv_78 64-bitCopyright 1983-2007 Sun Microsystems, Inc. All rights reserved.Use is subject to license terms.Configuring /devSolaris Interactive Text (Console session)Using install cd in /dev/dsk/c0d1p0Using RPC Bootparams for network configuration information.Attempting to configure interface xnf0...Skipped interface xnf0Reading ZFS config: done.Setting up Java. Please wait...

116 Capítulo 13. Virtualizando con xVM

Page 123: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Y tanto que esperé, de aquí no pasó la instalación, tuve que subir a 750MB la memoria asignada para que la instalación 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:06v3.0.4-1-xvm chgset ’Mon Nov 12 23:09:42 2007 -0800 13228:ed897008a4c9’SunOS Release 5.11 Version snv_78 64-bitCopyright 1983-2007 Sun Microsystems, Inc. All rights reserved.Use is subject to license terms.Configuring /devSolaris Interactive Text (Console session)Using install cd in /dev/dsk/c0d1p0Using RPC Bootparams for network configuration information.Attempting to configure interface xnf0...Skipped interface xnf0Reading 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. English2. French3. German4. Italian5. Japanese6. Korean7. Simplified Chinese8. Spanish9. Swedish10. 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 sectionswhere you’ll be prompted to provide information for the installation. Atthe end of each section, you’ll be able to change the selections you’vemade before continuing.

About navigation...- The mouse cannot be used- If your keyboard does not have function keys, or they do notrespond, press ESC; the legend at the bottom of the screenwill 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 configureitself. Choose Yes if DHCP is to be used, or No if the network interface isto be configured manually.

NOTE: DHCP support will not be enabled, if selected, until after the systemreboots.

13.19. Creando un domU con Solaris Express 117

Page 124: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Use DHCP for xnf0-----------------[ ] Yes[X] No

--------------------------------------------------------------------------------Esc-2_Continue Esc-6_Help

- Confirm Information for xnf0 -------------------------------------------------

> Confirm the following information. If it is correct, press F2;to change any information, press F4.

Networked: YesUse DHCP: No

Host name: mordorIP address: 192.168.0.190

System part of a subnet: YesNetmask: 255.255.255.0

Enable IPv6: NoDefault 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 atime zone in three ways: select one of the continents or oceans from thelist, select other - offset from GMT, or other - specify time zone file.

> To make a selection, use the arrow keys to highlight the option andpress Return to mark it [X].

Continents and Oceans----------------------------------

- [ ] Africa¦ [ ] Americas¦ [ ] Antarctica¦ [ ] Arctic Ocean¦ [ ] Asia¦ [ ] Atlantic Ocean¦ [ ] Australia¦ [X] Europev [ ] 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 bootdevice.

============================================================================

- Installation Option: Initial¦ Boot Device: c0d0¦ Client Services: None

118 Capítulo 13. Virtualizando con xVM

Page 125: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

¦¦ Locales: Spain (ISO8859-1)¦ System Locale: C ( C )¦¦ Software: Solaris 11, Core System Support¦¦ File System and Disk Layout: / c0d0s0 1134 MBv swap c0d0s1 512 MB

--------------------------------------------------------------------------------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 tothe next step unless you select "Pause". Enter ’p’ to pause. Enter ’c’ tocontinue. [c]

Unable to run Launcher without Java.The following CDs will not be installed:Solaris Software 2 for x86 PlatformsCreating ram disk for /aupdating /a/platform/i86pc/boot_archive...this may take a minuteupdating /a/platform/i86pc/amd64/boot_archive...this may take a minutesyncing file systems... donerebooting...

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-bitCopyright 1983-2007 Sun Microsystems, Inc. All rights reserved.Use is subject to license terms.Hostname: mordorConfiguring devices.Loading smf(5) service descriptions: 114/114/dev/rdsk/c0d0s7 is cleanReading ZFS config: done.

mordor console login: rootMar 12 22:36:29 mordor login: ROOT LOGIN /dev/consoleSun Microsystems Inc. SunOS 5.11 snv_78 October 2007mordor# uname -aSunOS mordor 5.11 snv_78 i86pc i386 i86xpvmordor#

mordor# df -kFilesystem kbytes used avail capacity Mounted on/dev/dsk/c0d0s0 1125599 595232 474088 56% //devices 0 0 0 0% /devices/dev 0 0 0 0% /devctfs 0 0 0 0% /system/contractproc 0 0 0 0% /procmnttab 0 0 0 0% /etc/mnttabswap 1073356 376 1072980 1% /etc/svc/volatileobjfs 0 0 0 0% /system/objectsharefs 0 0 0 0% /etc/dfs/sharetab/usr/lib/libc/libc_hwcap3.so.1

13.19. Creando un domU con Solaris Express 119

Page 126: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

1125599 595232 474088 56% /lib/libc.so.1fd 0 0 0 0% /dev/fdswap 1072980 0 1072980 0% /tmpswap 1072992 12 1072980 1% /var/run/dev/dsk/c0d0s7 3494494 3489 3456061 1% /export/homemordor#

120 Capítulo 13. Virtualizando con xVM

Page 127: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 14

Navegando en el /proc

Todos los sistemas Unix disponen de una serie de ficheros, los cuales mantienen información sobre los distintosprocesos que se están ejecutando en la máquina, Solaris utiliza un pseudo sistemas de ficheros llamado Procfs, enel cual, el kernel mantiene información sobre los procesos que está corriendo.

El sistema de archivos procfs está organizado en directorios, uno por cada proceso en que se ejecuta en la máquina,los directorios se llaman con el PID del proceso del cual mantienen la información:

(root@huelva)# cd /proc(root@huelva)# ls0 14470 18279 19575 22216 2496 28190 3782 4622 6051 1464 18340 19604 22610 25190 28252 398 4636 60610192 1465 18709 19634 22645 25229 285 421 472 634710622 14896 18779 2 23054 25479 28610 4210 476 66411058 15321 18973 20009 23072 25626 28685 439 496 677511478 15751 18983 20063 23484 25656 29038 442 5021 67811906 16187 19031 20450 23505 26047 29039 4428 505 6791215 1646 19047 20490 23785 26089 29124 445 5061 68012332 16460 19059 2072 23909 26474 2926 4608 507 7077127 16611 19064 20881 23945 26528 29464 4609 508 708212756 16959 19086 20923 24099 26900 29888 4610 520 720413186 17051 19092 21312 24121 26951 3 4611 523 7313622 17405 19100 21362 24336 27324 326 4613 5491 76281372 17480 19105 21744 24369 27382 3362 4614 552 78414 17849 19141 21785 24764 27754 353 4619 554 78914042 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 cualespodemos obtener información sobre el proceso y todos sus LWP:

(root@huelva)# cd 29039(root@huelva)# ls -ltotal 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 ctllr-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 lusagedr-xr-xr-x 5 nagios nagios 80 Apr 11 12:13 lwp

121

Page 128: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

-r-------- 1 nagios nagios 3744 Apr 11 12:13 mapdr-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 rmaplr-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/<pid>/as Este fichero contiene una imagen del espacio de direcciones del proceso, podemos abrirlopara realizar tanto lecturas como escrituras.

/proc/<pid>/auxv Contiene una array de elementos de tipo auxv_t los cuales son pasados al linkador diná-mico en el momento en el que se arrancó el proceso.

/proc/<pid>/cred Este fichero contiene la descripción de las credenciales del proceso. Las credenciales delproceso las define la estructura de datos struct prcred que podemos encontrar el fichero de cabecerasys/procfs.h.

/proc/<pid>/ctl Este fichero es solo de lectura y lo podemos utilizar para enviar mensajes de control alproceso.

/proc/<pid>/cwd Es un enlace simbólico al directorio actual de trabajo del proceso.

/proc/<pid>/fd/ Este directorio contiene una referencia a cada uno de los descriptores de ficheros que tieneabierto el proceso.

/proc/<pid>/psinfo Este fichero contiene información del proceso, tal como el PID del su proceso padre,la lista de argumentos, el tamaño de la imagen del proceso en memoria. Para obtener la información de estefichero debemos utilizar una estructura de datos de tipo struct psinfo que está definida en el ficherosys/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 */

122 Capítulo 14. Navegando en el /proc

Page 129: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

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/<pid>/map Consiste en un array de elementos del tipo struct prmap los cuales representan unmapa del espacio de direcciones del proceso.

/proc/<pid>/rmap Exactamente igual que ocurría con el fichero map, el fichero rmap contien un array deelementos de tipo struct prmap los cuales representan los rangos de direcciones reservadas del procesodentro de su espacio de direcciones.

/proc/<pid>/xmap Contiene información extendida sobre el espacio de direcciones del proceso. Para po-der leer correctamente el contenido de este fichero necesitaremos utilizar un elemento de tipo structprxmap, cuya definición podemos encontrar en sys/procfs.h

/proc/<pid>/object/ Es un directorio que contiene los objetos binarios que han sido linkados en el arran-que del proceso.

/proc/<pid>/pagedata Contiene una representación del espacio de direcciones del proceso, de las cualpodemos sacar información como el número de páginas que conforman un mapeo de memoria concreto.

/proc/<pid>/sigact Contiene información sobre las acciones asignadas a las señales que serán tratadaspor el proceso.

/proc/<pid>/status Contiene información de estado del proceso, para poder leer esta información co-rrectamente, debemos utilizar un elemento de tipo struct pstatus que está definido en el ficherosys/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;

123

Page 130: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

/proc/<pid>/usage Este fichero contiene información sobre estadísticas del proceso, tales como tiemposde uso de CPU, tiempos de fallos de páginas, número de llamadas a sistema, etc. Para poder leer todaesta información necesitamos utilizar la estructura de datos struct prusage, la cual está definida en elfichero sys/procfs.h.

/proc/<pid>/watch Contiene un array con todos los watchpoints activos en el proceso.

/proc/<pid>/lwp/ Este directorio contiene a su vez un subdirectorio por cada LWP del proceso, el nombrede este subdirectorio corresponde con el ID del LWP.

/proc/<pid>/lwp/<lwpid>/lwpctl Al igual que podemos enviar mensajes de control al proceso, pode-mos hacer lo mismo con cada LWP, mediante este fichero que es de solo escritura.

/proc/<pid>/lwp/<lwpid>/lwpsinfo Contiene información del LWP tal como el id del procesador enel que ha corrido, uso de CPU o la dirección de la WCHAN que tiene asociado el LWP. Para poder leertoda esta información necesitamos un elemento de tipo struct lwpsinfo, cuya definición podemosencontrarla en el fichero sys/procfs.h.

/proc/<pid>/lwp/<lwpid>/lwpstatus Contiene información de estado del LWP, para acceder a estainformación necesitamos un elemento de tipo struct lwpstatus.

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/<pid>/lwp/<lwpid>/lwpusage Al igual que la información de uso del proceso, cada LWP dis-pone de una fichero del que podemos obtener información sobre el uso de CPU, tiempo de fallo de página,señales recibidas. Para leer el fichero necesitamos utilizar un elemento de tipo struct prusage, ladefinición de este tipo la podemos encontrar en el fichero sys/procfs.h.

/proc/<pid>/lpsinfo El fichero está formado por una cabecera, la cual tiene un estructura de tipo structprheader, dicha cabecera está formada por 2 campos, uno con el número de elementos y otro con eltamaño 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 lwpsinfo.

/proc/<pid>/lstatus Al igual que en el caso anterior, este fichero contiene información de estado de todoslos LWP que tiene el proceso, para ello se utiliza una cabecera de tipo struct prheader, dicha cabeceraestá formada por 2 campos, uno con el número de elementos y otro con el tamaño de cada elemento. A la

124 Capítulo 14. Navegando en el /proc

Page 131: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

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 lwpstatus.

/proc/<pid>/lusage El fichero está formado por una cabecera, la cual tiene un estructura de tipo structprheader, dicha cabecera está formada por 2 campos, uno con el número de elementos y otro con eltamaño 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 definición de la estructura de datos prheader, la podemos encontrar en el fichero sys/procfs.h

typedef struct prheader {long pr_nent; /* number of entries */long pr_entsize; /* size of each entry, in bytes */

} prheader_t;

14.1 Espacio 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 puedeacceder. Un espacio de direcciones está formando por, al menos, 4 segmentos, el segmento de texto, el segmentode datos, el heap y el stack.

En el sistema de archivos /proc el SO mantiene un fichero el cual es una representación del mapa de direcciones/proc/<PID>/map.

Empezaremos con un sencillo programa que nos permitirá representar el mapa de direcciones del espacio de di-recciones 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/<PID>/map el cual está formando porun array de elementos de tipo struct prmap, este tipo de datos está definido en el fichero sys/procfs.h,la estructura prmap la forman, entre otros, los siguientes campos:

pr_vaddr Dirección de memoria del segmentopr_size Tamaño en bytes del segmentopr_mapname Nombre del fichero que está mapeado en el segmento.pr_mflags Atributos del segmento.pr_pagesize Tamaño de página del segmento.

El siguiente programa acepta como único parámetro el PID de un proceso, para abrir el fichero/proc/<PID>/map, como sabemos el fichero está formando por un array de elementos de tipo structprmap.

Programa proc_lwp_map.c:

1 #include <stdio.h>2 #include <sys/types.h>3 #include <sys/stat.h>4 #include <fcntl.h>5

6 #define _STRUCTURED_PROC 17

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;}

14.1. Espacio de direcciones de un proceso 125

Page 132: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

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 else41 {printf("-");}42

43 if(pmap.pr_mflags & MA_WRITE)44 {printf("w");}45 else46 {printf("-");}47

48 if(pmap.pr_mflags & MA_EXEC)49 {printf("x");}50 else51 {printf("-");}52

53 if(pmap.pr_mflags & MA_SHARED)54 {printf("s");}55 else56 {printf("-");}57

58 if(pmap.pr_mflags & MA_ANON)59 {printf("A");}60 else61 {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 ejecución será algo parecido a esto:

(root@huelva)# ./proc_lwp_map 520

Addr Size PSize Flags Object-------------------------------------------------------

0x00010000 888K 8192 r-x-- a.out0x000fe000 72K 8192 rwx-- a.out0x00110000 224K 8192 rwx-A0xfef60000 16K 8192 r-x-- ufs.273.0.737010xfef72000 16K 8192 rwx-- ufs.273.0.73701

126 Capítulo 14. Navegando en el /proc

Page 133: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

0xfef80000 688K 8192 r-x-- ufs.273.0.27940xff03c000 32K 8192 rwx-- ufs.273.0.27940xff060000 40K 8192 r-x-- ufs.273.0.27910xff07a000 8K 8192 rwx-- ufs.273.0.27910xff080000 888K 8192 r-x-- ufs.273.0.28260xff16e000 40K 8192 rwx-- ufs.273.0.28260xff178000 24K 8192 rwx-A0xff190000 8K 8192 rwx-A0xff1a0000 8K 8192 r-x-- ufs.273.0.28080xff1b2000 8K 8192 rwx-- ufs.273.0.28080xff1c0000 8K 8192 r-x-- ufs.273.0.28330xff1d2000 8K 8192 rwx-- ufs.273.0.28330xff1e0000 24K 8192 r-x-- ufs.273.0.28520xff1f6000 8K 8192 rwx-- ufs.273.0.28520xff200000 568K 8192 r-x-- ufs.273.0.28390xff29e000 40K 8192 rwx-- ufs.273.0.28390xff2a8000 24K 8192 rwx-A0xff2c0000 16K 8192 r-x-- ufs.273.0.28360xff2d4000 8K 8192 rwx-- ufs.273.0.28360xff2e0000 128K 8192 r-x-- ufs.273.0.28590xff300000 16K 8192 rwx-- ufs.273.0.28590xff310000 8K 8192 rwx-A0xff320000 40K 8192 r-x-- ufs.273.0.28600xff33a000 8K 8192 rwx-- ufs.273.0.28600xff340000 248K 8192 r-x-- ufs.273.0.28500xff38e000 16K 8192 rwx-- ufs.273.0.28500xff3a0000 8K 8192 r-x-- ufs.273.0.32380xff3b0000 184K 8192 r-x-- ufs.273.0.14480xff3ee000 8K 8192 rwx-- ufs.273.0.14480xff3f0000 8K 8192 rwx-A0xff3fa000 8K 8192 rwx-- ufs.273.0.28070xffbee000 72K 8192 rw--A

(root@huelva)#

La salida está compuesta por una serie de líneas, una por cada segmento que formen el espacio de direccionesdel proceso, la primera es la dirección de memoria en la que podemos localizar el segmento, la última columnapresenta el nombre del fichero que se ha mapeado en el segmento, el tamaño de un segmento no tiene por quécoincidir con el tamaño 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 elfichero cuyo inodo es 2794:

(root@huelva)# ls -li | grep 27942794 -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 librerías que se han linkado en el ejecutable. Como podemosver la salida es bastante parecida a la que obtendríamos con el programa pmap.

Uno de los ficheros más interesante que podemos encontrar en el FS /proc, es sin duda /proc/<PID>/as,el cual contiene una imagen del espacio de direcciones de memoria del proceso. Para leer el contenido de estefichero no necesitamos ningún tipo de estructura de datos, ni está formado por arrays, sencillamente son datos, alos que se puede acceder mediante la dirección que ocupan en la memoria.

Si conocemos en qué posición de memoria se encuentra un dato, por ejemplo un entero, podemos abrir el fichero/proc/<PID>/as, mediante la llamada open() y desplazar el puntero hasta dicha posición 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 deescritura para el propietario, esto nos va a permitir poder escribir directamente en este fichero, lo que significaque podremos modificar zonas de memoria de un proceso, ESTO PUEDE SER BASTANTE PELIGROSO

14.1. Espacio de direcciones de un proceso 127

Page 134: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

PARA NUESTRO SISTEMA, 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 cualquierproceso, vamos a realizar un sencillo ejercicio, en el que desarrollaremos 2 pequeños programas en C:

ejemplo1.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);

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: 0Contador: 1Contador: 2Contador: 3Contador: 4Contador: 5Contador: 6Contador: 7Contador: 8^C

(root@huelva)#

Presenta la dirección de memoria de la variable cont, la cual como podemos ver en la línea 5 de ejemplo1.ces de tipo puntero a un entero. Cada 5 segundos se incrementará el contenido de la dirección donde apunta *cont.Podemos dejar corriendo ejemplo1.

proc_as_wr.c

Este programa aceptará como parámetros el PID de un proceso y una dirección de memoria, el PID lo utilizarápara abrir el fichero del espacio de direcciones del proceso y la dirección de memoria, para, en primer lugar leersu 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 17 #include <sys/procfs.h>8

128 Capítulo 14. Navegando en el /proc

Page 135: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

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]);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 ejecutaremosejemplo1 en un terminal y lo dejaremos ejecutandose, tenemos que recordar la dirección de memoria del con-tador:

(root@huelva)# ./ejemplo1

Dir. Memoria de la varable cont: 0x209d8 133592

Contador: 0Contador: 1Contador: 2Contador: 3

...

Como vemos en la salida de ejemplo1 la dirección de memoria en hexadecimal 0×209d8 y en decimal133592, abrimos otro terminal y ejecutamos el programa proc_as_wr con los siguientes parámetros, peroantes debemos saber cual es el PID con el que se está ejecutando ejemplo1:

14.1. Espacio de direcciones de un proceso 129

Page 136: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

(root@huelva)# ps -ef | grep ejemploroot 17783 25395 0 23:12:27 pts/1 0:00 grep ejemploroot 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)

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 ejemplo1 comprobaremos que el contador se ha incre-mentado en 100.

Este es un sencillo ejemplo de como podemos hacer uso del fichero /proc/<PID>/as y sobre todo de losencillo que es modificar algo del espacio de direcciones de un proceso.

Hasta ahora hemos visto, la estructura básica del sistema de archivos /proc, la estructura de algunos de losfichero que lo forman y como podemos acceder al espacio de direcciones de un proceso simplemente utilizandolas llamadas open() y read(), hasta hemos visto como cambiar el valor de una variable de un proceso. Esteartículo nació de la charla que tuvimos algunos compañeros con los que trabajo, sobre la razón de que una de lasaplicaciones con las que trabajamos estaba continuamente realizando llamadas poll() y necesitabamos conocercuales son los descriptores de ficheros que están utilizando las distintas llamadas a poll().

14.2 Comando truss

El primer paso consiste en realizar un pequeño estudio sobre el número de llamadas al sistema, su frecuencia yel tipo, para esta tarea podemos utiliza el comando truss, con la opción -c obtendremos las estadísticas de lasllamadas a sistema.

Este puede ser un ejemplo de la salida del comando truss:

(root@huelva)# truss -c -p 25089^Csyscall seconds calls errorsread .000 36 12write .000 12close .000 1fcntl .000 1poll .010 1419lwp_self .000 8lwp_mutex_wakeup .000 31lwp_mutex_lock .000 18lwp_cond_wait .002 95 61lwp_cond_signal .000 4lwp_cond_broadcast .000 30lwp_schedctl .000 8accept .000 1send .001 17getsockname .000 4setsockopt .000 1

-------- ------ ----sys totals: .015 1686 73usr time: .114

130 Capítulo 14. Navegando en el /proc

Page 137: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

elapsed: 2.480

(root@huelva)#

Con los resultados anteriores no podemos considerar que tengamos un ejemplo, unicamente es un ejemplo paradestacar que el número de llamadas poll() es bastante superior al del resto de llamadas. Ahora tenemos queaveriguar si existen varias llamadas poll() distintas, en distintos procesos o si solo existe un poll, responsablede todas las llamadas, ejecutaremos el comando truss para que unicamente nos enseñe las llamadas poll():

(root@huelva)# truss -t poll -f -p 2508925089/10: poll(0x310FFD58, 3, 50) = 025089/46: poll(0x00273E50, 3, -1) = 125089/46: poll(0x00273E50, 4, -1) = 125089/46: poll(0x27DFEE10, 1, 30000) = 125089/10: poll(0x310FFD58, 3, 50) = 025089/46: poll(0x00273E50, 3, -1) = 125089/46: poll(0x00273E50, 4, -1) = 125089/46: poll(0x27DFEE10, 1, 5000) = 1...

En la salida del ejemplo podemos observar que la llamada poll() acepta como parámetros, el puntero a un arrayde elementos de tipo struct pollfd, el número de elementos del array y un timeout. Como conocemos ladirección del array de elementos podemos utilizar el fichero /proc/<PID>/as, que recordemos es el espaciode direcciones del proceso, para leer el contenido del array, para ello utilizaremos el siguiente programa en C.

proc_as_rd.c

1 /*2 * Este programa lee una dir de memoria y la interpreta3 * como dato de tipo "pollfd_t" el cual es una estructura4 * que contiene un descriptor de fichero y dos mascaras de5 * eventos.6 *7 * La llamada poll() utiliza un array de elementos de tipo "pollfd_t".8 *9 * Uso: proc_as_rd <pid> 0x<addr_hex> <iter>

10 *11 * <pid> PID del proceso.12 * 0x<addr_hex> es la dir de memoria en hexadecimal.13 * <iter> es el numero de elementos del array14 *15 * IMPORTANTE: Este programa debe compilarse con la opcion de soporte para16 * 64bits, en gcc es "-m64"17 */18

19 #include <stdio.h>20 #include <sys/types.h>21 #include <sys/stat.h>22 #include <fcntl.h>23

24 #include <poll.h>25

26 main(int argc, char **argv)27 {28

29 int fd;30 char s_dir[16];31 char cadena[80];32 char HEX[]="0123456789ABCDEF";33

34 int pid;35 int n,i;

14.2. Comando truss 131

Page 138: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

36 long long addr;37 char c;38

39 int nelem;40

41 pollfd_t dato;42

43 if (argc<3)44 {printf("nn Uso:%s 0x nn",argv[0]);return;}45

46 pid=atoi(argv[1]);47 nelem=atoi(argv[3]);48

49 /*50 * Se lee la dir de memoria en formato HEX51 * y se convierte en una dir de tipo "long long"52 */53

54 if(argv[2][1]==’x’)55 argv[2][1]=’0’;56 else57 {printf("nn Uso:%s 0x ");58 printf("nnLa direccion de memoria tiene que estar en formato hex 0xnn",argv[0]);return;}59

60 sprintf(s_dir,"%016s",argv[2]);61 addr=0;62 for(n=0;n< sizeof(s_dir);n++)63 {64 i=0;65

66 while((HEX[i]!=toupper(s_dir[n]))&&(i<16))67 {i++;}68

69 if (i>15)70 {printf("nError: La direccion contiene caracteres no validosnn");return;}71

72 addr|=i;73 addr=addr<<4;74 }75

76 addr=addr>>4;77

78 /*79 * La variable addr contiene la dir de memoria80 * convertida de HEX -> long long81 */82

83 printf("n PID:%d n Dir. de memoria: 0x%llx n",pid,addr);84 sprintf(cadena,"/proc/%d/as",pid);85

86 fd=open(cadena,O_RDONLY);87 if (fd<0)88 {printf("n Error: Abriendo el fichero%sn",cadena);return;}89 printf("n Abriendo el fichero%sn",cadena);90

91 for(n=0;n< nelem;n++)92 {93 if (lseek(fd,addr,SEEK_SET)<0)94 {printf("nError: Moviendo el puntero%sn",cadena);return;}95

96 if(read(fd,&dato,sizeof(dato))<0)97 {printf("nError: Escribiendo el fichero%sn",cadena);return;}

132 Capítulo 14. Navegando en el /proc

Page 139: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

98

99 printf("n Dir. de memoria 0x%lx (%ld) n",addr,addr);100 printf("n typedef struct pollfd {");101 printf("n int fd =%d",dato.fd);102 printf("n short events =%d",dato.events);103 printf("n short revents =%d",dato.revents);104 printf("n} pollfd_t;");105

106 printf("n--------n");107 addr=addr+(sizeof(pollfd_t));108 }109 close(fd);110 }

El programa abre el fichero /proc/<PID>/as, desplaza el puntero a la dirección 0xaddr_hex y leen tantasestructuras de tipo pollfd_t como le digamos con el parámetro <iter>. La salida será parecida a la siguiente,utilizaremos la información de las llamadas poll() que recuperamos con el comando truss, ejecutaremosproc_as_rd con el proceso 25089 y la dirección de memoria 0x27DFEE10:

(root@huelva)# ./proc_as_rd 25089 0x27DFEE10 1

PID: 25089Dir. de memoria: 0x27dfee10

Abriendo el fichero /proc/25089/as

Dir. de memoria 0x27dfee10 (668986896)

typedef struct pollfd {int fd = 77short events = 39short revents = 24568

} pollfd_t;----------------------(root@huelva)#

La salida devuelve la información representada como una estructura struct pollfd, cuya definición podemosencontrar en el fichero de cabecera /usr/include/sys/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 eldescriptor de fichero 77. Podemos ver a que fichero corresponde el descriptor de fichero 77 en el proceso 25089mediante el comando pfiles:

(root@huelva)# pfiles 2508925089:

Current rlimit: 1024 file descriptors0: S_IFIFO mode:0000 dev:301,0 ino:125986510 uid:10001 gid:10000 size:0

O_RDWR1: S_IFREG mode:0644 dev:261,44006 ino:296 uid:10001 gid:10000 size:1340974

O_RDWR|O_APPEND2: S_IFREG mode:0644 dev:261,44006 ino:297 uid:10001 gid:10000 size:2965

O_RDWR|O_APPEND...

77: S_IFSOCK mode:0666 dev:300,0 ino:12816 uid:0 gid:0 size:0O_RDWR

sockname: AF_INET 192.168.0.72 port: 64095peername: AF_INET 192.168.0.126 port: 5588

En este caso, el descriptor de fichero corresponde con un socket, que la aplicación está utilizando, esta informaciónnos puede ayudar para identificar cual es la causa para que la aplicación esté realizando un uso excesivo dellamadas poll().

14.2. Comando truss 133

Page 140: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Este artículo pretende enseñar lo sencillo que es trabajar con el fichero del espacio de direcciones del proceso ycomo nos puede ayudar a identificar problemas, ya que nos permite consultar la información del proceso que nosinterese.

134 Capítulo 14. Navegando en el /proc

Page 141: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 15

Rendimiento/Tuning

15.1 Introducción

Este es el primero de una serie de artículos sobre la forma de medir el rendimiento de nuestro sistema Solaris.Existe mucha documentación relacionada con este tema, esta serie de artículo solo pretende ser una sencilla guíaque nos permita por un lado, conocer las herramientas de las que disponemos en Solaris y por otro lado, conocercómo podemos utilizar estas herramientas para que nos ayuden a diagnosticar problemas de rendimiento.

El objetivo de esta serie de artículo, como se ha comentado antes, es que sirvan como guía para comenzar elestudio de un posible problema en el rendimiento del sistema, se ha organizado el contenido en 3 bloques:

Procesos y procesadores

Entrada/Salida

Memoria

No solo se tratarán los distintos comandos para medir el rendimiento, sino que se explicaran algunos de losparámetros 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 cadauno de nuestros sistemas y el objetivo no es dar una serie de axiomas o parámetro, los cuales deben aplicarseciegamente, sino el que, como administradores, conozcamos las posibilidades que tenemos para evitar problemasen el rendimiento.

15.2 Procesos y procesadores

Ahora veremos algunas de las herramientas que nos permitan identificar posibles cuellos de botella, tanto en losprocesos que se están ejecutando en el sistema como en las operaciones que estén realizando los procesadores. Paraellos vamos a comenzar haciendo una aclaración sobre lo que parece, para mucha gente, un axioma indiscutiblesobre el rendimiento de un sistema.*”Mucho uso de CPU está directamente relacionado con un problema derendimiento”*

Aunque muchas veces esto puede ser cierto, existen casos en los que no se cumple y otros casos en los queuna solución al problema, como sería aumentar el número de CPUs del sistema, no conseguiría aumentar elrendimiento. Por lo tanto no debemos alarmarnos frente a un aumento del uso de CPU, tendremos que analizarla causa para intentar dar una solución. Podemos decir, y lo comprobaremos mas adelante, que “frente a un usoalto de CPU, comprar más procesadores no garantiza que se solucione el problema.” es importante que tengamosclaro este principio, ya que normalmente, cuando existe un problema de rendimiento, se suele optar por la soluciónrápida, comprar HW y podemos llevarnos una desagradable sorpresa, cuando descubrimos que el haber gastadouna suma importante de dinero para conseguir únicamente, el el porcentaje de uso de CPU se ha reducido, pero elrendimiento del sistema es igual de malo.

135

Page 142: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

El rendimiento de un procesos no se puede medir simplemente con el porcentaje de uso de CPU, existen unaserie de parámetros que nos ayudarán a conocer no solo qué está haciendo el proceso, sino la causa de un posibleproblema de degradación en nuestro sistema.

Nota: No podemos basar nuestro análisis 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 eluso de CPU, en sistemas multitareas y multithreads como es Solaris, el que un proceso decremente su rendimientose debe principalmente a dos posibles causas:

Externa, la lentitud en el proceso se produce por un elemento externo al proceso, como puede ser el accesoa la memoria, lentitud en los dispositivos de E/S, pésima asignación de tiempo de CPU, etc.

Interna, en los procesos con múltiples threads, normalmente existen una serie de sincronizaciones entre losdistintos threads, estas sincronizaciones, pueden provocar bloqueos entre varios de los threads, produciendouna pérdida 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 razón de lapérdida de rendimiento se debe un causa externa al proceso.

Nuestro análisis debe comenzar desde un punto de vista global, hasta desembocar en un foco concreto, no es buenaidea centrarnos, a priori, en un elemento particular, ya que esto, nos podría evitar ver la causa del problema enotro elemento que no esté relacionado con el que nosotros pensamos que es la causa de todo el problema.

15.3 Estado del Sistema

El primer paso para el diagnóstico de un problema en el sistema, es ver de forma global el estado en el que seencuentra. Tenemos que conocer qué se está ejecutando en el sistema, para ello, utilizaremos el comando prstat:

# prstatPID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP23288 app01 1592M 1255M sleep 29 10 7:13:46 34.8% java/1299302 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/123681 app01 56M 12M cpu0 0 10 0:00:00 0.4% java/823672 app01 5552K 5000K sleep 0 0 0:00:00 0.3% perl/11425 root 13M 5704K sleep 59 0 46:41:35 0.2% scopeux/113 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/10022690 jjmora 2456K 2168K cpu3 59 0 0:00:00 0.1% prstat/126948 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/61465 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/13129782 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/123648 app01 1008K 776K sleep 59 0 0:00:00 0.0% grep/129784 root 5192K 3240K sleep 59 0 0:16:13 0.0% Notifier/1312556 app01 63M 57M sleep 59 0 0:01:20 0.0% adr3/5719640 app01 119M 62M sleep 29 10 0:00:16 0.0% java/203363 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

Como podemos comprobar, el comando prstat nos permite disponer de una primera visión de qué se estáejecutando en nuestros sistema. En el ejemplo, lo primero que nos llama la atención es el proceso con PID 23288,es un proceso java con 129 threads, a priori y sin ningún diagnóstico previo, podemos pensar que la causa delproblema es este proceso, pero no podemos parar aquí nuestro análisis, ya que puede que la causa de lentitud delsistema no se deba solo a este proceso y sea un elemento ajeno a él la razón de la lentitud.

Lo que si nos debe llamar la atención, es el crecimiento que se está produciendo en la carga media del sistemaload averages: 4.61, 4.30, 3.71, que podemos ver que está creciendo.

136 Capítulo 15. Rendimiento/Tuning

Page 143: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

15.4 mpstat

Como segundo paso vamos a ver qué está ocurriendo con los procesadores del sistema, es decir, en qué estánempleando su tiempo, esto nos ayudará a que nos aproximemos al diagnostico. Para ver qué están haciendo losprocesadores de nuestro sistema utilizaremos el comando mpstat. La salida del comando muestra una fila porcada uno de los procesadores presentes en el sistema y una serie de columnas con estadísticas sobre distintos ele-mentos, cada una de las columnas vienen explicadas en la documentación del man, por lo tanto no vamos a perdertiempo explicándolas y solo vamos a ver las que pueden ser más intersante para nosotros en estos momentos:

# mpstat 1

CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl0 737 0 172 229 3 2429 143 500 72 0 3903 40 10 0 501 627 0 185 235 7 2461 152 519 95 0 4429 42 12 0 462 342 0 414 222 4 2872 140 608 109 0 3818 23 8 0 693 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 idl0 1046 0 556 234 2 2494 155 504 95 0 10747 44 11 0 461 844 0 882 225 7 2327 162 556 114 0 10418 43 15 0 432 619 0 842 236 3 3055 164 693 126 0 4954 32 9 0 593 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 idl0 795 0 255 361 3 3249 290 772 81 0 5503 60 6 0 341 868 0 556 353 11 2789 307 745 72 0 5091 54 20 0 262 654 0 1049 358 2 3131 320 847 95 0 5175 55 14 0 313 1161 0 1187 2673 2543 2319 203 646 210 0 5291 59 20 0 21

De todas las columnas vamos a centrar nuestro análisis ú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 servirde indicativo sobre el comportamiento de la aplicación. Los fallos de memoria se deben analizar dentro delcontexto de uso de memoria.

xcall refleja el número de cross-call de cada procesador. Las cross-call son llamadas que realiza un pro-cesador a otro, a modo de interrupciones, para indicarle que debe realizar alguna operación. Las cross-calllas suelen utilizar los procesadores para informar de cambios en las caches de la MMU. Un número elevadode cross-call puede indicarnos un problema de rendimiento en las caches, de todas formas, el que se pro-duzacan muchas llamadas de este tipo provocará que los procesadores consuman mucho tiempo atendiendodichas interrupciones y por lo tanto afecten al rendimiento.

csw y icsw cambio de contexto voluntario y cambio de contexto involuntario. El número de cambios de contextodependerá, principalmente del número de procesos que se estén ejecutando en el sistema, recordemos queun cambio de contexto consiste en el proceso por el cual el kernel detiene un proceso que se está ejecutandoen un procesador, elije otro proceso de la cola de ejecución, actualiza los registros del procesador con lainformación del nuevo proceso y el procesador continua ejecutando el nuevo proceso en el punto donde fueparado previamente por otro cambio de contexto.

Cuando el Kernel tiene que elegir un proceso para sacarlo de un procesador, tiene 2 opciones, elegir unoque esté esperando un dato de E/S, por ejemplo leyendo de disco, a esto se le llama un cambio de contextovoluntario, es el proceso el que anuncia que no está haciendo nada en ese instante o elegir uno de los queno están esperando E/S, esto se conoce como cambio de contexto involuntario. Si el valor de icsw sebastante superior a csw, podemos decir, que el Kernel está sacando de los procesadores a procesos queestán ejecutando código que no está en un estado de espera, sino que está ejecutando código y que es elpropio kernel el que está ralentizando la ejecución de esos procesos en concreto.

Por otra parte no debemos entender esto como un problema del Kernel, sino más bien, un problema con elnúmero de procesos que se están ejecutando, debería intentar reducir el factor procesos/CPU, bien bajandoel número de procesos, bien aumentando el número de CPUs.

smtx presenta el número de veces que se ha intentado acceder a un mutex y no se ha conseguido en el primerintento. Podemos considerar que existe un problema de contención con los mutex, si el valor de smtx es

15.4. mpstat 137

Page 144: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

superior a 300 intentos por CPU y el valor de sys > usr, esto significaría que el Kernel está consumiendoCPU intentando acceder a una serie de mutex sin conseguirlo.

srw presenta el número de veces que se ha intentado acceder a un lock de tipo lectura/escritura y no se haconseguido en el primer intento.

syscl número de llamadas ejecutadas por cada CPU.

15.5 kstat

Este comando nos permite visualizar una serie de datos estadísticos del Kernel. Mediante kstat podemosobtener la misma información que obtendremos con los comandos mpstat, vmstat, etc. Los valores quedevuelve el comando kstat son contadores, por lo tanto, tendremos que ser nosotros los que calculemoslos valores realizando una sencilla resta. Las estadísticas del Kernel están organizadas de la siguiente formamódulo:instancia:nombre:estadistica si ejecutamos el comando kstat tal cual, la salida será pa-recida a la siguiente:

(root@huelva)# kstat...module: cpu_info instance: 0name: cpu_info0 class: misc

chip_id 0clock_MHz 1062cpu_type sparcv9crtime 147.6276642device_ID 209202519330fpu_type sparcv9implementation UltraSPARC-IIIisnaptime 25738067.4963142state on-linestate_begin 1154200415

module: cpu_info instance: 1name: cpu_info1 class: misc

chip_id 1clock_MHz 1062

...

De toda la información que podemos obtener con kstat, nos interesa la que se almacena en el módulounix:*:sysinfo, es algo parecido a la siguiente salida:

(root@huelva)# kstat -p unix:*:sysinfounix:0:sysinfo:class miscunix:0:sysinfo:crtime 85.4492862unix:0:sysinfo:runocc 1600644unix:0:sysinfo:runque 15857131unix:0:sysinfo:snaptime 25738291.5173894unix:0:sysinfo:swpocc 0unix:0:sysinfo:swpque 0unix:0:sysinfo:updates 25737884unix:0:sysinfo:waiting 346454

Donde las estadisticas almacenan los siguientes datos.

Estadística Descripciónrunque Procesos en la cola de ejecuciónswpquea Procesos en la SWAPwaiting Procesos esperando E/S

Estos 3 datos, también los podemos obtener del comando vmstat pero esto lo veremos más adelante. De lainformación obtenida, debemos tener en cuenta que, el número de procesos en la cola de ejecución no debe ser

138 Capítulo 15. Rendimiento/Tuning

Page 145: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

alto, ya que un número alto de procesos en esta cola, significa que hay procesos esperando para que se les asigneun procesador, podemos considerar como número alto el que en la cola haya más de 5 procesos por cada CPU delsistema.

Un número elevado de procesos en swap nos avisará de un posible problema con la memoria del sistema, yaque el Kernel ha tenido que pasar algunos procesos al área de swap, previsiblemente por falta de espacio en lamemoria del sistema. Y un número elevado de procesos en waiting nos indicará un problema de accesos en laE/S a algún dispositivo.

15.6 truss

Hasta la aparición en escena de Dtrace con OpenSolaris, el comando truss ha sido herramienta esencial parala identificación de problemas en el rendimiento del sistema. Con el comando truss podremos ver, las llamadasa sistema que esté realizando un proceso en ejecución, los valores de los distintos parámetros de las llamadas, losvalores devueltos, los errores devueltos por las llamadas, etc. Cuando tenemos un problema en el rendimiento delsistema, verificar si los procesos, que pensamos son la causa de la degradación, están haciendo lo que creemos quedeben estar haciendo, es una tarea importante, ya que mucha gente (yo diría demasiada), cuando crean softwareno se preocupan de gestionar los errores que o bien puede generar la aplicación, o bien la aplicación se encuentra,como por ejemplo el intentar acceder a un fichero que no existe, el enviar datos utilizando un socket que seha cerrado, etc. Estos errores frecuentemente está directamente relacionadas con la caida del rendimiento en lasaplicaciones.

truss nos puede ayudar a localizar todos los errores o causas de la pérdida del rendimiento. Por ejemplo, nospuede ayudar a descubrir posible contención en el acceso a un fichero o los fallos generados al intentar accedera un mutex. Las posibilidades de truss van mucho más allá de lo que podemos ver en este sencillo artículo,de todas formas, para que nos sirva como ejemplo y sin entrar en excesivos detalles, vamos a utilizar el comandotruss con el parámetro -c, para que nos muestre una serie de estadísticas sobre las distintas llamadas a sistemaque está ejecutando un proceso:

(root@huelva)# truss -c -p 14178^Csyscall seconds calls errorsread .119 5252 36write .002 41close .000 19fcntl .003 19poll .016 310lwp_mutex_wakeup .001 7034lwp_mutex_lock .002 6128lwp_cond_wait .002 5327 26lwp_cond_signal .000 121lwp_cond_broadcast .000 300accept .006 19send .119 2689setsockopt .003 38

-------- ------ ----sys totals: .278 8617 62usr time: 1.337elapsed: 11.940(root@huelva)#

Para poder interpretar los datos que devuelve truss, debemos conocer algunas de las llamadas a sistema, to-das las llamadas a sistema están documentadas perfectamente en el man del sistema. Con la salida obtenida delejemplo anterior, podemos decir, que quizás exista un problema de acceso a un mutex por parte de algunos LWP(Lightweight process) del proceso. Que un proceso tenga una gran cantidad de operaciones sobre un mutex puedesignificar, dependiendo de si dichas operaciones son todas sobre un mismo mutex o sobre varios, que los LWPdel proceso están luchando por obtener acceso al mutex y por lo tanto, que existe un recurso compartido que estáprovocando una reducción del rendimiento de la aplicación.

La columna de errores nos puede dar una pista de la causa de la pérdida de rendimiento, por ejemplo que se debaa un número excesivos de intentos de acceso a un elemento que no existe o de una forma que no es la correcta,

15.6. truss 139

Page 146: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

en el siguiente ejemplo, tenemos la salida del comando truss, la cual nos muestra un posible problema con lasllamadas read:

(root@huelva)# truss -c -p 21182^Csyscall seconds calls errorsread .214 2336 1754time .000 26poll .000 11sigprocmask .000 2waitid .000 1fork1 .000 1lwp_suspend .000 2lwp_continue .000 2nanosleep .000 10lwp_schedctl .000 3

-------- ------ ----sys totals: .002 64 1754

En la columna de errores de la llamada read(), de 2336 llamadas, 1754 son errores, está claro que tenemos unproblema con las llamadas de lectura de este proceso, ahora tendremos que averiguar, si los errores afectan a todoslos LWP del proceso, si el problema se reproduce en todos los descriptores de ficheros o está localizados en unoen concreto, etc. Dependiendo del resultado de este análisis podremos identificar la causa.

15.7 lockstat

En el man de este comando podemos leer que nos facilita información sobre los candados (locks) en el kernel.Antes de continuar debemos hacer una aclaración sobre uno de los tipos de objetos que se utilizan para la sincro-nización entre threads en Solaris, los mutex. Un mutex es un objeto de exclusión mutua, que solo permite queun thread acceda al recurso controlado por dicho mutex, por lo tanto una de las causas que pueden producir unareducción en el rendimiento de nuestro sistema, es que varios threads intenten hacerse a un mismo mutex. Conlockstat podemos identificar qué está intentando bloquear un mutex.

En Solaris encontramos dos tipos de candados, los spin locks y los block locks. Los candados de tipo spin sonaquellos 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 estén continuamente ejecu-tándose intentando acceder al candado y sin perder tiempo en esperar algún timeout. Sencillamente el thread másrápido en solicitar el candado, justo después de que el candado se ha liberado, será el afortunado. Los candadosde tipo block no utilizan un método tan agresivo como los spin, sino que los threads que intentan acceder a uncandado de tipo block que esté bloqueado, sencillamente se bloquean a la espera de que el candado vuelva a serliberado, estos candado son más lentos con respecto a los anteriores, ya que los procesos deben ser avisados deque 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 mutex spin y candados de tipo block o mutexblock, además de estos dos 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 elnombre de adaptative lock. Si el thread que tiene bloqueado el candado al que queremos acceder está corriendo,todos los threads que están intentando acceder a dicho candado se comportarán como si fuese un spin lock, sipor 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 estén intentando acceder al candado, se comportarán como si elcandado fuese de tipo block locks.

Una vez que tenemos claro los distintos tipos de candados que nos podemos encontrar, vamos a continuar conel comando lockstat para ver algunas de las posibilidades que nos ofrece. Ejecutamos lockstat y le pa-samos como parámetro -b para que devuelva una salida básica y el comando sleep 1 para que no devuelvala información de los candados durante la ejecución del comando sleep. La salida devuelta será parecida a lasiguiente:

(root@huelva)# lockstat -b sleep 1

140 Capítulo 15. Rendimiento/Tuning

Page 147: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

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+0x9889 15% 31% 1.00 0x3000599a420 qfestart+0x29454 9% 40% 1.00 0x3000030f000 callout_execute+0x9851 8% 48% 1.00 0x30000306000 untimeout+0x1845 8% 56% 1.00 0x30000309000 callout_execute+0x9838 6% 62% 1.00 0x30000306000 timeout_common+0x431 5% 67% 1.00 0x30000309000 untimeout+0x1825 4% 71% 1.00 0x3000030f000 untimeout+0x1819 3% 75% 1.00 0x3000030c000 untimeout+0x18

...1 0% 99% 1.00 0x30092298670 putnext+0x541 0% 99% 1.00 0x3008228a418 putnext+0x541 0% 99% 1.00 0x300002cdaf8 taskq_d_thread+0x781 0% 99% 1.00 0x30003561d00 trap_cleanup+0xe81 0% 100% 1.00 0x300002cda08 taskq_d_thread+0x781 0% 100% 1.00 0x300002cda08 taskq_bucket_dispatch+0x41 0% 100% 1.00 0x30003561d00 post_syscall+0x2f41 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+0x42 22% 44% 1.00 0x3000030f000 untimeout+0x181 11% 56% 1.00 0x3008228a418 cv_wait_sig+0x1a41 11% 67% 1.00 0x30000309000 untimeout+0x181 11% 78% 1.00 0x30092298670 cv_wait_sig+0x1a41 11% 89% 1.00 0x30000303000 timeout_common+0x41 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-------------------------------------------------------------------------------

78 32% 32% 1.00 cpu[2]+0x90 setbackdq+0x29c51 21% 52% 1.00 cpu[1]+0x90 setbackdq+0x29c46 19% 71% 1.00 cpu[0]+0x90 setbackdq+0x29c17 7% 78% 1.00 cpu[2]+0x90 disp+0x9015 6% 84% 1.00 cpu[0]+0x90 disp+0x909 4% 88% 1.00 cp_default disp_getbest+0x48 3% 91% 1.00 cpu[1]+0x90 disp+0x906 2% 93% 1.00 cpu[1]+0x90 setfrontdq+0x1086 2% 96% 1.00 cpu[0]+0x90 setfrontdq+0x1085 2% 98% 1.00 cpu[2]+0x90 setfrontdq+0x1082 1% 99% 1.00 sleepq_head+0x1ae8 cv_block+0x981 0% 99% 1.00 cpu[1]+0x90 setkpdq+0x1481 0% 100% 1.00 cpu[3]+0x90 disp+0x901 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-------------------------------------------------------------------------------

15.7. lockstat 141

Page 148: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

1 20% 20% 1.00 sleepq_head+0x848 ts_update_list+0x6c1 20% 40% 1.00 sleepq_head+0x828 setrun+0x41 20% 60% 1.00 cpu[1]+0xd0 preempt+0x1c1 20% 80% 1.00 sleepq_head+0x1118 setrun+0x41 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 sección por cada tipo de candado al que se intenta acceder, por lotanto, podemos obtener el número de peticiones a candados de tipo Spin lock spin, en nuestro ejemplo, se producen246 eventos en 1 segundo. De la salida podemos destacar las siguiente columnas, Count con el número de intentospara acceder a un candado, Lock con los nombres del los candados y Caller con las direcciones de los objetosque han intentado el acceso al candado. Estas 3 columnas nos pueden ayudar a identificar un posible problemade contención en algún candado y si este problema de accesoa un candado está produciendo una degradación delrendimiento de nuestro sistema.

15.7.1 Spin lock spin y Adaptive mutex spin

Tener un número alto de intentos sobre candados de estos dos tipos, puede provocar que la cantidad de tiempoasignada al sistema SYS aumente, obligando al sistema a reducir la cantidad de tiempo que se asigna al usuario ypor lo tanto, se producirá una pérdida de rendimiento es todos los procesos de usuario, al recibir menos tiempo deCPU por parte del Kernel.

15.7.2 Adaptive mutex block

Si en la salida del comando lockstat vemos que el número de este tipo de candados es considerablementemayor que cualquiera de los otros tipos, quizás tengamos un problema con el acceso a un recurso, el cual estábloqueando, tanto al thread que lo está utilizando como a todos aquellos que están intentando acceder a él. Comoeste tipo de bloqueos no produce un aumento del uso de CPU, el problema de rendimiento no se detectará a simplevista mediante el valor de uso de CPU, por lo que es aconsejable, siempre que tengamos dudas del rendimiento denuestro sistema, aunque el uso de CPU no sea alto, que realicemos un pequeño análisis de los candados medianteel comando lockstat.

15.8 cpustat y cputrack

Los procesadores SPARC disponen de una serie de contadores, lo cuales podemos consultar para medir el ren-dimiento de ciertas operaciones a nivel de los procesadores. Estos contadores nos permitirán descubrir posiblescuellos de botellas en los procesadores, bien por el número de instrucciones que se estén ejecutando, bien por elnivel de aciertos en las distintas caches.

La información almacenada en los contadores, dependerá del tipo de procesador que tenga nuestro sistema, porlo tanto,antes de utilizar este comando, debemos comprobar cuales son los contadores disponibles, para ello solotendremos que ejecutar cpustat con el parámetro -h:

(root@huelva)# cpustat -hUsage:

cpustat [-c events] [-nhD] [interval [count]]

-c events specify processor events to be monitored

142 Capítulo 15. Rendimiento/Tuning

Page 149: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

-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_wrEC_ref EC_snoop_inv Dispatch0_br_target Dispatch0_2nd_brRstall_storeQ Rstall_IU_use EC_write_hit_RTO EC_rd_missPC_port0_rd SI_snoop SI_ciq_flow SI_owned SW_count_0IU_Stat_Br_miss_taken IU_Stat_Br_count_takenDispatch_rs_mispred FA_pipe_completion MC_read_dispatchedMC_write_dispatched MC_read_returned_to_JBUMC_msl_busy_stall MC_mdb_overflow_stall MC_miu_spec_request

event1: Cycle_cnt Instr_cnt Dispatch0_mispred EC_wb EC_snoop_cbIC_miss_cancelled Re_FPU_bypass Re_DC_miss Re_EC_missIC_miss DC_rd_miss DC_wr_miss Rstall_FP_use EC_missesEC_ic_miss Re_PC_miss ITLB_miss DTLB_miss WC_missWC_snoop_cb WC_scrubbed WC_wb_wo_read PC_soft_hitPC_snoop_inv PC_hard_hit PC_port1_rd SW_count_1IU_Stat_Br_miss_untaken IU_Stat_Br_count_untakenPC_MS_misses Re_RAW_miss FM_pipe_completionMC_open_bank_cmds MC_reads MC_writes MC_page_close_stallRe_DC_missovhd

See the “SPARC V9 JPS1 Implementation Supplement: SunUltraSPARC-IIIi”

(root@huelva)#

La utilización 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 número de repeticiones. Vamos a ejecutar el comandocpustat, cada segundo, 5 veces, para que nos devuelva el contador Cycle_cnt, el cual almacena el númerode ciclos de CPU y Instr_cnt que nos dice cuantas instrucciones se han ejecutando, el comando devuelve unalínea por cada CPU:

(root@huelva)# cpustat -c pic0=Cycle_cnt,pic1=Instr_cnt 1 5time cpu event pic0 pic11.006 1 tick 5253507 22145961.006 0 tick 5906614 18409432.006 1 tick 751843 1731462.006 0 tick 694595 1182163.006 1 tick 557997 1943653.006 0 tick 1166984 2716104.006 1 tick 5253396 23219694.006 0 tick 4473184 12841885.006 1 tick 781913 2235805.006 0 tick 474001 705615.006 2 total 25314034 8713174

(root@huelva)#

Como ya hemos comentado, los contadores que se pueden monitorizar con el comando cpustat dependen deltipo de procesador que tenga nuestro sistema, por lo tanto, tendremos que recurrir a la documentación especificade cada procesador. En nuestro ejemplo, el procesador que está utilizando la máquina es un UltraSPARC-IIIi yalgunos de los contadores son los siguientes:

15.8. cpustat y cputrack 143

Page 150: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Contador DescripciónCycle_cnt Contador de cilclosInstr_cnt Insrucciones ejecutadasIC_miss Fallos en la cache de instruccionesDC_rd_miss Fallos de lectura en la cacheDC_rw_miss Fallos de escritura en la cacheITLB_miss Fallos de instrucciones en la TLBDTLB_miss Fallos de datos en la TLBEC_misses Fallos en la cache externa

La mayoría de los contadores, los veremos más adelante, cuando hablemos de la memoria, ya que los más rele-vantes hacen referencia a estadísticas sobre elementos como las caches.

El comando cputrack tiene la misma finalidad que cpustat, pero con la diferencia que podemos analizar losdistintos eventos referidos únicamente a un proceso, ya sea en ejecución o que lo lancemos con el propio comandocputrack:

(root@huelva)# cputrack -T 1 -N 10 -c pic0=Cycle_cnt,pic1=Instr_cnt sleep 5time lwp event pic0 pic11.012 1 tick 908377 3026232.012 1 tick 0 03.012 1 tick 0 04.012 1 tick 0 05.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 comandosleep 5, le hemos pasado los párametro -T, para decirle el intervalo en segundos y -N para el número derepeticiones, como el comando sleep 5 solo dura 5 segundos, cputrack solo saca 5 líneas. Este comandonos puede ayudar a conocer cuantas instrucciones ejecuta un proceso, en caso de un problema con el acceso a lascaches, podemos comprobar si es un proceso determinado el que provoca la gran mayoría de los fallos de cache,etc.

Tanto cpustat como cputrack son herramientas bastante útiles a la hora de intentar encontrar la causa de unareducción del rendimiento en nuestro sistema.

144 Capítulo 15. Rendimiento/Tuning

Page 151: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 16

DTrace

Hace tiempo que estoy detrás de intentar escribir una pequeña entrada en el blog sobre DTrace, pienso que hasido una de las herramientas más interesante que han aparecido para el estudio del rendimiento de los sistemasy no solo para eso, tambien puede ayudar a todos aquellos que deseen profundizar en la compresión de cómofunciona el Kernel de Solaris. Creo que cualquier persona que bien vaya a desarrollar, bien administre sistemasSolaris, debería conocer DTrace, sino en profundidad, al menos conocer las posibilidades que nos ofrece. En esteartículo veremos una breve introducción a DTrace, de todas formas es imprescindible, para todos aquellos quedeseen profundizar más, la lectura de Solaris Dynamic Tracing Guide.

16.1 ¿Qué es DTrace?

Es una herramienta de instrumentación desarrollada por Sun en el 2005 y disponible en Solaris 10. No consisteen una simple herramienta de consulta de estadísticas, al estilo kstat, donde todos los datos son generados yposteriormente recogidos. DTrace explota el concepto de Instumentación, tal y como se conoce en el mundo dela Ingeniería.

Instrumentación industrial

Es el grupo de elementos que sirven para medir, convertir, transmitir, controlar o registrar variables de un procesocon el fin de optimizar los recursos utilizados en éste. [http://es.wikipedia.org]

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 están recogiendo datos para nosotros.

Está orientada tanto para desarrolladores, a los cuales puede ayudar en las distintas fases de desarrollo, midiendovariables del sistema, de la misma forma que ocurriría en un sistema en producción. También es una herramientafundamental para los administradores, DTrace va mucho más allá del imprescindible truss, ahora un administradorcon unos conocimientos básicos de DTrace puede, por ejemplo, conocer cuanto tiempo tardan las escrituras endisco de un proceso determinado o la veces que se llama a una syscall determinada.

Lo mejor de DTrace es que podemos realizar todas estas tareas en sistemas en producción, sin coste alguno parael rendimiento del sistemas, ya que es una herramienta no intrusiva.

145

Page 152: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

16.2 Arquitectura de DTrace

En la figura anterior podemos ver un esquema de la arquitectura de DTrace, básicamente está formada por:

Consumers son todos aquellos elementos que de una forma u otra utilizan DTrace, en este punto debemos acla-rar que DTrace es el sistema de instrumentación y que existe un comando dtrace(1M) que es uno de losconsumers de DTrace, pero no el único.

Providers son todos aquellos elementos que pueden generar información sobre el sistema, normalmente consisteen un módulo del Kernel.

Probe es la sonda que definimos para poder extraer información del sistema.

Programas en D son programas desarrollados en lenguaje D, los cuales serán compilados por el comando dtra-ce(1M) y pasados al Kernel para extraer la información que deseemos. Estos programas definen las sondasy su comportamiento.

16.3 Lenguaje D

Es una mezcla de C y awk, la característica mas notable es que este lenguaje no dispone de instrucciones para elcontrol de fujo, no tenemos ni if ... then, ni while, for, etc.

Los programas son compilados con el comando dtrace(1M), de una forma parecida a como se hace en Java, unavez probado que no contiene errores es enviado a Kernel para que lo ejecute DTrace.

La estructura básica de un programa en D es:

Descripción de la sonda/ predicado /{

146 Capítulo 16. DTrace

Page 153: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Acciones;}

16.3.1 Descripción de la sonda

La descripción de la sonda, está formada por una o más cadenas de la forma:

provider:module:funcition:name

Provider es el módulo de Dtrace que publica una sonda.

Module las distintas sondas de un provider pueden estar organizadas en módulos.

Function es la función sobre la que actuará la sonda.

Name es una descripción de qué hace la sonda.

16.3.2 Predicado

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

16.3.3 Acciones

La lógica de la sonda que estamos definiendo, se describe mediante una serie de acciones, las cuales estaránencerradas entre {}. Estas acciones nos permitiran medir, imprimir, contar, modificar, los datos que la sondaobtenga.

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.

system ejecuta un programa.

panic genera un kernel panic.

exit termina la ejecución de la sonda.

Advertencia: Debemos leer la guía de DTrace antes de utilizar las funciones disponibles, ya que algunas deestas funciones son destructivas y podrían generarnos algunos problemas.

Existen una serie de variables definidas, la cual contienen cierta información, como el nombre del ejecutable, elpid, el tiempo desde el arranque del sistemas:

pid ID del proceso.

tid ID del thread.

16.3. Lenguaje D 147

Page 154: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

timestamp el tiempo en nanosegundos desde el arranque de la máquina.

execname nombre del proceso.

arg0-argN argumento de las funciones.

probefunc es el 3 campo del nombre de la sonda, normalmente el nombre de la función.

probename es el 4 campo de la definición de la sonda.

$1..$N contienen los argumentos de la llamada al comando dtrace(1M).

Ejemplo 1: hola.d

Este primer ejemplo muestra el sencillo “Hola mundo” en lenguaje D.

1 // hola.d2

3 dtrace:::BEGIN{4 trace("Hola mundo");5 }6

7 dtrace:::END8 {9 trace("Adios!!");

10 }

cuya salida es:

# dtrace -s ./hola.ddtrace: script ’./hola.d’ matched 2 probesCPU ID FUNCTION:NAME0 1 :BEGIN Hola mundo^C0 2 :END Adios!!

Ejemplo 2: ejemplo2.d

Este ejemplo muestra una versión en lenguaje D del comando truss.

1 // ejemplo2.d2

3 syscall:::entry/ pid == $1 /4 {5 printf("%s (%d, 0x%x,%4d)n",probefunc,arg0,arg1,arg2);6 }

cuya salida es:

# dtrace -q -s ./ejemplo2.d 1046pollsys (134509504, 0x1, 134509672)gtime (1203163434, 0x4fa7e748, 1336403752)write (3, 0x80b36e8, 8)read (3, 0x8047600, 32)pollsys (134509568, 0x1, 0)read (3, 0x8047600, 32)gtime (1203163434, 0x4fa7e748, 1336403752)gtime (1203163434, 0x4fa7e748, 1336403752)read (3, 0x80af6e0, 32)^C

Ejemplo 3: ejemplo3.d

En este ejemplo vamos a crear un programa en D que nos devuelva el tiempo que se ha tardado en ejecutar cadasyscall, para obtener el tiempo utilizaremos la variable timestamp, la cual da los nanosegundos desde que seinicio el sistema.

148 Capítulo 16. DTrace

Page 155: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

1 // ejemplo3.d2

3 syscall:::entry4 / pid == $1 /5 {6 array_sc[probefunc] = timestamp;7 }8

9 syscall:::return10 / pid == $1 /11 {12 printf("time%d t%s (%d, 0x%x, %4d) n",timestamp-array_sc[probefunc], probefunc, arg0, arg1, arg2);13 }

cuya salida es:

# 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

16.3.4 Agregaciones

El lenguaje D, dispone de una serie de funciones de agregación, que nos ayudarán a analizar los datos obtenidostras el lanzamiento de una sonda.

count() cuenta el número de veces.

avg() realiza una media de los datos.

min() obtiene el valor mínimo.

max() obtiene el valor máximo.

lquantize() distribución de frecuencia lineal.

quantize() distribución de frecuencia de potencia de 2.

Ejemplo 4: ejemplo4.d

En este ejemplo hemos construido un programa en D, el cual cuenta con 3 probes:

El primer probe almacena en el array @array_sc_count la veces que se inicia cualquier syscall delproceso pid == $1, también se almacena en array_sc[probefunc] el timestamp de la entradaen 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 función lquantize(arg0,...) que co-mo primer parámetro 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 == $1, alma-cena en el array @array_time_q[probefunc] el valor de la función de agregaciónquantize(timestamp-array_sc[probefunc]).

// ejemplo4.d

syscall:::entry

16.3. Lenguaje D 149

Page 156: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

/ 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]);}

cuya salida es:

# dtrace -q -s ./ejemplo4.d 576lwp_sigmask 53setcontext 53setitimer 107writev 131pollsys 295read 371clock_gettime 521

readvalue ------------- Distribution ------------- count11 | 012 | 213 |@@@@ 3714 | 041 |@@@@@@@@ 7442 | 043 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 25244 | 0

readvalue ------------- Distribution ------------- count512 | 01024 |@@ 192048 |@@@@@@@@@@@@@@@@@@@@@@@@@@ 2414096 |@@@@@@@@@ 868192 |@@ 2316384 | 132768 | 0

16.4 dtrace(1M)

Es el comando que nos permite compilar nuestros programas en D. Dispone de una serie deparámetros entre losque podemos destacar:

-l listado de todos los probes disponibles.

-s compila un programa en D.

-P lista los probes de un provider específico.

150 Capítulo 16. DTrace

Page 157: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

-G genera un fichero ELF que podemos usar para linkar con otros programas.

-n especifica el nombre de un probe.

# dtrace -l

ID PROVIDER MODULE FUNCTION NAME1 dtrace BEGIN2 dtrace END3 dtrace ERROR4 Xserver576 Xorg CloseDownClient client-disconnect5 Xserver576 Xorg Dispatch request-done6 Xserver576 Xorg Dispatch request-start7 Xserver576 Xorg AddResource resource-alloc8 Xserver576 Xorg FreeClientResources resource-free9 Xserver576 Xorg FreeClientNeverRetainResources resource-free10 Xserver576 Xorg FreeResourceByType resource-free...

16.5 Providers

Las sondas (probes) son generadas por unos módulos del kernel que se denominan providers. Con el comandodtrace(1M) podemos ver la lista de providers que tiene nuestro sistema, de esta lista podemos destacar:

fbt (Function Boundary Tracing) nos permiten tracear la mayoría de las funciones del Kernel. Con el comandodtrace -l -P fbt podemos ver la lista de los probes disponibles.

lockstat con este provider podemos tracear posibles problemas de contención en locks.

mib nos da acceso a los contadores MIBs de Solaris.

proc obtenemos información sobre el estado de los procesos y los threads.

syscall nos permite tracear todas las llamadas a systema.

sysinfo obtenemos información sobre el sistema.

vminfo obtenemos información sobre el VM.

16.6 Integrar DTrace en las aplicaciones

Una de las cosas que hace interesante a Dtrace es que podemos crear nuestros propios providers, para que generenprobes en cualquiera de nuestras aplicaciones.

Es una herramienta muy potente para las fases de desarrollo de SW, ya que permite de forma sencilla hacerun análisis del rendimiento de la aplicación.

El nuevo provider no generará nada mientras no se cree un probe que lo consulte, por lo que las aplicacionesno reducirán su rendimiento.

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.

Un ejemplo

En cualquier SMTP de código abierto, podríamos modificar el fuente, para que nos devuelva información decuanto tarda en procesar un mensaje o el tiempo medio que se utiliza para almacenar un mensaje en disco.

16.5. Providers 151

Page 158: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

16.7 Cómo crear nuestro propio provider

Vamos a ver como en 4 sencillos pasos podemos, crear nuestro propio provider, definir una serie de probes y hacerque cualquiera de nuestras aplicaciones (siempre que tengamos el código fuente) puedan utilizar DTrace.

1. Crear un fichero con la definición del provider

Creamos un fichero en el cual definimos el nuevo provider y los probes que tendrá, para nuestro ejemplo,creamos el fichero myprovider.d y definimos el provider myprovider.

1 // myprovider.d2

3 provider myprovider4 {5 probe op_entry(string);6 probe op_return();7 };

Nuestro provider tendrá dos probes:

op_entry el cual acepta una parámetro como entrada.

op_return este probe no acepta parámetros.

2. Modificamos nuestra aplicación para que utilice los probes de nuestro provider

Para modificar nuestra aplicación debemos disponer del código fuente.

1 // app_main.c2

3 #include <stdio.h>4 #include <sys>5 #include <unistd.h>6

7 main()8 {9 int sp;

10 for(;;)11 {12 DTRACE_PROBE1(myprovider,op_entry,"Entrada en op");13 sp=rand()%5;14 printf("Inicio Op: sleep (%d) n",sp);15 sleep(sp);16 printf("Fin Opn");17 DTRACE_PROBE(myprovider,op_return);18 }19 }

3. Compilamos nuestra aplicación junto con nuestro programa en D:

# gcc -c app_main.c## dtrace -G -s myprovider.d app_main.o## gcc -o app1 myprovider.o app_main.o## ./app1

Inicio Op: sleep (3)Fin OpInicio Op: sleep (3)Fin OpInicio Op: sleep (4)

152 Capítulo 16. DTrace

Page 159: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Fin OpInicio Op: sleep (3)Fin OpInicio Op: sleep (2)

4. Creamos un script en D para poder chequear los nuevos probes en nuestra aplicación.

1 // app1_probe.d2

3 myprovider$1:::op_entry4 {5 ts = timestamp;6 }7

8 myprovider$1:::op_return9 {

10 printf("n probename:%s t time:%d ns",probename, (timestamp - ts));11 }

En la siguiente imagen podemos ver un ejemplo de la salida del programa que acabamos de crear app1 y laejecución del programa app1_probe.d que hemos lanzado con el comando dtrace(1M).

16.8 DTrace GUI - chime

Existe un GUI para Dtrace que nos permite de forma gráfica realizar un análisis de nuestro sistema. Por defec-to vienen algunas sondas preparadas, pero con chime podemos visualizar de una forma rápida nuestro propios

16.8. DTrace GUI - chime 153

Page 160: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

programas D.

La imagen siguiente es un ejemplo de lo que podemos hacer con chime.

16.9 DTrace: Preguntas y Respuestas

16.9.1 ¿Qué es DTrace?

DTrace es una herramienta de depuración introducida en el Sistema Operativo Solaris 10 que nos puede ayudara depurar problemas sistemáticos y/o difíciles de diagnosticar con las herramientas y mecanismos tradicionales.Nos ofrece una vista comprensible del comportamiento del sistema operativo y de las aplicaciones que se ejecutansobre él. Con funciones similares a las de truss, apptrace, prex y mdb, DTrace integra en una única ypoderosa herramienta de instrumentación 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 utilizaren sistemas de producción, además con un insignificante impacto en el rendimiento (0 % cuando no se emplea).

DTrace ha sido además el primer mayor componente del código de Solaris 10 que fue abierto a la comunidadopensource.

16.9.2 ¿Para qué se utiliza DTrace?

Se utiliza para análisis de rendimiento, observación, búsqueda de problemas, depurado... Ejemplos como revisarlos detalles de la Entrada/Salida de disco (Disk I/O) en tiempo real ó cronometrar las funciones de usuario paradeterminar si existe problemática alguna en el código.

154 Capítulo 16. DTrace

Page 161: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

16.9.3 ¿Quién puede usar DTrace?

Primero necesitas ser root ó tener algún privilegio DTrace para poder emplear la herramienta.

Los administradores de sistemas pueden utilizar DTrace para entender el comportamiento del sistema operativo yde las aplicaciones.

Los programadores de aplicaciones puede utilizar DTrace para recoger tiempos y argumentar detalles de las fun-ciones que ellos escriben, tanto en entornos de desarrollo como en sistemas en producción.

Los ingenieros del kernel y drivers pueden emplear DTrace para depurar un kernel ya cargado en memoria asícomo todos sus módulos sin necesidad de ejecutar drivers en modo depuración (DEBUG).

16.9.4 ¿Es necesario tener conocimientos internos del kernel para emplearDTrace?

Cualquiera puede emplear DTrace desde el principio utilizando la documentación de los scripts ya escritos deDTraceToolkit ó los scripts de una única línea documentados en Solaris Performance and Tools. Al principio nonecesitarán escribir sus propios scripts, pero a medida que vayan surgiendo necesidades, los usuarios encontraránque 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 código a nivel de usuario. Los desarrolladores deaplicaciones pueden estudiar las funciones que ellos mismos escriben y seguro que además les resultan familiares.

Existen muchos providers de alto nivel que pueden ser diseñados a medida para proveernos de una documentadaabstracción del kernel (Ver la Guía DTrace, ej: proc, io, sched, sysinfo, vminfo), que hacen tracing alkernel mucho mejor y más fácilmente de lo que se pueda creer inicialmente.

Comprender el kernel de Solaris es necesario para escribir scripts DTrace avanzados para los que de momento noexiste un provider de alto nivel. Por ejemplo para examinar la actividad TCP/IP en detalle. Para ésta cuestión serecomienda leer el libro Solaris Internals 2nd Edition.

16.9.5 ¿Qué privilegios necesito para utilizar DTrace?

Sólo ciertos grupos de privilegios permiten funcionar a DTrace. Generalmente el privilegio dtrace_user per-mite acceso a llamadas al sistema (syscall) y perfiles de proveedores (providers). El privilegio dtrace_procpermite añadir acceso al PID del provider y a otros provideres basados en USDT. Por ejemplo, sin el acceso alprivilegio dtrace_doc puedes tener limitada la capacidad de monitorización con agentes DVM dentro de unaMáquina Virtual de Java (JVM), pero puedes ver algunas probes de llamadas al sistema.

Si no estás seguro de los privilegios que tienes actualmente, ejecutando el comando ‘ppriv $$‘ , obtendrás losprivilegios que tu shell te ha proporcionado.

16.9.6 ¿No se había inventado ya algo similar hace 20 años para los mainfra-mes?

No, DTrace puede probar dinámicamente cualquier función de entrada/retorno en un kernel en funcionamiento(unos 36.000 probes); incluso cualquier función en el código de espacio de usuario y librerías (por ejemplo,mozilla y sus librerías suman unas 100.000 probes); instrucciones a nivel de usuario (sobre los 200.000 probessólo para la shell Bourne) y sin perder rendimiento.

16.9.7 ¿Hay libros sobre DTrace?

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 ejemplosmás. Fue escrito por los ingenieros de DTrace y es una referencia obligada. El libro entero está onlinegratuitamente y también se puede bajar en formato PDF.

16.9. DTrace: Preguntas y Respuestas 155

Page 162: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

“Solaris Performance and Tools” demuestra el uso de DTrace para la observación y el depurado del rendimien-to. Fué escrito por Brendan Gregg (autor del DTraceToolkit), Richard McDougall y Jim Mauro (autor de“Solaris Internals”).

16.9.8 ¿Existe algún caso de éxito empleando DTrace?

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 mundolos detalles de pruebas y monitorización de sus clientes.

De momento, podemos revisar la documentación de Jarod Jenson, el consultor con más experiencia del mundo enDTrace. Jarod ha sido entrevistado por las revistas SysAdmin Magazine y ACM; en dichas entrevistas podemosver algunos casos de éxito reales empleando DTrace.

Brendan Gregg (DTraceToolkit) también ha documentado algunos ejemplos interesantes de análisis con DTrace,realizando la mayor colección de scripts hasta el momento.

16.9.9 ¿Cómo funciona DTrace y el lenguaje D?

El lenguaje de programación D está basado en el lenguaje C, así que algún conocimiento inicial de éste lenguajepuede ayudar a su entendimiento. D es bastante más fácil que C ya que sólo hay que aprender un pequeño númerode funciones y tipo de variables para ser capaz de escribir poderosos scripts. Además los programas en D tambiénson similares a los programas escritos en awk, lo cual puede resultar de ayuda.

El comando dtrace(1M) utiliza una librería llamada libdtrace como punto de entrada de varios “providers”dentro del kernel de Solaris, cada uno de ellos nos ofrece una vista lógica de algunos subsistemas del kernel. Elbinario dtrace puede ser utilizado tanto desde línea de comandos como desde shell a través del lenguaje D.

Cuando se ejecutan, los programas escritos en D son compilados “al vuelo” en bytecodes que pueden ser interpre-tados dentro del kernel. La máquina virtual de DTrace ejecuta los bytecodes para garantizar que sean seguros. Siel código es seguro y tenemos los suficientes privilegios, el código se parchea dentro del kernel dinámicamente yes ejecutado como código de kernel. Éste es el por qué los probes que no están activos no pueden crear ningunasobrecarga.

16.9.10 ¿Qué son los probes y providers?

Una “probe” es un punto de instrumentación que puede ser seguido (tracing) por DTrace. Por ejemplo, llamamosel probe “syscall:read:entry” cuando invocamos la llamada del sistema (syscall) read(2) y se llamaa “syscall::read::return” cuando se completa la syscall read(2).

Un ejemplo de probe: io:nfs:nfs_bio:start

Ejecutando la instrucción dtrace -l podremos ver la lista de probes:

# dtrace -l | wc -l48722

Existen cuatro componentes para el nombre de la prueba: provider:module:function:name (provee-dor:módulo:función:nombre), de manera que posteriormente podamos reconocer fácilmente los probes que pue-dan ser de nuestro interés.

El “provider” ó proveedor es una colección de ciertos probes, muy similar a una colección de funciones. Porejemplo, el provider “syscall” nos provee de probes para la entrada y retorno de todas las llamadas al sistema.Al final de ésta guía podemos encontrar una referencia de los providers.

Los módulos corresponden a los módulos de kernel de Solaris. En caso de crear nuestros propios probes dentrode las aplicaciones, el módulo puede ser la clase ó el código del módulo en el que definimos el probe. Si el probecorresponde a una ubicación específica, el nombre del módulo es donde se localiza la prueba.

156 Capítulo 16. DTrace

Page 163: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Las funciones son los nombres de las funciones del código en las que están situados los probes. El nombre es elcomponente final del probe nos da una idea de cuando se ejecuta el probe, como por ejemplo BEGIN ó END.

16.10 Ejemplos trabajando con DTrace

16.10.1 Llamadas al sistema (syscalls)

Los syscalls pueden ser fácilmente seguidos utilizando el provider syscall, que nos ofrece un probe para laentrada 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 aplicación. Cada syscall está documentada enla sección 2 de las páginas del manual (man).

Aquí algunos ejemplos de una sola línea con DTrace:

Ficheros abiertos por nombre del proceso:

# dtrace -n ’syscall::open*:entry { printf("%s%s",execname,copyinstr(arg0));}’dtrace: description ’syscall::open*:entry ’ matched 2 probesCPU ID FUNCTION:NAME

0 49565 open:entry SciTE /usr/lib/iconv/alias0 49565 open:entry SciTE /usr/lib/iconv/alias0 49565 open:entry SciTE /usr/lib/iconv/alias0 49565 open:entry SciTE /usr/lib/iconv/alias0 49565 open:entry SciTE /usr/lib/iconv/alias0 49565 open:entry nscd /etc/security/prof_attr0 49565 open:entry in.routed /dev/kstat

Contador de llamadas al sistema por nombre del proceso:

leonidas ~ # dtrace -n ’syscall:::entry { @num[execname] = count(); }’dtrace: description ’syscall:::entry ’ matched 230 probes^Cfmd 1inetd 1svc.configd 1svc.startd 1

automountd 3gconfd-2 3ssh-agent 6screen-4.0.2 7nmbd 14xfdesktop 16ipmon 24tail 24nscd 26

env 42head 48tr 58

dirname 60rm 61xfce4-session 80uname 92dsdm 98firefox-bin 112xfce-mcs-manager 176xfterm4 222init 292exo-open 399

16.10. Ejemplos trabajando con DTrace 157

Page 164: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

xfwm4 400grep 486dtrace 515expr 530netbeans 643evince 651xfce4-panel 806SciTE 918sh 1115

Terminal 1415java 3219Xorg 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 1getpid 1mmap 1open 1schedctl 1fstat64 2so_socket 2stat64 2close 3

sysconfig 3

sigaction 5brk 6xstat 10lwp_sigmask 11setcontext 11nanosleep 13gtime 14

write 15writev 16setitimer 19p_online 32read 56lwp_park 66pollsys 239ioctl 495

Se puede establece un valor particular para medir el tiempo transcurrido y el tiempo en CPU de las llamadasal sistema, de forma que nos explique el tiempo de carga y respuesta de la CPU. Por ejemplo, la herramientaprocsystime de DTraceToolkit realiza ésta función utilizando los flags -e y -o

16.10.2 Entrada/Salida de disco (Disk I/O)

Los eventos de disco se pueden seguir empleando el provider io, el cual nos ofrece probes para la petición ycompletación de Entrada/Salida de discos y clientes NFS.

Cada probe nos muestra detalles muy extensos sobre la Entrada/Salida a través de la matriz args[], como estádocumentado en la guía DTrace.

Los siguientes listados nos muestran algunos de éstas pruebas:

158 Capítulo 16. DTrace

Page 165: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

leonidas ~ # dtrace -ln ’io:genunix::’

ID PROVIDER MODULE FUNCTION NAME3769 io genunix biodone done3770 io genunix biowait wait-done3771 io genunix biowait wait-start3780 io genunix default_physio start3781 io genunix bdev_strategy start3782 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 actividadde disco:

Ésta es la petición actual de Entrada/Salida de disco. Tu aplicación puede tener cargas de Entrada/Salida quepueden ser absorvidas por el cache del sistema de ficheros.

Las I/O Completions (io:::done) son asíncronas, así que pid y execname podrian no identificar los procesosresponsables. Las peticiones de escritura en disco (io:::start) suelen ser a menudo asíncronas a los pocesosresponsables, como el sistemas de ficheros ha cacheado la escritura, ya no existirá más adelante en el medio dealmacenamiento.

Los eventos io no significan necesariamente que las cabezas del disco se estén moviendo. Algunos discos tienenbuffers para cachear la actividad de Entrada/Salida, especialmente los arrays de discos.

Algunos ejemplos de I/O en una única línea:

leonidas ~ # dtrace -n ’io:::start { printf("%d%s%d",pid,execname,args[0]>b_bcount); }’dtrace: description ’io:::start ’ matched 3 probesCPU ID FUNCTION:NAME

0 3781 bdev_strategy:start 0 sched 5120 3781 bdev_strategy:start 0 sched 5120 3781 bdev_strategy:start 0 sched 10240 3781 bdev_strategy:start 0 sched 10240 3781 bdev_strategy:start 0 sched 46080 3781 bdev_strategy:start 0 sched 46080 3781 bdev_strategy:start 0 sched 35840 3781 bdev_strategy:start 0 sched 35840 3781 bdev_strategy:start 0 sched 35840 3781 bdev_strategy:start 0 sched 71680 3781 bdev_strategy:start 0 sched 7168

Agregación de tamaño 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 |@@@@@@@@@@@@

16.10. Ejemplos trabajando con DTrace 159

Page 166: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

13

2048 |@@@@@@@@@@@@@@@ 164096 | 08192 | 0

16384 |@@@@ 4

32768 | 0

Otros ejemplos: el famoso “Hola, mundo!”,

Ya en nuestro editor de textos favorito escribimos el siguiente código y lo guardamos con el nombre hola.d:

1 // hola.d2

3 dtrace:::BEGIN{4 trace("Hola mundo");5 }6

7 dtrace:::END8 {9 trace("Adios!!");

10 }

Para ejecutar el código debemos utilizar el comando dtrace con el flag -s:

leonidas ~ # dtrace -s hola.d

dtrace: script ’hola.d’ matched 1 probe

CPU ID FUNCTION:NAME0 1 :BEGIN Hola, mundo!

Para más información:

En DTraceToolkit podremos encontrar numerosos scripts más que nos sirvan de ayuda.

Si tienes instalado Solaris Express Developer Edition, en el directorio /usr/demo/dtrace encontrarás másscripts.

También puedes usar tu navegador web para verlos todos, escribiendo la URL:file:///usr/demo/dtrace/index.html en la barra de dirección.

160 Capítulo 16. DTrace

Page 167: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 17

Role Based Access Control (RBAC)

Desde hace ya bastantes años tanto en la gestión de los usuarios y grupos dentro del ambito tecnológico de losgestores 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 aún en concreto losclasificados como UNIX o de tipo UNIX podian disponer de herramientas de terceros (ej: sudo) que en ninguncaso permitian todas las funcionalidades de un gestor de perfiles y roles integrado con el resto de funcionalidadesdel sistema.

17.1 ¿Qué es RBAC?

Es una herramienta que posibilita la definición de perfiles asociados a la ejecución de unos determinados binarios oconjunto de ellos. Al mismo tiempo estos nuevos atributos (perfiles) se pueden asignar a un determinado usuario/spara conseguir la ejecución 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 tratade un atributo concreto, sino que este ultimo concepto practicamente ya goza de identidad dentro de la gestión deusuarios/grupos del sistema.

17.2 Perfiles

Basicamente en su definición lo asociamos a la ejecución de un determinado/s binario con un identificador deusurios. 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” ycomprobaremos el resultado de esta asociación, 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 userspluton ~ # useradd -s /bin/bash -g users -m -d /export/home/victor victorpluton ~ # usermod -P Format victorpluton ~ # more /etc/user_attrvictor::::profiles=Format,auths=solaris.*,solaris.grant;type=normal

161

Page 168: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

pluton ~ # su - victorpluton ~ # pfexec /usr/sbin/format

17.3 Roles

Basicamente en su definición es similar el la parte de asignación de perfiles, pero en este caso la diferencia resideen la asociación 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 ycon 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 decomandos permitida:

pluton ~ # vi /etc/security/prof_attrSnoop:::Allow Users to run snoop command::

pluton ~ # vi /etc/security/exec_attrSnoop:suser:cmd:::/usr/sbin/snoop:uid=0

pluton ~ # roleadd -m -d /export/home/snoop -s /usr/bin/pfsh -P Snoop,All usrsnooppluton ~ # usermod -R usrsnoop victorpluton ~ # more /etc/user_attrusrsnoop::::type=role,profiles=Snoop,All

pluton ~ # su - victorpluton ~ # su usrsnooppluton ~ # /usr/sbin/snoop

En la distribución binaria de tipo comercial Sun Solaris 10 (cualquier release hasta la 5/08) podemos realizar estetipo de gestión de RBAC de forma mucho mas sencilla a través de la herramineta gráfica: Solaris ManagementConsole (SMC v2/3).

Esta misma funcionalidad se encuentra disponible en las dos distribuciones binarias de tipo Solaris Express, comoson 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) deINDIANA ya no se encuentra disponible la SMC (v2/3), pero dicha funcionalidad existe igualmente y podemosutilizar herramientas sencillas del escritorio GNOME.

162 Capítulo 17. Role Based Access Control (RBAC)

Page 169: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Figura 17.1: Solaris Management Console (SMC v2/3)

17.3. Roles 163

Page 170: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

164 Capítulo 17. Role Based Access Control (RBAC)

Page 171: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 18

Solaris Volume Manager (SVM)

Ya desde sus versiones iniciales de la distribución comercial Sun Solaris 5, 6, 7 y 8 introduccian un gestor dediscos (en particular de metadispositivos) denominado Solstice Disk Suite. Con grandes innovaciones funcionales(aparición del concepto de particiones de tipo soft) en la última de sus releases, incoporada en Sun Solaris 8.La evolución natural del producto y la tendencia del mercado ha originado la nueva denominación como SolarisVolume Manager, sin embargo incorpora (como veremos a los largo de este capitulo) practicamente las mismasfuncionalidades que su predecesor.

18.1 ¿Qué es SVM?

Es una herramienta que permite la gestión del almanecamineto de cada uno de los discos del sistema (localeso remotos) en base a particiones de tipo hard (especificado su tamaño con un cilindro de comienzo y otro definalización) y de tipo soft (especificado su tamaño como una cantidad definida en kilobytes:kb, megabytes:mb ogigabytes: gb).

Adicionalmente posibilita la realización de configuraciones de tipo RAID (Redundant Array of Inexpensive) entrelas diferentes particiones de tipo hard y soft que hayamos definido. Los diferentes niveles que permite son: RAID0 (Concat o Stripe), RAID 1 (Mirror), RAID 5 (Parity) y combinaciones de los mismos.

18.2 RAID 0 (Concat)

Metadispositivo resultante como distribución secuencial de al menos dos particiones, cuyo tamaño consiste en lasuma del de sus componentes:

pluton ~ # metainit -f d11 3 1 c0d1s4 c1d1s5 c2t0d0s6d11: Concat/Stripe is setup

pluton ~ # metastat -pd11 3 1 c0d1s4 \

1 c1d1s5 \1 c2t0d0s6

pluton ~ # newfs /dev/md/rdsk/d11

165

Page 172: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

18.3 RAID 0 (Stripe)

Metadispositivo resultante como distribución NO secuencial (es decir en paralelo) de al menos dos particiones,cuyo tamaño consiste en la suma del de sus componentes (deben ser iguales sino se pierde la diferencia):

pluton ~ # metainit -f d11 1 3 c0d1s4 c1d1s5 c2t0d0s6d11: Concat/Stripe is setup

pluton ~ # metastat -pd11 1 3 c0d1s4 c1d1s5 c2t0d0s6

pluton ~ # newfs /dev/md/rdsk/d11

En ambos casos del RAID 0 (Concat y Stripe) unicamente se incrementa el tamaño y/o la velocidad, pero nodisponemos de tolerancia a fallos.

18.4 RAID 1 (Mirror)

Metadispositivo resultante como distribución en espejo NO secuencial (es decir en paralelo) de dos particiones delmismo tamaño. En este caso una de las particiones actúa de origen y la otra destino de la copia (en todo momentoonline) de los datos. Se pierde la mitad del tamaño total de sus componentes, pero se gana en tolerancia a fallosde al menos una de las particiones implicadas:

pluton ~ # metainit -f d11 1 1 c0d1s4d11: Concat/Stripe is setup

pluton ~ # metainit -f d12 1 1 c0d2s4d12: Concat/Stripe is setup

pluton ~ # metainit d10 -m d11d10: Mirror is setup

pluton ~ # metattach d10 d12d10: submirror d12 is attached

pluton ~ # metastat -pd10 -m d11 d12 1d11 1 1 c0d1s4d12 1 1 c0d2s4pluton ~ # newfs /dev/md/rdsk/d10

18.5 RAID 5 (Parity)

Metadispositivo resultante como distribución en paridad NO secuencial (es decir en paralelo) de al menos 3 par-ticiones del mismo tamaño. En este caso la información se guarda en bandas donde uno de los componentes dela misma alberga la paridad. Con tres particiones implicadas se pierde un tercio del tamaño total, pero se gana entolerancia a fallos:

pluton ~ # metainit -f d10 -r c0d1s4 c1d1s5 c2t0d0s6d10: RAID is setup

pluton ~ # metastat -pd10 -r c0d1s4 c1d1s5 c2t0d0s6 -k -i 32b

pluton ~ # newfs /dev/md/rdsk/d10

166 Capítulo 18. Solaris Volume Manager (SVM)

Page 173: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

En la distribución binaria de tipo comercial Sun Solaris 10 (cualquier release hasta la 5/08) podemos realizar estetipo de gestión de SVM de forma mucho mas sencilla a través de la herramineta gráfica: Solaris ManagementConsole (SMC v2/3).

Esta misma funcionalidad se encuentra disponible en las dos distribuciones binarias de tipo Solaris Express, comoson 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) deINDIANA ya no se encuentra disponible la SMC (v3/4). Existen varios proyectos en el desarrollo de interfaz deusuario para este tipo de gestión de los discos del sistema con SVM, en particular cabe destacar Simple Panels(http://trac.neuroomante.com/simplepanels).

18.5. RAID 5 (Parity) 167

Page 174: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

168 Capítulo 18. Solaris Volume Manager (SVM)

Page 175: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 19

IPFilter (IPF)

A diferencia de RBAC y otras herramientas de Seguridad Lógica, desde el punto de vista de la Seguridad Perime-tral (a nivel de red y a nivel de host) en la antigua version 8 (independientemente de la release) de la distribucióncomercial Sun Solaris se incluia como utilidad (gratuita) de Firewall local y remoto el producto SunScreen Litev3.1 y todavia comptible con Sun Solaris. Actualmente dicho producto esta discontinuado (deprecated) y se ha in-cluido de forma estandard este nuevo componente del sistema, el cual esta 100 % integrado con otros componentescomo SMF, etc.. y ademas no es incompatible con otros productos de mercado que ofrecen la misma fucnionalidado más.

19.1 ¿Qué es IPF?

Es una herramienta que permite el filtrado de tráfico local y remoto de tipo TCP/UDP junto con el enmascara-miento o traducción de direcciones IPv4/6 (Network Address Translation: NAT), incluyendo la redirección porpuertos TCP (Network Addess Translatioon Port: NATP).

A diferencia de otros productos, NO es un proceso sino un conjunto de modulos del kernel del sistema. Este hechooptimiza su rendimiento y le permite conservar bastantes similitudes con otras utilidades de Firewall de este tipoa nivel de linea de comnandos (CLI).

En este articulo vamos a configurar de forma sencilla la protección de nuestro sistema con unas simples reglas yentender su funcionamiento.

Inicialmente tenemos que inicializar los modulos del kernel y habilitar el servicio IPFilter a través de SMF:

pluton ~ # ipf -E

pluton ~ # svcadm enable ipfilter

pluton ~ # svcs | grep ipfilteronline 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 -iolempty list for ipfilter(out)empty list for ipfilter(in)

169

Page 176: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Una vez comprobado que todo esta OK, es el momento para comenzar con su configuración. En este sencilloejemplo se puede observar el filtrado de todo el tráfico TCP y UDP, unicamente permitiendo el acceso a nuestrosistema por ssh desde la Ipv4 especificada en el fichero de configuración:

pluton ~ # ifconfig -alo0: flags=2001000849 mtu 8232 index 1

inet 127.0.0.1 netmask ff000000pcn0: flags=201000843 mtu 1500 index 2

inet 10.73.130.68 netmask ffffff00 broadcast 10.73.130.255ether 0:c:29:ef:ed:da

pluton ~ # vi /etc/ipf/pfil.apP 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 pfilpcn0 -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# See ipf(4) manpage for more information on# IP Filter rules syntax.

# Block any packets which are too short to be realblock 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 allpass out quick on lo0 all

# Public Network. Block everything not explicity allowed.block in log on pcn0 from any to any port = 22block out on pcn0 all

# Allow pings out.pass out quick on pcn0 proto icmp all keep state

# for testing, allow pings from ben and jerrypass in quick on pcn0 proto icmp from 10.73.130.122/32 to 10.73.130.68/32

# Allow outbound state related packets.

170 Capítulo 19. IPFilter (IPF)

Page 177: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

pass out quick on pcn0 proto tcp/uDp from any to any keep state

# Actually, allow ssh only from ben, jerry, MSUpass in quick on pcn0 proto tcp from 10.73.130.122/32 to 10.73.130.68/32 port = 22

Únicamente nos quedaría reiniciar el servicio SMF asociado a IPFilter y comenzar a observar la actividad de dichomodulo y sus estadisticas:

pluton ~ # svcadm disable ipfilter

pluton ~ # svcadm enable ipfilter

pluton ~ # ipftsat -iolpass out quick on lo0 allblock out on pcn0 allpass out quick on pcn0 proto icmp from any to any keep statepass out quick on pcn0 proto tcp/udp from any to any keep stateblock in quick from any to any with shortblock in from any to any with ipoptspass in quick on lo0 allblock in log on pcn0 from any to any port = 22pass in quick on pcn0 proto icmp from 10.73.130.122/32 to 10.73.130.68/32pass in quick on pcn0 proto tcp from 10.73.130.122/32 to 10.73.130.68/32 port= ssh

pluton ~ # ipfstat -hio0 pass out quick on lo0 all3 block out on pcn0 all0 pass out quick on pcn0 proto icmp from any to any keep state2 pass out quick on pcn0 proto tcp/udp from any to any keep state0 block in quick from any to any with short0 block in from any to any with ipopts0 pass in quick on lo0 all7 block in log on pcn0 from any to any port = 220 pass in quick on pcn0 proto icmp from 10.73.130.122/32 to 10.73.130.68/322 pass in quick on pcn0 proto tcp from 10.73.130.122/32 to 10.73.130.68/32 port = ssh

Si no estamos acostumbrados a la administración de este tipo de firewall basados en ordenes de linea de comandos(CLI), siempre podemos recurrir a herramientas gráficas de gestión de los mismos inclyuendo herramientas deanálisis y almacenamiento de Logs en modo Bitacora (ej: Firewall Builder y FWLogWatch)

19.1. ¿Qué es IPF? 171

Page 178: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

Figura 19.1: Firewall Builder

172 Capítulo 19. IPFilter (IPF)

Page 179: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 20

Image Packaging System (IPS)

A diferencia de las versiones mas clásicas de la distribución comercial Sun Solaris (5, 6, 7, 8, 9 e incluso 10), lasdistribuciones binarias mas actuales bajo el marco de desarrollo del proyecto internacional OpenSolaris incorporanun nuevo sistema de paquetes denominado Image Packaging System (IPS).

20.1 ¿Qué es IPS?

En particular la distribucuion binaria mas novedosa en este aspecto fue Nexenta (GNU/Solaris). Esta incorporael 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 sistemasson intercambiables mediante la definición y modificación de diferentes variables de entorno del sistema sin dejarde ser 100 % compatibles.

Sin embargo con la aparición de la distribución 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 estático sistema PKG, incorporando el nuevo sistema de paquetesIPS. Este último permite (entre otras cosas) actualización y mantenimiento online al estilo APT/YUM/PORT comoen las más conocidas y citadas distribuciones Linux o BSD.

20.2 ¿Cómo funciona?

Una vez instalada nuestra distribución binaria 2008.05 lo primero que podemos comprobar es el conjunto depaquetes actuales, al mismo tiempo que los verificamos:

pluton ~ # pkg list -avFMRI STATE UFIX...pkg:/[email protected],5.11-0.75:20071114T203821Z Know ----pkg:/[email protected],5.11-0.79:20800205T165922Z Know ----pkg:/[email protected],5.11-0.86:20080422T222737Z Know ----pkg:/[email protected],5.11-0.86:20071114T203821Z installed ----

pluton ~ # pkg listNAME (AUTHORITY) VERSION STATE UFIX...SUNWtcat 5.5.26-0.86 installed ----

pluton ~ # pkginfo...system SUNWtcatr Tomcat Servlet/JSP Container (root)

173

Page 180: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

system SUNWtcatu Tomcat Servlet/JSP Container

pluton ~ # pkg verifyPACKAGE STATUS...pkg:/SUNWtcat ..... //

pluton ~ # pkgrm

pluton ~ # pkg info -l SUNWtcatName: SUNWtcatSummary: Tomcat Servlet/JSP ContainerState: InstalledAuthority: opensolaris.org (preferred)Version: 5.5.26Build Release: 5.11Branch: 0.86Packaqing Date: Sat Apr 26 18:03:46 2008Size: 24.4 MBFRMI: pkg:/[email protected],5.11-0.86:20071114T203821Z

pluton ~ # pkginfo -l...PKGINST: SUNWtcatrNAME: systemARCH: i386VERSION: 11.11.0,REV=2008.03.19.13.46VENDOR: Sun MicrosystemsDESC: Tomcat Servlet/JSP Container (root)HOTLINE: Please contact your local service providerSTATUS: Completely installed

PKGINST: SUNWtcatuNAME: systemARCH: i386VERSION: 11.11.0,REV=2008.03.19.13.46VENDOR: Sun MicrosystemsDESC: Tomcat Servlet/JSP ContainerHOTLINE: Please contact your local service providerSTATUS: Completely installed

En el primer comando listamos todos los paquetes del sistema y la notación resultante consiste en su estado y suUFIX. En el segundo ejemplo unicamente listamos los paquetes que han sido instalados utilizando los repositoriosonline de IPS.

En ambos casos aparece indicado el estado de ese paquete y su atributo UFIX. Pero, que significa esta nomencla-tura?

U = Upgradable (actualizable, existe una version superior)

F = Frozen (congelado, no existe nueva version prevista)

I = Incorporated (incorporado, es decir actualización reciente)

E = Excluded (excluido)

Sin embargo en el último comando de este ejemplo, hemos utilizado el clásico pkginfo, similar en funcionalidadal segundo (es decir unicamente lista en el antiguo formato los paquetes actualizados online) con la salvedad quees capaz de discriminar la granuralidad de cada uno de los paquetes y dependencias.

Como novedad incorpora la opción de buscar un determinado paquete en los distintos repositorios online, instalarlojunto con todas sus dependencias, desinstalarlo y la posibilidad de comprobar su integridad como la del resto depaquetes, asi:

174 Capítulo 20. Image Packaging System (IPS)

Page 181: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

pluton ~ # pkg search -r phpINDEX ACTION VALUE PACKAGEbasename file usr/php5/5.2.4/bin/php pkg:/[email protected] file usr/php5/5.2.4/bin/php pkg:/[email protected] file usr/php5/5.2.4/bin/php pkg:/[email protected] file usr/php5/5.2.4/bin/php pkg:/[email protected] file usr/php5/5.2.4/bin/php pkg:/[email protected]

pluton ~ # pkg install SUNWphp524Creating Plan /

DOWNLOAD PKGS FILES XFER (MB)Completed 11/11 829/829 44.52/44.52

PHASE ACTIONSInstall Phase 1268/1268

pluton ~ # pkg uninstall SUNWphp524

pluton ~ # pkg verify SUNWphp524PACKAGE STATUSpkg:/SUNWphp524 ..... //

En la distribución binaria de tipo comercial Sun Solaris 10 (cualquier release hasta la 5/08) podemos realizarúnicamente la gestión de los parches (NO de los paquetes) del sistema de forma mucho mas sencilla a través dela herramienta gráfica: Solaris Management Console (SMC v2/3).

Figura 20.1: Solaris Management Console

Esta misma funcionalidad se encuentra disponible en las dos distribuciones binarias de tipo Solaris Express, comoson la Community Edition (SXCE Build 89) y la Developer Edition (SXDE 1/08) al igual que la herramientaUpdate Manager, la cual posibilita tanto la actualización y mantenimiento de paquetes, como de parches.

Como dato relevante antes de finalizar este articulo, destacar que en todo momento tenemos garantizada la com-patibilidad con el modelo estático de gestión de paquetes y parches PKG, tanto en su instalación, como desins-talación de los mismos:

pluton ~ # pkgadd -d STATsrv-Sol86.pkgpluton ~ # pkgadd -d .

20.2. ¿Cómo funciona? 175

Page 182: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

176 Capítulo 20. Image Packaging System (IPS)

Page 183: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

pluton ~ # pkgrm STATsrvpluton ~ # pkgchk

En el primer caso instalaremos ese paquete en particular, sino especificamos el nombre del paquete. El segundocomando nos presentará la posibilidad de instalar todos los PKGs de ese directorio y sucede los mismo con sueliminación. En el tercer ejemplo desinstalaremos ese paquete en detalle y finalmente chequeamos el estado delos paquetes.

pluton ~ # patchadd 118976-07

pluton ~ # patchrm 118976-07

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) deINDIANA ya no se encuentra disponible ni la SMC (v2/3) ni la opción del Update Manager.

Sin embargo, si no estamos acostumbrados a la administración de este tipo de utilidades de gestión de paquetesbasadas en ordenes de linea de comandos (CLI), siempre podemos recurrir a sencillas herramientas gráficas deadministración (integradas en el escritorio GNOME) como es el caso de Package Manager. Esta ultima utilidadcoincide el un alto % de similitudes al conocido paquete Synaptic, existente en las distribuciones Linux másconocidas y existentes.

Figura 20.2: Package Manager

20.2. ¿Cómo funciona? 177

Page 184: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

Guía del Estudiante: Community Edition, Versión 2.0

178 Capítulo 20. Image Packaging System (IPS)

Page 185: Guía del Estudiante: Community Editionindex-of.co.uk/SISTEMAS-OPERATIVOS/Gu%eda%20del%20...Guía del Estudiante: Community Edition Versión 2.0 OpenSolaris Hispano March 06, 2010

CAPÍTULO 21

Indices and tables

Índice

Índice de Módulos

Página de Búsqueda

179