Libro de trabajo del estudiante (ROLE) Red Hat Enterprise Linux 8.2 RH134 Administración de sistemas Red Hat II Edición 1 RH134-RHEL8.2-es-1-20200928 Copyright ©2020 Red Hat, Inc. Administración de sistemas Red Hat II RH134-RHEL8.2-es-1-20200928 Copyright ©2020 Red Hat, Inc. Red Hat Enterprise Linux 8.2 RH134 Administración de sistemas Red Hat II Edición 1 20200928 fecha de publicación 20200928 Autores: Editor: Fiona Allen, Adrian Andrade, Hervé Quatremain, Victor Costea, Snehangshu Karmakar, Marc Kesler, Ed Parenti, Saumik Paul, Dallas Spohn Steven Bonneville, Philip Sweany, Ralph Rodriguez, David Sacco, Nicole Muller, Seth Kenlon, Heather Charles Copyright © 2020 Red Hat, Inc. The contents of this course and all its modules and related materials, including handouts to audience members, are Copyright © 2020 Red Hat, Inc. No part of this publication may be stored in a retrieval system, transmitted or reproduced in any way, including, but not limited to, photocopy, photograph, magnetic, electronic or other record, without the prior written permission of Red Hat, Inc. This instructional program, including all material provided herein, is supplied without any guarantees from Red Hat, Inc. Red Hat, Inc. assumes no liability for damages or legal action arising from the use or misuse of contents or details contained herein. If you believe Red Hat training materials are being used, copied, or otherwise improperly distributed, please send email to training@redhat.com or phone toll-free (USA) +1 (866) 626-2994 or +1 (919) 754-3700. Red Hat, Red Hat Enterprise Linux, the Red Hat logo, JBoss, Hibernate, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries. Linux® is the registered trademark of Linus Torvalds in the United States and other countries. Java® is a registered trademark of Oracle and/or its affiliates. XFS® is a registered trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries. The OpenStack® word mark and the Square O Design, together or apart, are trademarks or registered trademarks of OpenStack Foundation in the United States and other countries, and are used with the OpenStack Foundation's permission. Red Hat, Inc. is not affiliated with, endorsed by, or sponsored by the OpenStack Foundation or the OpenStack community. All other trademarks are the property of their respective owners. Colaboradores: Artur Glogowski, Fernando Lozano, Latha Murthy, Samik Sanyal, Chetan Tiwary, Achyut Madhusudan, Rob Locke, Rudolf Kastl, Prashant Rastogi, Heider Souza, Michael Phillips Convenciones del documento ix Introducción xi Administración de sistemas Red Hat II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi Orientación sobre el entorno del aula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xii Internacionalización . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi 1. Mejora de la productividad con la línea de comandos 1 Redacción de scripts de Bash simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Ejercicio Guiado: Redacción de scripts de Bash simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Ejecución de comandos con mayor eficiencia usando bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Ejercicio Guiado: Ejecución de comandos con mayor eficiencia usando bucles . . . . . . . . . . . . . . . . . . 15 Texto coincidente en la salida de comando con expresiones regulares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Ejercicio Guiado: Texto coincidente en la salida de comando con expresiones regulares . . . . . 26 Trabajo de laboratorio: Mejora de la productividad con la línea de comandos . . . . . . . . . . . . . . . . . . . . 29 Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 2. Programación de tareas futuras 37 Programación de un trabajo de usuario diferido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Ejercicio Guiado: Programación de un trabajo de usuario diferido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Programación de trabajos de usuario recurrentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Ejercicio Guiado: Programación de trabajos de usuario recurrentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Programación de trabajos del sistema recurrentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Ejercicio Guiado: Programación de trabajos del sistema recurrentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Administración de archivos temporales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Ejercicio Guiado: Administración de archivos temporales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Cuestionario: Programación de tareas futuras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 3. Ajuste del rendimiento del sistema 69 Ajuste de perfiles de ajuste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Ejercicio Guiado: Ajuste de perfiles de ajuste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 Influencia en la programación de procesos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Ejercicio Guiado: Influencia en la programación de procesos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Trabajo de laboratorio: Ajuste del rendimiento del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 4. Control de acceso a archivos con ACL 91 Interpretación de ACL de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Cuestionario: Interpretación de ACL de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Protección de archivos con ACL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Ejercicio Guiado: Protección de archivos con ACL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Trabajo de laboratorio: Control de acceso a archivos con ACL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 5. Administración de seguridad de SELinux 121 Cambio del modo de cumplimiento de SELinux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 Ejercicio Guiado: Cambio del modo de cumplimiento de SELinux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Control de contextos de archivo de SELinux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 Ejercicio Guiado: Control de contextos de archivo de SELinux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 Ajuste de la política de SELinux con booleanos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 Ejercicio Guiado: Ajuste de la política de SELinux con booleanos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 Investigación y resolución de problemas de SELinux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 Ejercicio Guiado: Investigación y resolución de problemas de SELinux . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 Trabajo de laboratorio: Administración de seguridad de SELinux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 6. Administración de almacenamiento básico 157 RH134-RHEL8.2-es-1-20200928 v Adición de particiones, sistemas de archivos y montajes persistentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 Ejercicio Guiado: Adición de particiones, sistemas de archivos y montajes persistentes . . . . . 168 Administración de espacio de intercambio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 Ejercicio Guiado: Administración de espacio de intercambio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 Trabajo de laboratorio: Administración de almacenamiento básico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 7. Administración de volúmenes lógicos 191 Creación de volúmenes lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 Ejercicio Guiado: Creación de volúmenes lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 Ampliación de volúmenes lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 Ejercicio Guiado: Ampliación de volúmenes lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 Trabajo de laboratorio: Administración de volúmenes lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 8. Implementación de funciones avanzadas de almacenamiento 221 Gestión de almacenamiento en capas con Stratis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 Ejercicio Guiado: Gestión de almacenamiento en capas con Stratis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 Compresión y desduplicación de almacenamiento con VDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Ejercicio Guiado: Compresión y desduplicación de almacenamiento con VDO . . . . . . . . . . . . . . . . 236 Trabajo de laboratorio: Implementación de funciones avanzadas de almacenamiento . . . . . . 240 Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 9. Acceso al almacenamiento conectado a la red 251 Montaje de almacenamiento conectado a la red con NFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 Ejercicio Guiado: Administración de almacenamiento conectado a la red con NFS . . . . . . . . . . . 255 Montaje automático de almacenamiento conectado a la red . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 Ejercicio Guiado: Montaje automático de almacenamiento conectado a la red . . . . . . . . . . . . . . . . 263 Trabajo de laboratorio: Acceso al almacenamiento conectado a la red . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 10. Control del proceso de arranque 277 Selección del objetivo de arranque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 Ejercicio Guiado: Selección del objetivo de arranque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 Restablecimiento de la contraseña de root . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 Ejercicio Guiado: Restablecimiento de la contraseña de root . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 Reparación de problemas del sistema de archivos en el arranque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 Ejercicio Guiado: Reparación de problemas del sistema de archivos en el arranque . . . . . . . . . . 294 Trabajo de laboratorio: Control del proceso de arranque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 11. Administración de la seguridad de redes 305 Administración de firewalls del servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306 Ejercicio Guiado: Administración de firewalls del servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 Control del etiquetado de puertos de SELinux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 Ejercicio Guiado: Control del etiquetado de puertos de SELinux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322 Trabajo de laboratorio: Administración de la seguridad de redes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 12. Instalación de Red Hat Enterprise Linux 335 Instalación de Red Hat Enterprise Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 Ejercicio Guiado: Instalación de Red Hat Enterprise Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 Automatización de la instalación con Kickstart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 Ejercicio Guiado: Automatización de la instalación con Kickstart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 Instalación y configuración de máquinas virtuales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 Cuestionario: Instalación y configuración de máquinas virtuales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361 Trabajo de laboratorio: Instalación de Red Hat Enterprise Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 vi RH134-RHEL8.2-es-1-20200928 13. Ejecución de contenedores 371 Introducción a los contenedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 Cuestionario: Introducción a los contenedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 Ejecución de un contenedor básico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 Ejercicio Guiado: Ejecución de un contenedor básico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385 Búsqueda y administración de imágenes de contenedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 Ejercicio Guiado: Búsqueda y administración de imágenes de contenedores . . . . . . . . . . . . . . . . . . 394 Realización de una administración avanzada de contenedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399 Ejercicio Guiado: Realización de una administración avanzada de contenedores . . . . . . . . . . . . . 405 Conexión de almacenamiento persistente a un contenedor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411 Ejercicio Guiado: Conexión de almacenamiento persistente a un contenedor . . . . . . . . . . . . . . . . . . 413 Administración de contenedores como servicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 Ejercicio Guiado: Administración de contenedores como servicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 Trabajo de laboratorio: Ejecución de contenedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429 Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 14. Revisión completa 437 Revisión completa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 Trabajo de laboratorio: Corrección de problemas de arranque y mantenimiento de servidores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442 Trabajo de laboratorio: Configuración y administración de sistemas de archivos y almacenamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 Trabajo de laboratorio: Configuración y administración de seguridad del servidor . . . . . . . . . . . 456 Trabajo de laboratorio: Ejecución de contenedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466 RH134-RHEL8.2-es-1-20200928 vii viii RH134-RHEL8.2-es-1-20200928 Convenciones del documento Referencias En "Referencias", se describe el lugar donde se puede encontrar documentación externa relevante para un tema. nota Las "Notas" son consejos, atajos o enfoques alternativos para una tarea determinada. Omitir una nota no debería tener consecuencias negativas, pero quizás se pase por alto algún truco que puede simplificar una tarea. Importante En las cajas (boxes) "Importante", se detallan cosas que se olvidan con facilidad: cambios de configuración que solo se aplican a la sesión actual o servicios que se deben reiniciar para poder aplicar una actualización. Ignorar una caja (box) con la etiqueta "Importante" no provocará pérdida de datos, pero puede causar irritación y frustración. Advertencia No se deben ignorar las "advertencias". Es muy probable que ignorar las advertencias provoque la pérdida de datos. RH134-RHEL8.2-es-1-20200928 ix x RH134-RHEL8.2-es-1-20200928 Introducción Administración de sistemas Red Hat II Este curso está diseñado específicamente para estudiantes que hayan completado el curso Red Hat System Administration I (RH124). Red Hat System Administration II (RH134) se centra en las tareas principales necesarias para convertirse en un administrador de Linux de tiempo completo y validar esas habilidades mediante el examen Red Hat Certified System Administrator. Este curso aborda en detalle la administración de Enterprise Linux, que incluye sistemas de archivos y particiones, volúmenes lógicos, SELinux, funciones de firewall y solución de problemas. Objetivos del curso • Ampliar las habilidades obtenidas durante el curso Red Hat System Administration I (RH124). • Desarrollar las habilidades necesarias para un administrador de sistemas Red Hat Enterprise Linux con certificación RHCSA. Destinatarios • Este curso está diseñado particularmente para estudiantes que hayan completado el curso Red Hat System Administration I (RH124). Por la organización de los temas, no es adecuado que los estudiantes usen RH134 como punto de entrada del plan de estudios. Se alienta a los estudiantes que no hayan tomado un curso de Red Hat anterior a tomar System Administration I (RH124) si no conocen Linux o el curso RHCSA Fast Track (RH200) si tienen experiencia con la administración de Enterprise Linux. Requisitos previos • Haber realizado el curso Red Hat System Administration I (RH124), o tener conocimientos equivalentes. RH134-RHEL8.2-es-1-20200928 xi Introducción Orientación sobre el entorno del aula Figura 0.1: Entorno del aula En este curso, la computadora principal usada para las actividades prácticas de aprendizaje es workstation. Los estudiantes también usarán otras dos máquinas para las actividades: servera y serverb. Estos tres sistemas se encuentran en el dominio DNS lab.example.com. Todas las computadoras de los estudiantes tienen una cuenta de usuario estándar (student) con la contraseña student. La contraseña root de todos los sistemas de los estudiantes es redhat. Máquinas del aula Nombre de la máquina Direcciones IP Rol bastion.lab.example.com 172.25.250.254 Sistema de puerta de enlace para conectar la red privada de los estudiantes al servidor del aula (debe estar siempre en ejecución) workstation.lab.example.com 172.25.250.9 Estación de trabajo gráfica usada para la administración del sistema servera.lab.example.com 172.25.250.10 Primer servidor serverb.lab.example.com 172.25.250.11 Segundo servidor utility.lab.example.com (registry.lab.example.com) 172.25.250.220 Servidor del registro de contenedores xii RH134-RHEL8.2-es-1-20200928 Introducción La función principal de bastion es que actúa como enrutador entre la red que conecta las máquinas de los estudiantes y la red del aula. Si bastion está apagada, otras máquinas de estudiantes solo podrán acceder a sistemas en la red de estudiantes individuales. Varios sistemas en el aula brindan servicios de soporte. El host classroom.example.com proporciona dos sistemas, content.example.com y materials.example.com, que son fuentes de software y materiales del trabajo de laboratorio usados en actividades prácticas. Se provee información sobre cómo usar estos servidores en las instrucciones para estas actividades. El host utility.lab.example.com proporciona registry.lab.example.com, que ejecuta un servidor de registro de contenedores de Red Hat Quay que proporciona imágenes de contenedor para ejercicios en el aula. Los sistemas classroom, bastion y utility deben estar todos en ejecución para que el entorno del aula funcione correctamente. nota Al iniciar sesión en servera o serverb, es posible que vea un mensaje sobre la activación de cockpit. El mensaje puede ser ignorado. [student@workstation ~]$ ssh student@serverb Warning: Permanently added 'serverb,172.25.250.11' (ECDSA) to the list of known hosts. Activate the web console with: systemctl enable --now cockpit.socket [student@serverb ~]$ Control de sus sistemas Se le asignan computadoras remotas en un aula de aprendizaje en línea de Red Hat. Se accede a ellas a través de una aplicación web alojada en rol.redhat.com [http://rol.redhat.com]. Debe iniciar sesión en este sitio usando sus credenciales de usuario del Portal de clientes de Red Hat. Control de las máquinas virtuales Las máquinas virtuales del entorno de su aula se controlan a través de una página web. El estado de cada máquina virtual en el aula se muestra en la página en la pestaña Online Lab (Trabajo de laboratorio en línea). Estados de la máquina Estado de la máquina virtual Descripción STARTING (EN INICIO) La máquina virtual está por arrancar. STARTED (INICIADA) La máquina virtual se está ejecutando y está disponible (o bien, cuando arranque, pronto lo estará). STOPPING (EN DETENCIÓN) La máquina virtual está por apagarse. RH134-RHEL8.2-es-1-20200928 xiii Introducción Estado de la máquina virtual Descripción STOPPED (DETENIDA) La máquina virtual se ha apagado completamente. Al iniciarse, la máquina virtual arranca en el mismo estado en que se hallaba en el momento de apagarse (el disco se habrá preservado). PUBLISHING (PUBLICADA) Se está llevando a cabo la creación inicial de la máquina virtual. WAITING_TO_START (EN ESPERA PARA INICIARSE) La máquina virtual está esperando que inicien las demás máquinas virtuales. Según el estado de una máquina, se dispone de una selección de las siguientes acciones. Acciones de aula/máquina Botón o acción Descripción PROVISION LAB (APROVISIONAR TRABAJO DE LABORATORIO) Crea el aula de ROL. Crea todas las máquinas virtuales necesarias para el aula y las inicia. Puede tardar algunos minutos en completarse. DELETE LAB (ELIMINAR TRABAJO DE LABORATORIO) Elimina el aula de ROL. Destruye todas las máquinas virtuales del aula. Precaución: Se perderán los trabajos generados en los discos. START LAB (INICIAR TRABAJO DE LABORATORIO) Inicia todas las máquinas virtuales en el aula. SHUTDOWN LAB (APAGAR TRABAJO DE LABORATORIO) Detiene todas las máquinas virtuales en el aula. OPEN CONSOLE (ABRIR CONSOLA) Abra una nueva pestaña en el navegador y conéctese a la consola de la máquina virtual. Puede iniciar sesión directamente en la máquina virtual y ejecutar los comandos. En la mayoría de los casos, debe iniciar sesión en la máquina virtual workstation y usar ssh para conectarse a las otras máquinas virtuales. ACTION (ACCIÓN) → Start(Iniciar) Inicie (power on [encender]) la máquina virtual. ACTION (ACCIÓN) → Shutdown(Apagar) Apague la máquina virtual correctamente y preserve el contenido del disco. xiv RH134-RHEL8.2-es-1-20200928 Introducción Botón o acción Descripción ACTION (ACCIÓN) → Power Off(Desconectar) Fuerce el apagado de la máquina virtual y preserve el contenido del disco. Esto equivale a desenchufar una máquina física. ACTION (ACCIÓN) → Reset(Restablecer) Fuerce el apagado de la máquina virtual y restablezca el disco para que vuelva a su estado original. Precaución: Se perderán los trabajos generados en el disco. Al inicio de un ejercicio, si se le indica que restablezca el nodo de una máquina virtual, haga clic en ACTION (ACCIÓN) → Reset (Restablecer) solo para la máquina virtual específica. Al inicio de un ejercicio, si se le indica que restablezca todas las máquinas virtuales, haga clic en ACTION (ACCIÓN) → Reset (Restablecer) Si desea que el entorno del aula vuelva a su estado original al inicio del curso, puede hacer clic en DELETE LAB (ELIMINAR TRABAJO DE LABORATORIO) para eliminar el entorno del aula completo. Después de eliminar el trabajo de laboratorio, puede hacer clic en PROVISION LAB (APROVISIONAR TRABAJO DE LABORATORIO) para aprovisionar un nuevo conjunto de sistemas del aula. Advertencia La operación DELETE LAB (ELIMINAR TRABAJO DE LABORATORIO) no puede deshacerse. Se perderán todos los trabajos que haya completado en el entorno del aula hasta el momento. Temporizador de detención automática La inscripción a la capacitación en línea de Red Hat le da derecho a una cierta cantidad de tiempo de uso del equipo. Para ahorrar tiempo asignado de la computadora, el aula de ROL tiene un temporizador de cuenta regresiva asociado, el cual apaga el entorno del aula cuando se termina el tiempo. Para ajustar el temporizador, haga clic en MODIFY (MODIFICAR) para que aparezca el cuadro de diálogo New Autostop Time (Nuevo tiempo de detención automática). Defina la cantidad de horas hasta que el aula deba detenerse automáticamente. Tenga en cuenta que hay un tiempo máximo de diez horas. Haga clic en ADJUST TIME (AJUSTAR TIEMPO) para aplicar este cambio en los ajustes del temporizador. RH134-RHEL8.2-es-1-20200928 xv Introducción Internacionalización Selección de idioma por usuario Es posible que sus usuarios prefieran usar un idioma para su entorno de escritorio distinto al predeterminado del sistema. Quizás también quieran usar una distribución del teclado o un método de entrada distintos para su cuenta. Configuración de idioma En el entorno de escritorio GNOME, posiblemente el usuario deba definir el idioma de su preferencia y el método de entrada la primera vez que inicie sesión. Si no es así, la manera más simple para un usuario individual de definir el idioma de su preferencia y el método de entrada es usando la aplicación Region & Language. Puede iniciar esta aplicación de dos maneras. Puede ejecutar el comando gnome-controlcenter region desde una ventana de terminal, o bien, en la barra superior en el menú de sistema de la esquina derecha, puede seleccionar el botón de configuración (que tiene un icono de un destornillador y una llave inglesa cruzados) ubicado en la parte inferior izquierda del menú. En la ventana que se abre, seleccione Region & Language (Región e idioma). El usuario puede hacer clic en la caja (box) Language (Idioma) y seleccionar el idioma de su preferencia en la lista que aparece. Esto también actualiza la configuración de Formats (Formatos) mediante la adopción del valor predeterminado para ese idioma. La próxima vez que inicie sesión, se efectuarán los cambios. Estas configuraciones afectan el entorno de escritorio GNOME y todas las aplicaciones, como gnome-terminal, que se inician dentro de este. Sin embargo, de forma predeterminada, no se aplican a la cuenta si el acceso a ella es mediante un inicio de sesión ssh desde un sistema remoto o un inicio de sesión basado en texto en una consola virtual (como tty5). nota Puede hacer que su entorno de shell use la misma configuración de LANG que su entorno gráfico, incluso cuando inicia sesión a través de una consola virtual basada en texto o mediante ssh. Una manera de hacer esto es colocar un código similar al siguiente en su archivo ~/.bashrc. Este código de ejemplo definirá el idioma empleado en un inicio de sesión en interfaz de texto de modo que coincida con el idioma actualmente definido en el entorno de escritorio GNOME del usuario. i=$(grep 'Language=' /var/lib/AccountsService/users/${USER} \ | sed 's/Language=//') if [ "$i" != "" ]; then export LANG=$i fi Es posible que algunos idiomas, como el japonés, coreano, chino y otros con un conjunto de caracteres no latinos, no se vean correctamente en consolas virtuales basadas en texto. xvi RH134-RHEL8.2-es-1-20200928 Introducción Se pueden crear comandos individuales para usar otro idioma mediante la configuración de la variable LANG en la línea de comandos: [user@host ~]$ LANG=fr_FR.utf8 date jeu. avril 25 17:55:01 CET 2019 Los comandos subsiguientes se revertirán y usarán el idioma de salida predeterminado del sistema. El comando locale se puede usar para determinar el valor actual de LANG y otras variables de entorno relacionadas. Configuración del método de entrada GNOME 3 en Red Hat Enterprise Linux 7 o posterior usa de manera automática el sistema de selección de método de entrada IBus, que permite cambiar las distribuciones del teclado y los métodos de entrada de manera rápida y sencilla. La aplicación Region & Language (Región e idioma) también se puede usar para habilitar métodos de entrada alternativos. En la ventana de la aplicación Region & Language (Región e idioma), la caja (box) Input Sources (Fuentes de entrada) muestra los métodos de entrada disponibles en este momento. De forma predeterminada, es posible que English (US) (Inglés [EE. UU.]) sea el único método disponible. Resalte English (US) (Inglés [EE. UU.]) y haga clic en el icono de keyboard (teclado) para ver la distribución actual del teclado. Para agregar otro método de entrada, haga clic en el botón +, en la parte inferior izquierda de la ventana Input Sources. Se abrirá la ventana Add an Input Source (Agregar una fuente de entrada). Seleccione su idioma y, luego, el método de entrada o la distribución del teclado de su preferencia. Cuando haya más de un método de entrada configurado, el usuario puede alternar entre ellos rápidamente escribiendo Super+Space (en ocasiones denominado Windows+Space). También aparecerá un indicador de estado en la barra superior de GNOME con dos funciones: por un lado, indica el método de entrada activo; por el otro lado, funciona como un menú que puede usarse para cambiar de un método de entrada a otro o para seleccionar funciones avanzadas de métodos de entrada más complejos. Algunos de los métodos están marcados con engranajes, que indican que tienen opciones de configuración y capacidades avanzadas. Por ejemplo, el método de entrada japonés Japanese (Kana Kanji) (japonés [Kana Kanji]) permite al usuario editar previamente texto en latín y usar las teclas de Down Arrow (flecha hacia abajo) y Up Arrow (flecha hacia arriba) para seleccionar los caracteres correctos que se usarán. El indicador también puede ser de utilidad para los hablantes de inglés de Estados Unidos. Por ejemplo, en English (United States) (Inglés [Estados Unidos]) está la distribución de teclado English (international AltGr dead keys) (Inglés [internacional, teclas inactivas AltGr]), que trata AltGr (o la tecla Alt derecha) en un teclado de 104/105 teclas de una PC como una tecla modificadora "Bloq Mayús secundaria" y tecla de activación de teclas inactivas para escribir caracteres adicionales. Hay otras distribuciones alternativas disponibles, como Dvorak. RH134-RHEL8.2-es-1-20200928 xvii Introducción nota Cualquier carácter Unicode puede ingresarse en el entorno de escritorio GNOME si conoce el código Unicode del carácter. Escriba Ctrl+Shift+U, seguido por el código. Después de ingresar Ctrl+Shift+U, aparecerá una u subrayada que indicará que el sistema espera la entrada del código Unicode. Por ejemplo, la letra del alfabeto griego en minúscula lambda tiene el código U +03BB y puede ingresarse escribiendo Ctrl+Shift+U, luego 03BB y, por último, Enter. Configuración de idioma predeterminado en todo el sistema El idioma predeterminado del sistema está definido en US English (inglés de EE. UU.), que usa la codificación UTF-8 de Unicode como su conjunto de caracteres (en_US.utf8), pero puede cambiarse durante o después de la instalación. Desde la línea de comandos, el usuario root puede cambiar los ajustes de configuración regional de todo el sistema con el comando localectl. Si localectl se ejecuta sin argumentos, muestra los ajustes actuales de configuración regional de todo el sistema. Para configurar el idioma predeterminado de todo el sistema, ejecute el comando localectl set-locale LANG=locale, donde locale es el valor adecuado para la variable de entorno LANG de la tabla "Referencia de códigos de idioma" en este capítulo. El cambio entrará en vigencia para los usuarios en su siguiente inicio de sesión y se almacena en /etc/locale.conf. [root@host ~]# localectl set-locale LANG=fr_FR.utf8 En GNOME, un usuario administrativo puede cambiar esta configuración en Region & Language (Región e idioma) haciendo clic en el botón Login Screen (Pantalla de inicio de sesión) ubicado en la esquina superior derecha de la ventana. Al cambiar la opción Language (Idioma) de la pantalla de inicio de sesión gráfico, también se ajustará el valor de idioma predeterminado de todo el sistema almacenado en el archivo de configuración /etc/locale.conf. Importante Las consolas virtuales basadas en texto, como tty4, pueden mostrar una cantidad más limitada de fuentes que los terminales en una consola virtual que ejecuta un entorno gráfico, o pseudoterminales para sesiones ssh. Por ejemplo, los caracteres del japonés, coreano y chino posiblemente no se visualicen como se espera en una consola virtual basada en texto. Por este motivo, debe considerar el uso de inglés u otro idioma con un conjunto de caracteres latinos para los valores predeterminados para todo el sistema. De manera similar, las consolas virtuales basadas en texto soportan una cantidad limitada de métodos de entrada; y esto se administra de manera separada desde el entorno gráfico de escritorio. Las opciones de entrada globales pueden ser configuradas a través localectl de la consola de texto virtual y del entorno gráfico. Para obtener más información, consulte las páginas del manual localectl(1) y vconsole.conf(5). xviii RH134-RHEL8.2-es-1-20200928 Introducción Paquetes de idiomas Paquetes de RPM especiales llamados langpacks instalan paquetes de idiomas que agregan soporte para idiomas específicos. Estos paquetes de idiomas usan dependencias para instalar automáticamente paquetes de RPM adicionales que contienen localizaciones, diccionarios y traducciones para otros paquetes de software en su sistema. Use yum list langpacks-* para enumerar los paquetes de idiomas que están instalados y que pueden instalarse: [root@host ~]# yum list langpacks-* Updating Subscription Management repositories. Updating Subscription Management repositories. Installed Packages langpacks-en.noarch 1.0-12.el8 @AppStream Available Packages langpacks-af.noarch 1.0-12.el8 rhel-8-for-x86_64-appstream-rpms langpacks-am.noarch 1.0-12.el8 rhel-8-for-x86_64-appstream-rpms langpacks-ar.noarch 1.0-12.el8 rhel-8-for-x86_64-appstream-rpms langpacks-as.noarch 1.0-12.el8 rhel-8-for-x86_64-appstream-rpms langpacks-ast.noarch 1.0-12.el8 rhel-8-for-x86_64-appstream-rpms ...output omitted... Para agregar soporte de idioma, instale el paquete langpacks correcto. Por ejemplo, el siguiente comando agrega soporte para francés: [root@host ~]# yum install langpacks-fr Use yum repoquery --whatsupplements para determinar qué paquetes de RPM pueden ser instalados por un paquete de idiomas: [root@host ~]# yum repoquery --whatsupplements langpacks-fr Updating Subscription Management repositories. Updating Subscription Management repositories. Last metadata expiration check: 0:01:33 ago on Wed 06 Feb 2019 10:47:24 AM CST. glibc-langpack-fr-0:2.28-18.el8.x86_64 gnome-getting-started-docs-fr-0:3.28.2-1.el8.noarch hunspell-fr-0:6.2-1.el8.noarch hyphen-fr-0:3.0-1.el8.noarch libreoffice-langpack-fr-1:6.0.6.1-9.el8.x86_64 man-pages-fr-0:3.70-16.el8.noarch mythes-fr-0:2.3-10.el8.noarch RH134-RHEL8.2-es-1-20200928 xix Introducción Importante Los paquetes langpacks usan dependencias débiles de RPM para instalar paquetes complementarios solo cuando el paquete principal (core) que lo necesita también está instalado. Por ejemplo, al instalar langpacks-fr como se muestra en los ejemplos anteriores, el paquete mythes-fr solo se instalará si el tesauro mythes también está instalado en el sistema. Si mythes se instala posteriormente en ese sistema, el paquete mythes-fr también se instalará automáticamente debido a la débil dependencia del paquete langpacksfr ya instalado. Referencias Páginas del manual: locale(7), localectl(1), locale.conf(5), vconsole.conf(5), unicode(7) y utf-8(7). Las conversiones entre los nombres de las distribuciones X11 del entorno de escritorio gráfico y sus nombres en localectl se pueden encontrar en el archivo / usr/share/X11/xkb/rules/base.lst. Referencia de códigos de idioma nota Es posible que en esta tabla no se reflejen todos los paquetes de idiomas disponibles en su sistema. Use yum info langpacks-SUFFIX para obtener más información sobre un paquete de idiomas en particular. Códigos de idioma Idioma Sufijo de los paquetes de idiomas Valor $LANG Inglés (EE. UU.) en en_US.utf8 Asamés as as_IN.utf8 Bengalí bn bn_IN. UTF8 Chino (Simplificado) zh_CN zh_CN.utf8 Chino (Tradicional) zh_TW zh_TW.utf8 Francés fr fr_FR.utf8 Alemán de de_DE.utf8 Guyaratí gu gu_IN.utf8 xx RH134-RHEL8.2-es-1-20200928 Introducción Idioma Sufijo de los paquetes de idiomas Valor $LANG Hindi hi hi_IN.utf8 Italiano it it_IT.utf8 Japonés ja ja_JP.utf8 Canarés kn kn_IN.utf8 Coreano ko ko_KR.utf8 Malayalam ml ml_IN.utf8 Maratí mr mr_IN.utf8 Odia or or_IN.utf8 Portugués (Brasil) pt_BR pt_BR. UTF8 Punyabí pa pa_IN.utf8 Ruso ru ru_RU.utf8 Español es es_ES.utf8 Tamil ta ta_IN.utf8 Telugú te te_IN.utf8 RH134-RHEL8.2-es-1-20200928 xxi xxii RH134-RHEL8.2-es-1-20200928 capítulo 1 Mejora de la productividad con la línea de comandos Meta Ejecutar los comandos de manera más eficiente mediante el uso de las funciones avanzadas de la shell de Bash, los scripts de shell y diversas utilidades proporcionadas por Red Hat Enterprise Linux. Objetivos • Automatizar las secuencias de comandos escribiendo un simple script de shell. • Ejecutar comandos con eficiencia con listas de ítems en un script o desde la línea de comandos usando bucles for y condicionales. • Encontrar texto que coincida con un patrón en los archivos de registro y la salida del comando con el comando grep y las expresiones regulares. • Redacción de scripts de Bash simples (y ejercicio guiado) • Ejecución de comandos con mayor eficiencia usando bucles (y ejercicio guiado) • Texto coincidente en la salida de comando con expresiones regulares (y ejercicio guiado) Secciones Trabajo de laboratorio RH134-RHEL8.2-es-1-20200928 Mejora de la productividad con la línea de comandos 1 capítulo 1 | Mejora de la productividad con la línea de comandos Redacción de scripts de Bash simples Objetivos Después de completar esta sección, debe ser capaz de automatizar secuencias de comandos escribiendo un simple script de shell. Creación y ejecución de scripts de shell de Bash Muchas tareas simples y comunes de administración de sistemas se realizan usando herramientas de la línea de comandos. Las tareas que revisten mayor complejidad suelen requerir la concatenación de varios comandos que se pasen resultados entre ellos. Usando el entorno de shell Bash y las funciones de scripting, los comandos de Linux se combinan en scripts de shell para resolver fácilmente los problemas repetitivos y difíciles del mundo real. En su forma más simple, un script de shell Bash es un archivo ejecutable que contiene una lista de comandos, y posiblemente con lógica de programación para controlar la toma de decisiones en la tarea general. Si está bien escrito, un script de shell puede convertirse en una eficiente herramienta de la línea de comandos cuando se ejecuta solo, y otros scripts pueden usarlo. Para que los administradores de sistemas de Linux se desempeñen correctamente en todos los entornos operativos, es esencial que tengan experiencia con scripting de shell. El conocimiento práctico de scripting de shell resulta de especial importancia en entornos empresariales en los que su uso puede traducirse en mayores eficiencia y precisión en la realización de tareas de rutina. Puede crear un script de shell de Bash abriendo un archivo vacío en un editor de texto. Si bien puede usar cualquier editor de texto, los editores avanzados, como vim o emacs, entienden la sintaxis de shell de Bash y pueden proporcionar resaltado codificado por colores. Este resaltado ayuda a identificar errores comunes, como sintaxis incorrecta, comillas faltantes, paréntesis, llaves y corchetes faltantes, y mucho más. Especificación del intérprete de comandos La primera línea de un script comienza con la notación '#!', que comúnmente se denominan sh-bang o she-bang, a partir de los nombres de esos dos caracteres, sharp y bang . Esta notación específica de número mágico de dos bites indica un script interpretativo; la sintaxis que sigue a la notación es el nombre del archivo completamente calificado para el intérprete de comandos correcto necesario para procesar las líneas de este script. Para entender como los números mágicos indican los tipos de archivos en Linux, consulte las páginas del manual file(1) y magic(5). Para los archivos de script que usan la sintaxis de scripting de Bash, la primera línea de un script de shell comienza de la siguiente manera: #!/bin/bash Ejecución de un script de shell de Bash Un script de shell completado debe ser ejecutable para ejecutarse como un comando ordinario. Use el comando chmod para agregar un permiso de ejecución, posiblemente junto con el comando chown para cambiar la propiedad del archivo del script. Otorgue permiso de ejecución solo para los usuarios previstos del script. 2 RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos Si coloca el script en uno de los directorios listados en la variable ambiental PATH de la shell, puede invocar el script de shell usando solo el nombre del archivo como con cualquier otro comando. La shell usa el primer comando que encuentra con ese nombre de archivo; evite usar nombres de comandos existentes para su nombre de archivo del script de shell. Alternativamente, puede invocar un script de shell ingresando un nombre de ruta al script en la línea de comandos. El comando which, seguido del nombre de archivo del script ejecutable, muestra el nombre de la ruta al comando que se ejecutará. [user@host ~]$ which hello ~/bin/hello [user@host ~]$ echo $PATH /home/user/.local/bin:/home/user/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/ bin:/usr/local/sbin:/usr/sbin Entrecomillado de caracteres especiales Una serie de caracteres y palabras tienen significados especiales para la shell de Bash. Sin embargo, ocasionalmente querrá usar estos caracteres para sus valores literales, en lugar de para sus significados especiales. Para ello, use una de las tres herramientas para eliminar (o escape) el significado especial: la barra invertida (\), comillas simples ('') o comillas dobles (""). El carácter de escape barra invertida quita el significado especial del carácter individual que le sigue inmediatamente. Por ejemplo, para visualizar la cadena # not a comment con el comando echo, el signo # no debe ser interpretado por Bash con su significado especial. Coloque el carácter de barra invertida delante del signo #. [user@host ~]$ echo # not a comment [user@host ~]$ echo \# not a comment # not a comment Cuando se debe eludir más de un carácter en una cadena de texto, los usuarios pueden usar el carácter de escape varias veces o usar comillas simples (''). Las comillas simples conservan el significado literal de todos los caracteres que encierran. Observe el carácter de escape y las comillas simples en acción: [user@host ~]$ echo # not a comment # [user@host ~]$ echo \# not a comment # # not a comment [user@host ~]$ echo \# not a comment \# # not a comment # [user@host ~]$ echo '# not a comment #' # not a comment # Use comillas dobles para suprimir el globbing y la expansión de la shell, pero permita la sustitución de comandos y variables. A nivel conceptual, la sustitución de variables es idéntica a la sustitución de comandos, pero puede usar sintaxis de llaves opcional. Observe los ejemplos de las diversas formas de uso de comillas a continuación. Use comillas simples para interpretar todo el texto literalmente. Además de suprimir el globbing y la expansión de la shell, las comillas dirigen a la shell para que también suprima la sustitución de RH134-RHEL8.2-es-1-20200928 3 capítulo 1 | Mejora de la productividad con la línea de comandos comandos y variables. El signo de interrogación (?) es un metacarácter que también necesita protección para evitar la expansión. [user@host ~]$ var=$(hostname -s); echo $var host [user@host ~]$ echo "***** hostname is ${var} *****" ***** hostname is host ***** [user@host ~]$ echo Your username variable is \$USER. Your username variable is $USER. [user@host ~]$ echo "Will variable $var evaluate to $(hostname -s)?" Will variable host evaluate to host? [user@host ~]$ echo 'Will variable $var evaluate to $(hostname -s)?' Will variable $var evaluate to $(hostname -s)? [user@host ~]$ echo "\"Hello, world\"" "Hello, world" [user@host ~]$ echo '"Hello, world"' "Hello, world" Proporcionar salida de un script de shell El comando echo visualiza texto arbitrario al asignar el texto como argumento del comando. De manera predeterminada, el texto se visualiza en salida estándar (STDOUT), pero también puede dirigirse a error estándar (STDERR) si se usa la redirección de la salida. En el siguiente script de Bash simple, el comando echo muestra el mensaje "Hello, world" (Hola, mundo) a STDOUT. [user@host ~]$ cat ~/bin/hello #!/bin/bash echo "Hello, world" [user@host ~]$ hello Hello, world nota Este usuario solo puede ejecutar hello en el prompt porque el directorio ~/bin (/ home/user/bin) está en la variable PATH del usuario y el script hello en este es ejecutable. La shell encuentra automáticamente el script allí, siempre que no haya otro archivo ejecutable llamado hello en cualquiera de los directorios enumerados antes de /home/user/bin en la PATH. El comando echo se usa ampliamente en scripts de shell para mostrar mensajes informativos o de error. Estos mensajes pueden ser indicadores útiles del progreso de un script y pueden dirigirse a salida estándar, error estándar, o bien ser redirigidos a un archivo de registro para su archivado. Cuando se visualizan mensajes de error, se recomienda dirigirlos a STDERR a fin de facilitar la diferenciación entre mensajes de error y mensajes de estado normal. [user@host ~]$ cat ~/bin/hello #!/bin/bash echo "Hello, world" echo "ERROR: Houston, we have a problem." >&2 4 RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos [user@host ~]$ hello 2> hello.log Hello, world [user@host ~]$ cat hello.log ERROR: Houston, we have a problem. El comando echo también puede resultar de utilidad cuando se intenta depurar un script de shell problemático. La adición de sentencias echo a la parte del script que no se comporta según lo previsto puede ser de ayuda para aclarar los comandos que se ejecutan, así como los valores de las variables que se invocan. Referencias Páginas del manual: bash(1), magic(5), echo(1) y echo(1p). RH134-RHEL8.2-es-1-20200928 5 capítulo 1 | Mejora de la productividad con la línea de comandos Ejercicio Guiado Redacción de scripts de Bash simples En este ejercicio, escribirá una secuencia de comandos de Bash simple que contiene una secuencia de comandos y la ejecutará desde la línea de comandos. Resultados Usted deberá ser capaz de realizar lo siguiente: • Escribir y ejecutar un simple script de Bash • Redirigir la salida de un script de Bash simple a un archivo Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab console-write start. Este comando ejecuta un script de inicio que determina si la máquina servera es accesible en la red. El script le avisará si no está disponible. También instala el paquete vim-enhanced si es necesario. [student@workstation ~]$ lab console-write start 1. Desde workstation, abra una sesión de SSH en servera como student. Los sistemas se configuran para que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Cree y ejecute un script simple de Bash. 2.1. Use el editor de texto vim para crear un nuevo archivo de texto en su directorio de inicio y asígnele el nombre firstscript.sh. [student@servera ~]$ vim firstscript.sh 2.2. Inserte el siguiente texto y guarde el archivo. Tenga en cuenta que la cantidad de señales hash (#) es arbitraria. #!/bin/bash echo "This is my first bash script" > ~/output.txt echo "" >> ~/output.txt echo "#####################################################" >> ~/output.txt 2.3. 6 Use el comando sh para ejecutar el script. RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos [student@servera ~]$ sh firstscript.sh 2.4. Revise el archivo de salida generado por el script. [student@servera ~]$ cat output.txt This is my first bash script ##################################################### 3. Agregue más comandos al script firstscript.sh, ejecútelo y revise la salida. 3.1. Use el editor de texto vim para editar el firstscript.sh. [student@servera ~]$ vim firstscript.sh 3.2. Agregue las siguientes líneas en negrita al archivo firstscript.sh. #!/bin/bash # echo "This is my first bash script" > ~/output.txt echo "" >> ~/output.txt echo "#####################################################" >> ~/output.txt echo "LIST BLOCK DEVICES" >> ~/output.txt echo "" >> ~/output.txt lsblk >> ~/output.txt echo "" >> ~/output.txt echo "#####################################################" >> ~/output.txt echo "FILESYSTEM FREE SPACE STATUS" >> ~/output.txt echo "" >> ~/output.txt df -h >> ~/output.txt echo "#####################################################" >> ~/output.txt 3.3. Haga que el archivo firstscript.sh sea ejecutable con el comando chmod. [student@servera ~]$ chmod a+x firstscript.sh 3.4. Ejecute el script firstscript.sh. [student@servera ~]$ ./firstscript.sh 3.5. Revise el archivo de salida generado por el script. [student@servera ~]$ cat output.txt This is my first bash script ##################################################### LIST BLOCK DEVICES NAME sr0 MAJ:MIN RM SIZE RO TYPE MOUNTPOINT 11:0 1 1024M 0 rom RH134-RHEL8.2-es-1-20200928 7 capítulo 1 | Mejora de la productividad con la línea de comandos vda 252:0 └─vda1 252:1 vdb 252:16 0 0 0 10G 10G 5G 0 disk 0 part / 0 disk ##################################################### FILESYSTEM FREE SPACE STATUS Filesystem Size Used Avail Use% Mounted on devtmpfs 892M 0 892M 0% /dev tmpfs 915M 0 915M 0% /dev/shm tmpfs 915M 17M 899M 2% /run tmpfs 915M 0 915M 0% /sys/fs/cgroup /dev/vda1 10G 1.5G 8.6G 15% / tmpfs 183M 0 183M 0% /run/user/1000 ##################################################### 4. Elimine los archivos de ejercicio y cierre sesión en servera. 4.1. Elimine el archivo de script firstscript.sh y el archivo de salida output.txt. [student@servera ~]$ rm firstscript.sh output.txt 4.2. Cierre sesión en servera. [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute el script lab console-write finish para terminar este ejercicio. [student@workstation ~]$ lab console-write finish Esto concluye el ejercicio guiado. 8 RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos Ejecución de comandos con mayor eficiencia usando bucles Objetivos Tras finalizar esta sección, usted deberá ser capaz de realizar lo siguiente: • Iterar en listas usando bucles for. • Evaluar los códigos de salida de comandos y scripts. • Realizar pruebas con operadores. • Crear estructuras condicionales con declaraciones if Uso de bucles para iterar comandos Los administradores de sistemas a menudo se encuentran con tareas repetitivas en sus actividades cotidianas. Las tareas repetitivas pueden implicar la realización de una acción varias veces en un objetivo, como controlar un proceso una vez por minuto durante 10 minutos para ver si ha finalizado. La repetición de tareas también puede implicar la realización de una acción una vez en varios objetivos, como realizar una copia de seguridad de cada base de datos de un sistema. El bucle for es una de las tantas construcciones de bucles de shell que ofrece Bash que puede usarse para iteraciones de tareas. Procesamiento de ítems desde la línea de comandos La construcción del bucle for de Bash emplea la siguiente sintaxis. for VARIABLE in LIST; do COMMAND VARIABLE done El bucle procesa las cadenas proporcionadas en LIST en orden, de a una por vez, y termina después de procesar la última cadena de la lista. Cada cadena de la lista se almacena provisoriamente como el valor de VARIABLE, mientras que el bucle for ejecuta el bloque de comandos incluido en su construcción. El nombre asignado a la variable es arbitrario. Normalmente, se hace referencia al valor de la variable a través de comandos en el bloque de comandos. La lista de cadenas proporcionadas a un bucle for puede proporcionarse de distintas maneras. Puede ser una lista de cadenas ingresadas directamente por el usuario o generada a partir de distintos tipos de expansión de shell, como expansión de variable, expansión de llave, expansión de nombre de archivo o sustitución de comandos. A continuación se incluyen algunos ejemplos que demuestran las distintas maneras en que se pueden proporcionar cadenas a bucles for. [user@host ~]$ for HOST in host1 host2 host3; do echo $HOST; done host1 host2 host3 [user@host ~]$ for HOST in host{1,2,3}; do echo $HOST; done host1 host2 RH134-RHEL8.2-es-1-20200928 9 capítulo 1 | Mejora de la productividad con la línea de comandos host3 [user@host ~]$ for HOST in host{1..3}; do echo $HOST; done host1 host2 host3 [user@host ~]$ for FILE in file*; do ls $FILE; done filea fileb filec [user@host ~]$ for FILE in file{a..c}; do ls $FILE; done filea fileb filec [user@host ~]$ for PACKAGE in $(rpm -qa | grep kernel); \ do echo "$PACKAGE was installed on \ $(date -d @$(rpm -q --qf "%{INSTALLTIME}\n" $PACKAGE))"; done abrt-addon-kerneloops-2.1.11-12.el7.x86_64 was installed on Tue Apr 22 00:09:07 EDT 2014 kernel-3.10.0-121.el7.x86_64 was installed on Thu Apr 10 15:27:52 EDT 2014 kernel-tools-3.10.0-121.el7.x86_64 was installed on Thu Apr 10 15:28:01 EDT 2014 kernel-tools-libs-3.10.0-121.el7.x86_64 was installed on Thu Apr 10 15:26:22 EDT 2014 [user@host ~]$ for EVEN in $(seq 2 2 10); do echo "$EVEN"; done 2 4 6 8 10 Uso de códigos de salida en un script Después de que un script haya procesado todos sus contenidos, sale al proceso que lo llamó. Sin embargo, es posible que ocasionalmente se desee finalizar un script antes de que termine, como cuando se detecta una condición de error. Para ello, debe usarse el comando exit dentro de un script. Cuando un script detecta el comando exit, finaliza de inmediato y no procesa el resto del script. El comando exit puede ejecutarse con un argumento entero opcional entre 0 y 255, que representa un código de salida. Un código de salida es un código que se devuelve después de que se ha completado un proceso. Un valor de código de salida igual a 0 indica que no hay error. Todos los demás valores diferentes a cero indican un código de salida con error. Puede usar valores que no son cero distintos para diferenciar los diversos tipos de errores detectados. El código de salida se traslada al proceso principal, que lo almacena en la variable ? y al que puede accederse con $?, conforme se demuestra en los siguientes ejemplos. [user@host bin]$ cat hello #!/bin/bash echo "Hello, world" exit 0 [user@host bin]$ ./hello Hello, world 10 RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos [user@host bin]$ echo $? 0 Si el comando exit se solicita sin un argumento, el script finaliza y pasa el estado de salida del último comando ejecutado al proceso principal. Prueba de entradas de script Para asegurarse de que condiciones imprevistas no ocasionen fácilmente la falla de scripts, se recomienda que no se hagan suposiciones con respecto a las entradas, como argumentos de la línea de comandos, entradas del usuario, sustituciones de comandos, expansiones de variables y expansiones de nombres de archivo. La verificación de la integridad puede realizarse usando el comando test de Bash. Al igual que todos los comandos, el comando test, tras finalizar, genera un código de salida, que se almacena como el valor $?. Para ver la conclusión de una prueba, muestre el valor de $? que se encuentra inmediatamente a continuación de la ejecución del comando test. Una vez más, un estado de salida igual a 0 indica que la prueba se realizó correctamente, mientras que un estado de salida distinto a cero indica que la prueba no se realizó correctamente. Las pruebas se realizan con una variedad de operadores. Los operadores pueden usarse para determinar si un número es mayor que, mayor o igual que, menor que, menor o igual que, o igual a otro número. Se pueden usar para probar si una cadena de texto es igual o no a otra cadena de texto. Los operadores también pueden usarse para evaluar si una variable tiene un valor o no. nota Muchos tipos de operadores se usan en scripting de shell, además de los operadores de comparación que se enseñan aquí. La página del manual de test(1) enumera los operadores de expresiones condicionales importantes con descripciones. La página del manual de bash(1) también explica el uso y la evaluación del operador, pero es una lectura muy difícil para los principiantes. Se recomienda que los estudiantes amplíen sus necesidades avanzadas sobre scripting de shell con libros y cursos dedicados a la programación de shell. A continuación se ejemplifica el uso del comando test con los operadores comparativos numéricos de Bash. [user@host ~]$ test 1 -gt 0 ; echo $? 0 [user@host ~]$ test 0 -gt 1 ; echo $? 1 Las pruebas pueden realizarse mediante el uso de la sintaxis de comandos de prueba de Bash: [ <TESTEXPRESSION> ]. También pueden llevarse a cabo mediante el uso de la sintaxis de comandos de prueba ampliada más nueva de Bash: [[ <TESTEXPRESSION> ]], que está disponible a partir de la versión 2.02 de Bash y que proporciona características como coincidencia de patrones de comodines y coincidencia de patrones de expresiones regulares. A continuación se ejemplifica el uso de la sintaxis de comandos de prueba y los operadores comparativos numéricos de Bash. RH134-RHEL8.2-es-1-20200928 11 capítulo 1 | Mejora de la productividad con la línea de comandos [user@host ~]$ [ 1 -eq 1 ]; echo $? 0 [user@host ~]$ [ 1 -ne 1 ]; echo $? 1 [user@host ~]$ [ 8 -gt 2 ]; echo $? 0 [user@host ~]$ [ 2 -ge 2 ]; echo $? 0 [user@host ~]$ [ 2 -lt 2 ]; echo $? 1 [user@host ~]$ [ 1 -lt 2 ]; echo $? 0 A continuación se ejemplifica el uso de operadores comparativos de cadenas de Bash. [user@host ~]$ [ abc = abc ]; echo $? 0 [user@host ~]$ [ abc == def ]; echo $? 1 [user@host ~]$ [ abc != def ]; echo $? 0 A continuación se ejemplifica el uso de operadores individuales de cadenas de Bash. [user@host ~]$ STRING=''; [ -z "$STRING" ]; echo $? 0 [user@host ~]$ STRING='abc'; [ -n "$STRING" ]; echo $? 0 nota Los caracteres de espacio dentro de los corchetes de prueba son obligatorios, porque separan las palabras y los elementos dentro de la expresión de prueba. La rutina de análisis de comandos de la shell divide todas las líneas de comandos en palabras y operadores al reconocer espacios y otros metacaracteres con reglas de análisis incorporadas. Para obtener un análisis completo de este concepto avanzado, consulte la página del manual getopt(3). El carácter de corchete izquierdo ([) es en sí un alias incorporado para el comando test. Las palabras de shell, ya sean comandos, subcomandos, opciones, argumentos u otros elementos de token, están siempre delimitadas por espacios. Estructuras condicionales Los scripts de shell simples representan una recopilación de comandos que se ejecutan de principio a fin. Las estructuras condicionales permiten que los usuarios incorporen la toma de decisiones en scripts de shell, de modo que ciertas partes del script se ejecutan solo cuando se cumplen determinadas condiciones. Uso de la construcción if/then La estructura condicional más simple en Bash es la construcción if/then, que tiene la siguiente sintaxis: 12 RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos if <CONDITION>; then <STATEMENT> ... <STATEMENT> fi Con esta construcción, si se cumple una determinada condición, se realizan una o más acciones. Si la condición no se cumple, no se realiza ninguna acción. Las pruebas de números, cadenas y archivos demostradas anteriormente se usan con frecuencia para la prueba de condiciones en declaraciones if/then. La declaración if del final cierra la construcción if/then. En la siguiente sección de código, se demuestra el uso de una construcción if/then para iniciar el servicio psacct si no se encuentra activo. [user@host ~]$ systemctl is-active psacct > /dev/null 2>&1 [user@host ~]$ if [ $? -ne 0 ]; then > sudo systemctl start psacct > fi Uso de la construcción if/then/else La construcción if/then puede expandirse aún más para que diversas acciones puedan realizarse en función de si una condición se cumple o no. Esto se logra con la construcción if/ then/else. if <CONDITION>; then <STATEMENT> ... <STATEMENT> else <STATEMENT> ... <STATEMENT> fi En la siguiente sección de código, se demuestra el uso de una declaración if/then/else para iniciar el servicio psacct si no se encuentra activo y para detenerlo si está activo. [user@host ~]$ systemctl is-active psacct > /dev/null 2>&1 [user@host ~]$ if [ $? -ne 0 ]; then > sudo systemctl start psacct > else > sudo systemctl stop psacct > fi Uso de la construcción if/then/elif/then/else Por último, la estructura condicional if/then/else puede expandirse aún más para probar más de una condición y se ejecutará un conjunto de acciones diferente cuando se cumpla una condición. La construcción se muestra en el siguiente ejemplo: RH134-RHEL8.2-es-1-20200928 13 capítulo 1 | Mejora de la productividad con la línea de comandos if <CONDITION>; then <STATEMENT> ... <STATEMENT> elif <CONDITION>; then <STATEMENT> ... <STATEMENT> else <STATEMENT> ... <STATEMENT> fi Es esta estructura condicional, Bash prueba las condiciones en el orden presentado. Cuando encuentra una condición verdadera, Bash ejecuta las acciones asociadas con la condición y, luego, omite el resto de la estructura condicional. Si ninguna condición es verdadera, Bash ejecuta las acciones enumeradas en la cláusula else. En la siguiente sección de código, se demuestra el uso de una declaración if/then/elif/ then/else para ejecutar el cliente mysql si el servicio mariadb está activo, para ejecutar el cliente psql si el servicio postgresql está activo o para ejecutar el cliente sqlite3 si los servicios mariadb y postgresql no están activos. [user@host ~]$ systemctl is-active mariadb > /dev/null 2>&1 MARIADB_ACTIVE=$? [user@host ~]$ sudo systemctl is-active postgresql > /dev/null 2>&1 POSTGRESQL_ACTIVE=$? [user@host ~]$ if [ "$MARIADB_ACTIVE" -eq 0 ]; then > mysql > elif [ "$POSTGRESQL_ACTIVE" -eq 0 ]; then > psql > else > sqlite3 > fi Referencias Página del manual (1)bash 14 RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos Ejercicio Guiado Ejecución de comandos con mayor eficiencia usando bucles En este ejercicio, usará bucles para imprimir de manera eficiente el nombre de host desde varios servidores. Resultados Debe ser capaz de crear un bucle for para iterar a través de una lista de ítems de la línea de comandos y en un script de shell. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab console-commands start. Este comando ejecuta un script de inicio que determina si los hosts servera y serverb están accesibles en la red. El script le avisará si no están disponibles. [student@workstation ~]$ lab console-commands start 1. Use los comandos ssh y hostname para imprimir el nombre de host de servera y serverb en la salida estándar. [student@workstation ~]$ ssh student@servera hostname servera.lab.example.com [student@workstation ~]$ ssh student@serverb hostname serverb.lab.example.com 2. Cree un bucle for para realizar la misma tarea de manera más eficiente. [student@workstation ~]$ for HOST in servera serverb do ssh student@${HOST} hostname done servera.lab.example.com serverb.lab.example.com 3. Cree un script de shell para ejecutar el mismo bucle for. 3.1. Cree el directorio /home/student/bin para contener el script de shell. [student@workstation ~]$ mkdir ~/bin 3.2. Verifique que el directorio recién creado esté en su variable ambiental PATH. RH134-RHEL8.2-es-1-20200928 15 capítulo 1 | Mejora de la productividad con la línea de comandos [student@workstation ~]$ echo $PATH /home/student/.local/bin:/home/student/bin::/usr/local/bin:/usr/bin:/usr/local/ sbin:/usr/sbin 3.3. Cree un script de shell en /home/student/bin/printhostname.sh para realizar el bucle for. Use el comando cat para verificar el contenido de printhostname.sh. [student@workstation ~]$ vim ~/bin/printhostname.sh [student@workstation ~]$ cat ~/bin/printhostname.sh #!/bin/bash #Execute for loop to print server hostname. for HOST in servera serverb do ssh student@${HOST} hostname done exit 0 3.4. Asegúrese de que el script recién creado sea ejecutable. [student@workstation ~]$ chmod +x ~/bin/printhostname.sh 3.5. Ejecute el script desde su directorio de inicio. [student@workstation ~]$ printhostname.sh servera.lab.example.com serverb.lab.example.com 3.6. Verifique que el código de salida de su script sea 0. [student@workstation ~]$ echo $? 0 Finalizar En workstation, ejecute el script lab console-commands finish para terminar este ejercicio. [student@workstation ~]$ lab console-commands finish Esto concluye el ejercicio guiado. 16 RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos Texto coincidente en la salida de comando con expresiones regulares Objetivos Tras finalizar esta sección, los estudiantes deben ser capaces de realizar lo siguiente: • Crear expresiones regulares que correspondan a los datos deseados • Aplicar expresiones regulares a archivos de texto con el comando grep • Usar grep para buscar archivos y datos de comandos canalizados Escritura de expresiones regulares Las expresiones regulares proporcionan un mecanismo de coincidencia de patrones que facilita la búsqueda de contenido específico. Los comandos vim, grep y less pueden usar expresiones regulares. Los lenguajes de programación, como Perl, Python y C usan expresiones regulares cuando usan criterios que corresponden a patrones. Las expresiones regulares son un lenguaje en sí mismas, lo que significa que tienen su propia sintaxis y reglas. En esta sección, se da un vistazo a la sintaxis usada en la creación de expresiones regulares y se mostrarán algunos ejemplos del uso de expresiones regulares. Descripción de una expresión regular simple La expresión regular más simple es una coincidencia exacta. Una coincidencia exacta es cuando los caracteres de la expresión regular coinciden con el tipo y el orden de los datos que se están buscando. Supongamos que un usuario está explorando el siguiente archivo en busca de todas las veces que aparece el patrón cat: cat dog concatenate dogma category educated boondoggle vindication chilidog cat es una correspondencia exacta de una c, seguida de una a, seguida de una t sin otros caracteres en el medio. El uso de cat como expresión regular para buscar el archivo anterior arroja las siguientes coincidencias: RH134-RHEL8.2-es-1-20200928 17 capítulo 1 | Mejora de la productividad con la línea de comandos cat concatenate category educated vindication Coincidencias con el inicio y el final de una línea En la sección anterior, se usó una expresión regular de correspondencia exacta en un archivo. Observe que la expresión regular coincidiría con la cadena de búsqueda independientemente de en qué parte de la línea se encuentre: al principio, al final o en el medio de la palabra o línea. Use un delimitador de línea para controlar la ubicación donde la expresión regular busca una coincidencia. Para buscar al principio de una línea, use el carácter de intercalación (^). Para buscar al final de una línea, use el signo de dólar ($). Usando el mismo archivo que arriba, la expresión regular ^cat coincidiría con dos palabras. La expresión regular $cat no encontraría ninguna palabra coincidente. cat dog concatenate dogma category educated boondoggle vindication chilidog Para localizar líneas del archivo que terminen con dog, use esa expresión exacta y un delimitador de final de línea para crear la expresión regular dog$. Si se aplica dog$ al archivo, se arrojarán dos coincidencias: dog chilidog Para localizar la única palabra en una línea, use el tanto el delimitador del principio y el del final de línea. Por ejemplo, para localizar la palabra cat cuando es la única palabra en una línea, use ^cat$. cat dog rabbit cat horse cat cow cat pig Adición de comodines y multiplicadores a expresiones regulares Las expresiones regulares usan un punto (.) para hacer coincidir un carácter único con la excepción del carácter de nueva línea. Una expresión regular de c.t busca una cadena que contenga una c seguida de un carácter individual seguido por una t. Ejemplos de coincidencias incluyen cat, concatenate, vindication, c5t y c$t. 18 RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos Al usar un comodín no restringido, no puede predecir el carácter que coincidirá con el comodín. Para hacer coincidir caracteres específicos, reemplace el comodín no restringido con caracteres aceptables. Se cambia la expresión regular a c[aou]t, coincidirá con patrones que comiencen con una c, seguida de una a, una o o una u, seguida de una t. Los multiplicadores son un mecanismo usado a menudo con comodines. Los multiplicadores se aplican al carácter anterior en la expresión regular. Uno de los multiplicadores más comunes que se usan es el asterisco o el carácter de estrella. (*). Cuando se usa en una expresión regular, este multiplicador significa que coincida con cero o más de la expresión anterior. Puedes usar * con expresiones, no solo con personajes. Por ejemplo, c[aou]*t. Una expresión regular de c.*t coincide con cat, coat, culvert e incluso ct (cero caracteres entre la c y la t). Cualquier dato que comience con una c, luego cero o más caracteres, y que finalice con una t. Otro tipo de multiplicador indicaría la cantidad de caracteres anteriores deseados en el patrón. Un ejemplo del uso de un multiplicador explícito sería 'c.\{2\}t'. Esta expresión regular coincidirá con cualquier palabra que comience con c, seguida de exactamente dos caracteres cualesquiera, y que termine con una t. La expresión 'c.\{2\}t' coincidiría con dos palabras en el siguiente ejemplo: cat coat convert cart covert cypher nota Se recomienda usar comillas simples para encapsular la expresión regular porque a menudo contienen metacaracteres de shell (como $, * y {}). Esto asegura que los caracteres sean interpretados por el comando y no por la shell. nota Este curso ha presentado dos sistemas distintos de análisis de texto de metacaracteres: coincidencia de patrones de shell (también conocido como comodín de archivo o expansión de nombre de archivo) y expresiones regulares. Debido a que ambos sistemas usan metacaracteres similares, como el asterisco (*), pero tienen diferencias en la interpretación y las reglas de los metacaracteres, estos sistemas pueden resultar confusos hasta que se los domine a cada uno lo suficiente. La coincidencia de patrones es una técnica de análisis de líneas de comandos diseñada para especificar fácilmente muchos nombres de archivos, y se admite principalmente solo para representar patrones de nombres de archivos en la línea de comandos. Las expresiones regulares están diseñadas para representar cualquier forma o patrón en las cadenas de texto, sin importar cuán complejas sean. Las expresiones regulares son compatibles internamente con numerosos comandos de procesamiento de texto, como grep, sed, awk, python, perl y muchas aplicaciones, con algunas mínimas variaciones dependientes del comando en las reglas de interpretación. RH134-RHEL8.2-es-1-20200928 19 capítulo 1 | Mejora de la productividad con la línea de comandos Expresiones regulares Opción Descripción . El punto (.) coincide con cualquier carácter individual. ? El ítem anterior es opcional y coincidirá como máximo una vez. * El ítem anterior coincidirá cero o más veces. + El ítem anterior coincidirá una o más veces. {n} El ítem anterior coincide exactamente n veces. {n,} El ítem anterior coincide n o más veces. {,m} El ítem anterior coincide como máximo m veces. {n,m} El ítem anterior coincide como mínimo n veces y como máximo m veces. [:alnum:] Caracteres alfanuméricos: '[:alpha:]' y '[:digit:]'; en la configuración regional 'C' y en la codificación de caracteres ASCII, esto es lo mismo que '[0-9AZa-z]'. [:alpha:] Caracteres alfanuméricos: '[:lower:]' y '[:upper:]'; en la configuración regional 'C' y en la codificación de caracteres ASCII esto es lo mismo que '[A-Za-z]'. [:blank:] Caracteres en blanco: espacio y tabulación. [:cntrl:] Caracteres de control. En ASCII, estos caracteres tienen códigos octales del 000 al 037, y 177 (DEL). En otros conjuntos de caracteres, estos son los caracteres equivalentes, si los hay. [:digit:] Dígitos: 0 1 2 3 4 5 6 7 8 9. [:graph:] Caracteres gráficos: '[:alnum:]' y '[:punct:]'. [:lower:] Letras minúsculas; en la configuración regional 'C' y en la codificación de caracteres ASCII, esto es a b c d e f g h i j k l m n o p q r s t u v w x y z. [:print:] Caracteres imprimibles: '[:alnum:]','[:punct:]' y el espacio. [:punct:] Caracteres de puntuación; en la configuración regional 'C' y la codificación de caracteres ASCII, esto es ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ' { | } ~. En otros conjuntos de caracteres, estos son los caracteres equivalentes, si los hay. [:space:] Caracteres de espacio: en la configuración regional 'C', esto es tabulación, nueva línea, tabulación vertical, avance de página, retorno de carro y espacio. [:upper:] Letras mayúsculas; en la configuración regional 'C' y en la codificación de caracteres ASCII, esto es A B C D E F G H I J K L M N O P Q R S T U V W X Y Z. [:xdigit:] Dígitos hexadecimales: 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f. 20 RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos Opción Descripción \b Coincidir con la cadena vacía en el extremo de una palabra. \B Coincidir con la cadena vacía, siempre que no sea en el extremo de una palabra. \< Coincidir con la cadena vacía al principio de una palabra. \> Coincidir con la cadena vacía al final de una palabra. \w Coincidir con el componente de la palabra. Sinónimo de '[_[:alnum:]]'. \W Coincidir con la ausencia de componente de la palabra. Sinónimo de '[^_[:alnum:]]'. \s Coincidir con el espacio en blanco. Sinónimo de '[[:space:]]'. \S Coincidir con la ausencia de espacio en blanco. Sinónimo de '[^[:space:]]'. Coincidencia de expresiones regulares con Grep El comando grep, proporcionado como parte de la distribución, usa expresiones regulares para aislar los datos correspondientes. Aislamiento de datos usando el comando grep El comando grep proporciona una expresión regular y un archivo con el cual la expresión regular debe coincidir. [user@host ~]$ grep '^computer' /usr/share/dict/words computer computerese computerise computerite computerizable computerization computerize computerized computerizes computerizing computerlike computernik computers nota Se recomienda usar comillas simples para encapsular la expresión regular porque a menudo contienen metacaracteres de shell (como $, * y {}). Esto asegura que los caracteres sean interpretados por el comando grep y no por la shell. El comando grep se puede usar junto con otros comandos mediante el uso de un operador de pipe (|). Por ejemplo: RH134-RHEL8.2-es-1-20200928 21 capítulo 1 | Mejora de la productividad con la línea de comandos [root@host ~]# ps aux | grep chrony chrony 662 0.0 0.1 29440 2468 ? S 10:56 0:00 /usr/sbin/chronyd Opciones de grep El comando grep tiene muchas opciones útiles para ajustar cómo usa la expresión regular con datos. Tabla de opciones de grep comunes Opción Función -i Usa la expresión regular proporcionada, pero no detecta diferencias entre mayúsculas y minúsculas. -v Solo muestra las líneas que no contienen coincidencias con la expresión regular. -r Aplica la búsqueda de datos que coincidan con la expresión regular de forma recursiva para un grupo de archivos o directorios. -A NUMBER Muestra NUMBER (número) de líneas después de la coincidencia de la expresión regular. -B NUMBER Muestra NUMBER (número) de líneas antes de la coincidencia de la expresión regular. -e Si se usan varias opciones -e, se pueden suministrar varias expresiones regulares y se usarán con un OR lógico. Hay muchas otras opciones para grep. Use la página man para investigarlas. Ejemplos de grep Los siguientes ejemplos usan archivos de configuración y de registro variados. Las expresiones regulares distinguen entre minúsculas y mayúsculas de manera predeterminada. Use la opción -i con grep para ejecutar una búsqueda que distinga entre minúsculas y mayúsculas. En el siguiente ejemplo, se busca el patrón serverroot. [user@host ~]$ cat /etc/httpd/conf/httpd.conf ...output omitted... ServerRoot "/etc/httpd" # # Listen: Allows you to bind Apache to specific IP addresses and/or # ports, instead of the default. See also the <VirtualHost> # directive. # # Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses. # 22 RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos #Listen 12.34.56.78:80 Listen 80 ...output omitted... [user@host ~]$ grep -i serverroot /etc/httpd/conf/httpd.conf # with "/", the value of ServerRoot is prepended -- so 'log/access_log' # with ServerRoot set to '/www' will be interpreted by the # ServerRoot: The top of the directory tree under which the server's # ServerRoot at a non-local disk, be sure to specify a local disk on the # same ServerRoot for multiple httpd daemons, you will need to change at ServerRoot "/etc/httpd" En los casos en que sabe lo que no está buscando, la opción -v es muy útil. La opción -v solo muestra las líneas que no coinciden con la expresión regular. En el siguiente ejemplo, se muestran todas las líneas, independientemente de las mayúsculas y las minúsculas, que no contienen la expresión regular server. [user@host ~]$ cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.25.254.254 classroom.example.com classroom 172.25.254.254 content.example.com content 172.25.254.254 materials.example.com materials 172.25.250.254 workstation.lab.example.com workstation ### rht-vm-hosts file listing the entries to be appended to /etc/hosts 172.25.250.10 172.25.250.11 172.25.250.254 servera.lab.example.com servera serverb.lab.example.com serverb workstation.lab.example.com workstation [user@host ~]$ grep -v -i server /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.25.254.254 classroom.example.com classroom 172.25.254.254 content.example.com content 172.25.254.254 materials.example.com materials 172.25.250.254 workstation.lab.example.com workstation ### rht-vm-hosts file listing the entries to be appended to /etc/hosts 172.25.250.254 workstation.lab.example.com workstation Para ver un archivo sin distraerse por las líneas de comentario, use la opción -v. En el siguiente ejemplo, la expresión regular busca todas las líneas que comiencen con un # o ; (caracteres típicos que indican que la línea será interpretada como un comentario). Esas líneas se omiten en la salida. [user@host ~]$ cat /etc/ethertypes # # Ethernet frame types # This file describes some of the various Ethernet # protocol types that are used on Ethernet networks. RH134-RHEL8.2-es-1-20200928 23 capítulo 1 | Mejora de la productividad con la línea de comandos # # This list could be found on: # http://www.iana.org/assignments/ethernet-numbers # http://www.iana.org/assignments/ieee-802-numbers # # <name> <hexnumber> <alias1>...<alias35> #Comment # IPv4 0800 ip ip4 # Internet IP (IPv4) X25 0805 ARP 0806 ether-arp # FR_ARP 0808 # Frame Relay ARP [RFC1701] ...output omitted... [user@host ~]$ grep -v '^[#;]' /etc/ethertypes IPv4 0800 ip ip4 # Internet IP (IPv4) X25 0805 ARP 0806 ether-arp # FR_ARP 0808 # Frame Relay ARP [RFC1701] El comando grep con la opción -e le permite buscar más de una expresión regular a la vez. En el siguiente ejemplo, usando una combinación de less y grep, se localizan todas las apariciones de pam_unix, user root y Accepted publickey en el archivo de registro /var/log/secure. [root@host ~]# cat /var/log/secure | grep -e 'pam_unix' \ -e 'user root' -e 'Accepted publickey' | less Mar 19 08:04:46 host sshd[6141]: pam_unix(sshd:session): session opened for user root by (uid=0) Mar 19 08:04:50 host sshd[6144]: Disconnected from user root 172.25.250.254 port 41170 Mar 19 08:04:50 host sshd[6141]: pam_unix(sshd:session): session closed for user root Mar 19 08:04:53 host sshd[6168]: Accepted publickey for student from 172.25.250.254 port 41172 ssh2: RSA SHA256:M8ikhcEDm2tQ95Z0o7ZvufqEixCFCt +wowZLNzNlBT0 Para buscar texto en un archivo abierto usando vim o less, use el carácter de barra (/) y escriba el patrón que desea encontrar. Presione Intro para iniciar la búsqueda. Presione N para encontrar la siguiente coincidencia. [root@host ~]# vim /var/log/boot.log ...output omitted... [^[[0;32m OK ^[[0m] Reached target Initrd Default Target.^M Starting dracut pre-pivot and cleanup hook...^M [^[[0;32m OK ^[[0m] Started dracut pre-pivot and cleanup hook.^M Starting Cleaning Up and Shutting Down Daemons...^M Starting Plymouth switch root service...^M Starting Setup Virtual Console...^M [^[[0;32m OK ^[[0m] Stopped target Timers.^M [^[[0;32m OK ^[[0m] Stopped dracut pre-pivot and cleanup hook.^M [^[[0;32m OK ^[[0m] Stopped target Initrd Default Target.^M /Daemons 24 RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos [root@host ~]# less /var/log/messages ...output omitted... Feb 26 15:51:07 host NetworkManager[689]: <info> [1551214267.8584] Loaded device plugin: NMTeamFactory (/usr/lib64/NetworkManager/1.14.0-14.el8/libnm-deviceplugin-team.so) Feb 26 15:51:07 host NetworkManager[689]: <info> [1551214267.8599] device (lo): carrier: link connected Feb 26 15:51:07 host NetworkManager[689]: <info> [1551214267.8600] manager: (lo): new Generic device (/org/freedesktop/NetworkManager/Devices/1) Feb 26 15:51:07 host NetworkManager[689]: <info> [1551214267.8623] manager: (ens3): new Ethernet device (/org/freedesktop/NetworkManager/Devices/2) Feb 26 15:51:07 host NetworkManager[689]: <info> [1551214267.8653] device (ens3): state change: unmanaged -> unavailable (reason 'managed', sys-iface-state: 'external') /device Referencias Páginas del manual regex(7) y grep(1) RH134-RHEL8.2-es-1-20200928 25 capítulo 1 | Mejora de la productividad con la línea de comandos Ejercicio Guiado Texto coincidente en la salida de comando con expresiones regulares En este trabajo de laboratorio, buscará texto en los registros del sistema y la salida de comandos para encontrar información de manera más eficiente. Resultados Debe ser capaz de buscar de manera eficiente el texto en los archivos de registro y los archivos de configuración. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab console-regex start. Este comando ejecuta un script de inicio que determina si la máquina servera es accesible en la red. También instala el paquete postfix. [student@workstation ~]$ lab console-regex start 1. Use el comando ssh para iniciar sesión en servera como el usuario student. Los sistemas se configuran para que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Use el comando sudo -i para cambiar al usuario root. La contraseña del usuario student es student. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 3. El paquete postfix fue instalado hoy por el script start. Use el comando grep para encontrar el GID y el UID para los grupos y usuarios postfix y postdrop. Para reducir la salida del comando grep, visualice todos los registros de una determinada hora de inicio. 3.1. Use el comando date para determinar la hora actual. [root@servera ~]# date Fri Mar 22 08:23:56 CET 2019 26 RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos 3.2. Use el comando grep con las opciones de fecha, hora de inicio y GID para buscar el GID y el UID del usuario postfix y postdrop. El script de configuración del trabajo de laboratorio se ejecutó unos minutos antes de la hora actual. Tenga esto en cuenta cuando busque el archivo de registro /var/log/secure. [root@servera ~]# grep '^Mar 22 08:2.*GID' /var/log/secure Mar 22 08:20:04 servera groupadd[2514]: group added to /etc/group: name=postdrop, GID=90 Mar 22 08:20:04 servera groupadd[2514]: new group: name=postdrop, GID=90 Mar 22 08:20:04 servera groupadd[2520]: group added to /etc/group: name=postfix, GID=89 Mar 22 08:20:04 servera groupadd[2520]: new group: name=postfix, GID=89 Mar 22 08:20:04 servera useradd[2527]: new user: name=postfix, UID=89, GID=89, home=/var/spool/postfix, shell=/sbin/nologin 4. Modifique su expresión regular para localizar los primeros dos mensajes en el archivo / var/log/maillog. Observe que en esta búsqueda no está usando el carácter de acento circunflejo (^) porque no está buscando el primer carácter en una línea. [root@servera ~]# grep 'postfix' /var/log/maillog | head -n 2 Mar 22 08:21:02 servera postfix/postfix-script[3879]: starting the Postfix mail system Mar 22 08:21:02 servera postfix/master[3881]: daemon started -- version 3.3.1, configuration /etc/postfix 5. Debe encontrar el nombre del directorio queue para el servidor Postfix. Busque el archivo de configuración /etc/postfix/main.cf para obtener toda la información sobre colas. Use la opción -i para ignorar distinciones entre mayúsculas y minúsculas. [root@servera ~]# grep -i 'queue' /etc/postfix/main.cf # testing. When soft_bounce is enabled, mail will remain queued that # The queue_directory specifies the location of the Postfix queue. queue_directory = /var/spool/postfix # QUEUE AND PROCESS OWNERSHIP # The mail_owner parameter specifies the owner of the Postfix queue # is the Sendmail-compatible mail queue listing command. # setgid_group: The group for mail submission and queue management 6. Confirme que postfix está escribiendo mensajes a /var/log/messages. Use el comando less y, luego, el carácter de barra (/) para buscar el archivo. Presione n para pasar a la siguiente entrada que coincida con la búsqueda. Use la tecla q para salir del comando less. [root@servera ~]# less /var/log/messages ...output omitted... Mar 22 07:58:04 servera systemd[1]: Started Postfix Mail Transport Agent. ...output omitted... Mar 22 08:12:26 servera systemd[1]: Stopping Postfix Mail Transport Agent... Mar 22 08:12:26 servera systemd[1]: Stopped Postfix Mail Transport Agent. ...output omitted... /Postfix RH134-RHEL8.2-es-1-20200928 27 capítulo 1 | Mejora de la productividad con la línea de comandos 7. Use el comando ps aux para confirmar que el servidor postfix se está ejecutando actualmente. Reduzca la salida de ps aux combinándola con el comando grep. [root@servera ~]# ps aux | grep postfix root 3881 0.0 0.2 121664 5364 ? libexec/postfix/master -w postfix 3882 0.0 0.4 147284 9088 ? -u postfix 3883 0.0 0.4 147336 9124 ? u Ss 08:21 0:00 /usr/ S 08:21 0:00 pickup -l -t unix S 08:21 0:00 qmgr -l -t unix - 8. Confirme que las colas qmgr, cleanup y pickup estén configuradas correctamente. Use el comando grep con la opción -e para hacer coincidir múltiples entradas en el mismo archivo. El archivo de configuración es /etc/postfix/master.cf. [root@servera ~]# grep -e qmgr -e pickup -e cleanup /etc/postfix/master.cf pickup unix n n 60 1 pickup cleanup unix n n 0 cleanup qmgr unix n n 300 1 qmgr #qmgr unix n n 300 1 oqmgr 9. Cierre sesión en servera. [root@servera ~]# exit logout [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute el script lab console-regex finish para terminar este ejercicio. [student@workstation ~]$ lab console-regex finish Esto concluye el ejercicio guiado. 28 RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos Trabajo de laboratorio Mejora de la productividad con la línea de comandos Lista de verificación de rendimiento En este trabajo de laboratorio, creará un script de Bash que puede filtrar y obtener información relevante de diferentes hosts. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear un script Bash y redirigir su salida a un archivo • Usar bucles para simplificar su código • Filtrar el contenido relevante usando grep y expresiones regulares Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab console-review start. Este comando ejecuta un script de inicio que determina si las máquinas workstation, servera y serverb son accesibles en la red. El script le avisará si no están disponibles. También instala los paquetes vim-enhanced y util-linux si es necesario, configura sudo y prepara el contenido de /var/log/secure en servera y serverb. [student@workstation ~]$ lab console-review start 1. Cree el archivo de script /home/student/bin/bash-lab en workstation. 2. Edite su archivo de script recién creado para cumplir con la siguiente información solicitada de los hosts servera y serverb. Los sistemas se configuran para que usen claves SSH para la autenticación; no se necesita una contraseña. RH134-RHEL8.2-es-1-20200928 29 capítulo 1 | Mejora de la productividad con la línea de comandos Comando o archivo Contenido solicitado hostname -f Obtenga toda la salida. echo "#####" Obtenga toda la salida. lscpu Obtenga solo las líneas que comienzan con la cadena UPC. echo "#####" Obtenga toda la salida. /etc/selinux/config Ignore las líneas vacías. Ignore las líneas que comienzan con #. echo "#####" Obtenga toda la salida. /var/log/secure Obtenga todas las entradas de "Failed password". echo "#####" Obtenga toda la salida. Guarde la información requerida en los nuevos archivos /home/student/outputservera y /home/student/output-serverb. nota Puede usar sudo sin requerir una contraseña en los hosts servera y serverb. Recuerde usar un bucle para simplificar su script. También puede usar múltiples comandos grep concatenados con el uso del carácter pipe (|). Ejecute el script /home/student/bin/bash-lab y revise el contenido de la salida en workstation. 3. Evaluación En workstation, ejecute el comando lab console-review grade para confirmar que ha realizado correctamente este ejercicio. [student@workstation ~]$ lab console-review grade Finalizar En workstation, ejecute el script lab console-review finish para terminar este ejercicio. [student@workstation ~]$ lab console-review finish Esto concluye el trabajo de laboratorio. 30 RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos Solución Mejora de la productividad con la línea de comandos Lista de verificación de rendimiento En este trabajo de laboratorio, creará un script de Bash que puede filtrar y obtener información relevante de diferentes hosts. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear un script Bash y redirigir su salida a un archivo • Usar bucles para simplificar su código • Filtrar el contenido relevante usando grep y expresiones regulares Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab console-review start. Este comando ejecuta un script de inicio que determina si las máquinas workstation, servera y serverb son accesibles en la red. El script le avisará si no están disponibles. También instala los paquetes vim-enhanced y util-linux si es necesario, configura sudo y prepara el contenido de /var/log/secure en servera y serverb. [student@workstation ~]$ lab console-review start 1. Cree el archivo de script /home/student/bin/bash-lab en workstation. 1.1. En workstation, cree la carpeta /home/student/bin/ si es necesario. [student@workstation ~]$ mkdir -p /home/student/bin 1.2. Use vim para crear y editar el archivo de script /home/student/bin/bash-lab. [student@workstation ~]$ 1.3. vim ~/bin/bash-lab Inserte el siguiente texto y guarde el archivo. #!/bin/bash 1.4. Haga el archivo de script sea ejecutable. [student@workstation ~]$ chmod a+x ~/bin/bash-lab RH134-RHEL8.2-es-1-20200928 31 capítulo 1 | Mejora de la productividad con la línea de comandos 2. Edite su archivo de script recién creado para cumplir con la siguiente información solicitada de los hosts servera y serverb. Los sistemas se configuran para que usen claves SSH para la autenticación; no se necesita una contraseña. Comando o archivo Contenido solicitado hostname -f Obtenga toda la salida. echo "#####" Obtenga toda la salida. lscpu Obtenga solo las líneas que comienzan con la cadena UPC. echo "#####" Obtenga toda la salida. /etc/selinux/config Ignore las líneas vacías. Ignore las líneas que comienzan con #. echo "#####" Obtenga toda la salida. /var/log/secure Obtenga todas las entradas de "Failed password". echo "#####" Obtenga toda la salida. Guarde la información requerida en los nuevos archivos /home/student/outputservera y /home/student/output-serverb. nota Puede usar sudo sin requerir una contraseña en los hosts servera y serverb. Recuerde usar un bucle para simplificar su script. También puede usar múltiples comandos grep concatenados con el uso del carácter pipe (|). Use vim para abrir y editar el archivo de script /home/student/bin/bash-lab. 2.1. [student@workstation ~]$ vim ~/bin/bash-lab 2.2. Agregue las siguientes líneas en negrita al archivo del script /home/student/bin/ bash-lab. nota El siguiente es un ejemplo de cómo puede lograr el script solicitado. En scripting de Bash, puede adoptar diferentes enfoques y obtener el mismo resultado. 32 RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos #!/bin/bash # USR='student' OUT='/home/student/output' # for SRV in servera serverb do ssh ${USR}@${SRV} "hostname -f" > ${OUT}-${SRV} echo "#####" >> ${OUT}-${SRV} ssh ${USR}@${SRV} "lscpu | grep '^CPU'" >> ${OUT}-${SRV} echo "#####" >> ${OUT}-${SRV} ssh ${USR}@${SRV} "grep -v '^$' /etc/selinux/config|grep -v '^#'" >> ${OUT}-${SRV} echo "#####" >> ${OUT}-${SRV} ssh ${USR}@${SRV} "sudo grep 'Failed password' /var/log/secure" >> ${OUT}-${SRV} echo "#####" >> ${OUT}-${SRV} done 3. Ejecute el script /home/student/bin/bash-lab y revise el contenido de la salida en workstation. 3.1. En workstation, ejecute el script /home/student/bin/bash-lab. [student@workstation ~]$ bash-lab 3.2. Revise el contenido de /home/student/output-servera y /home/student/ output-serverb. [student@workstation ~]$ cat /home/student/output-servera servera.lab.example.com ##### CPU op-mode(s): 32-bit, 64-bit CPU(s): 2 CPU family: 21 CPU MHz: 2294.670 ##### SELINUX=enforcing SELINUXTYPE=targeted ##### Mar 21 22:30:28 servera sshd[3939]: Failed password for invalid user operator1 from 172.25.250.9 port 58382 ssh2 Mar 21 22:30:31 servera sshd[3951]: Failed password for invalid user sysadmin1 from 172.25.250.9 port 58384 ssh2 Mar 21 22:30:34 servera sshd[3953]: Failed password for invalid user manager1 from 172.25.250.9 port 58386 ssh2 ##### [student@workstation ~]$ cat /home/student/output-serverb serverb.lab.example.com ##### CPU op-mode(s): 32-bit, 64-bit CPU(s): 2 RH134-RHEL8.2-es-1-20200928 33 capítulo 1 | Mejora de la productividad con la línea de comandos CPU family: 6 CPU MHz: 2294.664 ##### SELINUX=enforcing SELINUXTYPE=targeted ##### Mar 21 22:30:37 serverb sshd[3883]: Failed password for invalid user operator1 from 172.25.250.9 port 39008 ssh2 Mar 21 22:30:39 serverb sshd[3891]: Failed password for invalid user sysadmin1 from 172.25.250.9 port 39010 ssh2 Mar 21 22:30:43 serverb sshd[3893]: Failed password for invalid user manager1 from 172.25.250.9 port 39012 ssh2 ##### Evaluación En workstation, ejecute el comando lab console-review grade para confirmar que ha realizado correctamente este ejercicio. [student@workstation ~]$ lab console-review grade Finalizar En workstation, ejecute el script lab console-review finish para terminar este ejercicio. [student@workstation ~]$ lab console-review finish Esto concluye el trabajo de laboratorio. 34 RH134-RHEL8.2-es-1-20200928 capítulo 1 | Mejora de la productividad con la línea de comandos Resumen En este capítulo, aprendió lo siguiente: • Cómo crear y ejecutar scripts de Bash simples • Cómo usar un bucle para iterar a través de una lista de ítems de la línea de comandos y en un script de shell • Cómo buscar texto en los archivos de registro y configuración usando expresiones regulares y grep RH134-RHEL8.2-es-1-20200928 35 36 RH134-RHEL8.2-es-1-20200928 capítulo 2 Programación de tareas futuras Meta Programar tareas para que se ejecuten automáticamente en el futuro Objetivos • Configurar un comando que se ejecute una vez en algún momento en el futuro • Programar comandos para que se ejecuten en un horario de repetición usando el archivo crontab de un usuario • Programar comandos para que se ejecuten en un horario de repetición usando el archivo crontab del sistema y directorios • Habilitar y deshabilitar los temporizadores de systemd y configurar un temporizador que administre archivos temporales • Programación de un trabajo de usuario diferido (y ejercicio guiado) • Programación de trabajos de usuario recurrentes (y ejercicio guiado) • Programación de trabajos del sistema recurrentes (y ejercicio guiado) • Administración de archivos temporales (y ejercicio guiado) Secciones Trabajo de laboratorio RH134-RHEL8.2-es-1-20200928 Programación de tareas futuras 37 capítulo 2 | Programación de tareas futuras Programación de un trabajo de usuario diferido Objetivos Después de completar esta sección, debe ser capaz de configurar un comando que se ejecute una vez en algún momento en el futuro. Descripción de tareas de usuario diferidas A veces es posible que necesite ejecutar un comando, o un conjunto de comandos, en un punto fijo en el futuro. Entre los ejemplos, se incluyen personas que desean programar un correo electrónico para su jefe, o un administrador de sistemas que está trabajando en una configuración de firewall que pone un trabajo de “seguridad” en vigencia para restablecer la configuración de firewall en un tiempo de diez minutos, a menos que desactive el trabajo antes. Estos comandos programados son a menudo se denominan tareas o trabajos y el termino diferido indica que estas tareas o trabajos se ejecutarán en el futuro. Una de las soluciones disponibles para los usuarios de Red Hat Enterprise Linux para la programación de tareas diferidas es at. El paquete at proporciona el daemon del sistema (atd) junto con un conjunto de herramientas de línea de comandos para interactuar con el daemon (at, atq y más). En una instalación Red Hat Enterprise Linux predeterminada, el daemon atd se instala y se habilita automáticamente. Los usuarios (incluido root) pueden poner en cola trabajos para el daemon atd con el comando at. El daemon atd proporciona 26 colas, de la a a la z, con trabajos en colas ordenadas alfabéticamente que obtienen menos prioridad en el sistema (los valores buenos más altos, se analizan en un capítulo posterior). Programación de tareas de usuario diferidas Use el comando at TIMESPEC para programar un nuevo trabajo. A continuación, el comando at lee los comandos para ejecutar desde el canal stdin. Cuando ingresa comandos manualmente, puede terminar su entrada presionando Ctrl+D. Para comandos más complejos que son propensos a errores tipográficos, a menudo es más fácil usar la redirección de entrada desde un archivo de script, por ejemplo, at now +5min < myscript, en lugar de escribir todos los comandos manualmente en una ventana de terminal. El argumento TIMESPEC con el comando at acepta muchas combinaciones poderosas, lo que permite a los usuarios describir exactamente cuándo se debe ejecutar un trabajo. Típicamente, comienzan con una hora, p. ej., 02:00 p. m., 15:59 o incluso teatime (hora del té), seguida de una fecha opcional o una cantidad de días en el futuro. A continuación, se detalla una lista con algunos ejemplos de combinaciones que se pueden usar. • now +5min (ahora + 5 min) • teatime tomorrow (hora del té mañana) (la hora del té es 16:00) • noon +4 days (mediodía + 4 días) • 5pm august 3 2021 (3 de agosto de 2021 a las 5:00 p. m.) 38 RH134-RHEL8.2-es-1-20200928 capítulo 2 | Programación de tareas futuras Para obtener una lista completa de las especificaciones de tiempo válidas, consulte la definición timespec como se indica en las referencias. Inspección y administración de trabajos de usuario diferidos Para obtener una descripción general de los trabajos pendientes de su usuario, use el comando atq o los comandos at -l. [user@host ~]$ atq 28 Mon Feb 2 05:13:00 2015 a 29 Mon Feb 3 16:00:00 2014 h user 27 Tue Feb 4 12:00:00 2014 a user user En la salida anterior, cada línea representa un trabajo diferente programado para ejecutarse en el futuro. El número de trabajo único para este trabajo. La fecha y hora de ejecución del trabajo programado. Indica que el trabajo está programado con la cola predeterminada a. Se pueden programar diferentes trabajos con diferentes colas. El propietario del trabajo (y el usuario con el cual se ejecutará el trabajo). Importante Los usuarios no privilegiados solo pueden ver y controlar sus propios trabajos. El usuario root puede ver y administrar todos los trabajos. Para inspeccionar los comandos reales que se ejecutarán cuando se ejecute un trabajo, use el comando at -c JOBNUMBER. Este comando muestra el entorno para el trabajo que se configura para reflejar el entorno del usuario quien creó el trabajo en el momento en que se creó, seguido de los comandos reales que se ejecutarán. Eliminación de trabajos El comando atrm JOBNUMBER elimina un trabajo programado. Elimine el trabajo programado cuando ya no es necesario; por ejemplo, cuando una configuración de firewall remota dio un resultado satisfactorio, y no es necesario que se restablezca. Referencias Páginas del manual: at(1) y atd(8) /usr/share/doc/at/timespec RH134-RHEL8.2-es-1-20200928 39 capítulo 2 | Programación de tareas futuras Ejercicio Guiado Programación de un trabajo de usuario diferido En este ejercicio, usara el comando at para programar varios comandos para ejecutar en momentos específicos en el futuro. Resultados Usted deberá ser capaz de realizar lo siguiente: • Programar un trabajo para que se ejecute en un momento específico en el futuro • Inspeccionar los comandos que ejecuta un trabajo programado • Eliminar los trabajos programados Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute lab scheduling-at start para comenzar el ejercicio. Este script asegura que el entorno esté limpio y configurado correctamente. [student@workstation ~]$ lab scheduling-at start 1. Desde workstation, abra una sesión de SSH en servera como student. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Programe un trabajo para ejecutar en tres minutos a partir de ahora usando el comando at. El trabajo debe guardar la salida del comando date en /home/student/myjob.txt. 2.1. Use el comando echo para pasar la cadena fecha >>/home/student/ myjob.txt como entrada al comando at para que el trabajo se ejecute en tres minutos a partir de ahora. [student@servera ~]$ echo "date >> /home/student/myjob.txt" | at now +3min warning: commands will be executed using /bin/sh job 1 at Thu Mar 21 12:30:00 2019 2.2. Use el comando atq para enumerar los trabajos programados. [student@servera ~]$ atq 1 Thu Mar 21 12:30:00 2019 a student 40 RH134-RHEL8.2-es-1-20200928 capítulo 2 | Programación de tareas futuras 2.3. Use el comando watch atq para monitorear la cola de los trabajos diferidos en tiempo real. El trabajo se elimina de la cola después de su ejecución. [student@servera ~]$ watch atq Every 2.0s: atq servera.lab.example.com: Thu Mar 21 12:30:00 2019 1 Thu Mar 21 12:30:00 2019 a student De manera predeterminada, el comando watch precedente actualiza la salida de atq cada dos segundos. Después de que el trabajo aplazado se elimine de la cola, presione Ctrl+c para salir de watch y volver al prompt de shell. 2.4. Use el comando cat para verificar que el contenido de /home/student/ myjob.txt coincida con la salida del comando date. [student@servera ~]$ cat myjob.txt Thu Mar 21 12:30:00 IST 2019 La salida anterior coincide con la salida del comando date, confirmando que el trabajo programado se ejecutó con éxito. 3. Use el comando at para programar interactivamente un trabajo con la cola g que se ejecuta en teatime (16:00). El trabajo debe ejecutar un comando que imprima el mensaje It's teatime (Es la hora del té) en /home/student/tea.txt. Los nuevos mensajes deben adjuntarse al archivo /home/student/tea.txt. [student@servera ~]$ at -q g teatime warning: commands will be executed using /bin/sh at> echo "It's teatime" >> /home/student/tea.txt at> Ctrl+d job 2 at Thu Mar 21 16:00:00 2019 4. Use el comando at para programar interactivamente otro trabajo con la cola b que se ejecuta en 16:05. El trabajo debe ejecutar un comando que imprima el mensaje The cookies are good (Las galletas están bien) en /home/student/cookies.txt. Los nuevos mensajes deben adjuntarse al archivo /home/student/cookies.txt. [student@servera ~]$ at -q b 16:05 warning: commands will be executed using /bin/sh at> echo "The cookies are good" >> /home/student/cookies.txt at> Ctrl+d job 3 at Thu Mar 21 16:05:00 2019 5. Inspeccione los comandos en los trabajos pendientes. 5.1. Use el comando atq para ver los números de trabajo de los trabajos pendientes. [student@servera ~]$ atq 2 Thu Mar 21 16:00:00 2019 g student 3 Thu Mar 21 16:05:00 2019 b student Tenga en cuenta los números de trabajo de la salida anterior. Estos números de trabajo pueden variar en su sistema. RH134-RHEL8.2-es-1-20200928 41 capítulo 2 | Programación de tareas futuras 5.2. Use el comando at para ver los números de trabajo del trabajo pendiente número 2. [student@servera ~]$ at -c 2 ...output omitted... echo "It's teatime" >> /home/student/tea.txt marcinDELIMITER28d54caa Observe que el trabajo programado anterior ejecuta un comando echo que agrega el mensaje It's teatime (Es la hora del té) a /home/student/tea.txt. 5.3. Use el comando at para ver los comandos del trabajo pendiente número 3. [student@servera ~]$ at -c 3 ...output omitted... echo "The cookies are good" >> /home/student/cookies.txt marcinDELIMITER1d2b47e9 Observe que el trabajo programado anterior ejecuta un comando echo que agrega el mensaje The cookies are good (Las galletas están bien) a /home/student/ cookies.txt. 6. Use el comando atq para ver el número de trabajo de un trabajo que se ejecuta en teatime(16:00) y quítelo usando el comando atrm. [student@servera ~]$ atq 2 Thu Mar 21 16:00:00 2019 g student 3 Thu Mar 21 16:05:00 2019 b student [student@servera ~]$ atrm 2 7. Verifique que el trabajo programado para ejecutarse en teatime (16:00) ya no exista. 7.1. Use el comando atq para ver la lista de trabajos pendientes y confirmar que el trabajo programado para ejecutarse en teatime (16:00) ya no existe. [student@servera ~]$ atq 3 Thu Mar 21 16:05:00 2019 b student 7.2. Cierre sesión en servera. [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute lab scheduling-at finish para terminar este ejercicio. Este script elimina los archivos creados durante el ejercicio para garantizar que el entorno quede limpio. [student@workstation ~]$ lab scheduling-at finish Esto concluye el ejercicio guiado. 42 RH134-RHEL8.2-es-1-20200928 capítulo 2 | Programación de tareas futuras Programación de trabajos de usuario recurrentes Objetivos Después de finalizar esta sesión, debe programar comandos para que se ejecuten en un horario de repetición usando el archivo crontab de un usuario. Descripción de trabajos de usuario recurrentes Los trabajos programados para ejecutarse repetidamente se llaman trabajos recurrentes. Los sistemas Red Hat Enterprise Linux se envían con el daemon crond, proporcionado por el paquete cronie, habilitado e iniciado de forma predeterminada específicamente para trabajos recurrentes. El daemon crond lee múltiples archivos de configuración: uno por usuario (editado con el comando crontab) y un conjunto de archivos en todo el sistema. Estos archivos de configuración les dan a los usuarios y administradores el control detallado cuando sus trabajos recurrentes deben ser ejecutados. Si un comando programado no produce ninguna salida o un error de que no está redirigido, el daemon crond intenta enviar por correo electrónico esa salida al usuario que es propietario de ese trabajo (a menos que se haya anulado) usando el servidor de correo configurado en el sistema. Según el entorno, es posible que sea necesaria una configuración adicional. La salida o el error del comando programado se puede redirigir a diferentes archivos. Programación de trabajos de usuario recurrentes Los usuarios normales pueden usar el comando crontab para administrar sus trabajos. Este comando se puede denominar de cuatro maneras diferentes: Ejemplos de crontab Comando Uso previsto crontab -l Detallar los trabajos para el usuario actual. crontab -r Eliminar todos los trabajos del usuario actual. crontab -e Editar trabajos para el usuario actual. crontab filename Eliminar todos los trabajos y reemplazar con los trabajos leídos de nombre de archivo. Si no se especifica ningún archivo, se usa stdin. nota El superusuario puede usar la opción -u con el comando crontab para administrar trabajos para otro usuario. No debe usar el comando crontab para administrar trabajos del sistema; en cambio, use los métodos descritos en la siguiente sección. RH134-RHEL8.2-es-1-20200928 43 capítulo 2 | Programación de tareas futuras Descripción del formato de trabajo del usuario El comando crontab -e invoca a Vim de manera predeterminada, a menos que la variable de entorno EDITOR se haya establecido en otro ajuste. Ingrese un trabajo por línea. Otras entradas válidas incluyen: líneas vacías, generalmente para facilitar la lectura; comentarios, identificados por líneas que comienzan con el signo de número (#); y variables de entorno usando el formato NAME=value, que afecta a todas las líneas debajo de la línea donde se declaran. Los ajustes de variables comunes incluyen la variable SHELL, que declara qué shell usar para interpretar las líneas restantes del archivo crontab; y la variable MAILTO, que determina quién debe recibir la salida enviada por correo electrónico. Importante Enviar un correo electrónico puede requerir la configuración adicional del servidor de correo local o la retransmisión SMTP en un sistema. Los campos en el archivo crontab aparecen en el siguiente orden: • Minutes (Minutos) • Hours (Horas) • Day of month (Día del mes) • Month (Mes) • Day of week (Día de la semana) • Command (Comando) Importante Cuando los campos Day of month (Día del mes) y Day of week (Día de la semana) son ambos distintos de *, el comando se ejecuta cuando se cumple cualquiera de estos dos campos. Por ejemplo, para ejecutar un comando el 15 de cada mes, y todos los viernes a las 12:15, use el siguiente formato de trabajo: 15 12 15 * Fri command Los primeros cinco campos usan las mismas reglas de sintaxis: • * para “No importa”/siempre. • Un número para especificar una cantidad de minutos u horas, una fecha o un día de la semana. Para los días de semana, 0 equivale a domingo, 1 equivale a lunes, 2 equivale a martes, etc. 7 también equivale a domingo. • x-y para un rango, x hasta y inclusive. • x,y para listas. Las listas también pueden incluir rangos, por ejemplo, 5,10-13,17 en la columna Minutes (Minutos) para indicar que un trabajo debe ejecutarse a los 5 minutos, a los 10 minutos, a los 11 minutos, a los 12 minutos, a los 13 minutos y a los 17 minutos de la hora. • */x para indicar un intervalo de x, por ejemplo, */7 en la columna Minutes (Minutos) ejecuta un trabajo exactamente cada siete minutos. 44 RH134-RHEL8.2-es-1-20200928 capítulo 2 | Programación de tareas futuras Asimismo, se pueden usar abreviaturas en inglés de tres letras para los meses y los días de la semana, por ejemplo, Jan (enero), Feb (febrero) y Mon (lunes), Tue (martes). El último campo contiene el comando que se ejecutará usando la shell predeterminada. La variable del entorno SHELL se puede usar para cambiar la shell para el comando programado. Si el comando contiene un símbolo de porcentaje no codificado (%), ese símbolo de porcentaje se tratará como el carácter de una línea nueva, y todo lo que esté después del símbolo de porcentaje se enviará al comando en stdin. Ejemplos de trabajos de usuario recurrentes En esta sección, se describen algunos ejemplos de trabajos recurrentes. • El siguiente trabajo ejecuta el comando /usr/local/bin/yearly_backup exactamente a las 9:00 a. m. el 2 de febrero, todos los años. 0 9 2 2 * /usr/local/bin/yearly_backup • El siguiente trabajo envía un correo electrónico que contiene la palabra Chime al propietario de este trabajo, cada cinco minutos entre las 9:00 a. m. y las 5:00 p. m., todos los viernes de julio. */5 9-16 * Jul 5 echo "Chime" El rango de horas precedente 9-16 significa que el temporizador de trabajo comienza a la hora novena (09:00) y continúa hasta el final de la decimosexta hora (16:59). El trabajo comienza a ejecutarse a las 09:00 con la última ejecución a las 16:55 porque a cinco minutos de las 16:55 es 17:00 que está más allá del alcance de las horas dadas. • El siguiente trabajo ejecuta el comando /usr/local/bin/daily_report todas las semanas dos minutos antes de la medianoche. 58 23 * * 1-5 /usr/local/bin/daily_report • El siguiente trabajo ejecuta el comando mutt para enviar el mensaje de correo Checking in al destinatario boss@example.com en cada día de trabajo (lunes a viernes), a las 9:00 a. m. 0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi there boss, just checking in. Referencias Páginas del manual: crond(8), crontab(1), crontab(5) RH134-RHEL8.2-es-1-20200928 45 capítulo 2 | Programación de tareas futuras Ejercicio Guiado Programación de trabajos de usuario recurrentes En este ejercicio, programará comandos para ejecutar en un programa de repetición como un usuario no privilegiado, usando el comando crontab. Resultados Usted deberá ser capaz de realizar lo siguiente: • Programar trabajos recurrentes para ejecutar como usuario no privilegiado • Inspeccionar los comandos que ejecuta un trabajo recurrente programado • Eliminar trabajos recurrentes programados Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute lab scheduling-cron start para comenzar el ejercicio. Este script asegura que el entorno esté limpio y configurado correctamente. [student@workstation ~]$ lab scheduling-cron start 1. Desde workstation, abra una sesión de SSH en servera como student. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Programar un trabajo recurrente como student que anexa la fecha y hora actual a /home/ student/my_first_cron_job.txt cada dos minutos entre 8:00 a. m. y 9:00 p. m. El trabajo solo debe ejecutarse de lunes a viernes, no los sábados ni los domingos. Importante Si está trabajando en este laboratorio fuera del día y la hora mencionados en la instrucción anterior, debe ajustar la hora o la fecha del sistema en consecuencia para que el trabajo se ejecute mientras está trabajando. 2.1. Use el comando crontab -e para abrir el crontab usando el editor de texto predeterminado. [student@servera ~]$ crontab -e 2.2. 46 Inserte la siguiente línea. RH134-RHEL8.2-es-1-20200928 capítulo 2 | Programación de tareas futuras */2 08-20 * * Mon-Fri /usr/bin/date >> /home/student/my_first_cron_job.txt 2.3. Mientras esté en el editor de texto, presione Esc y escriba :wq para guardar los cambios y salir del editor. Cuando el editor sale, debe ver la siguiente salida: ...output omitted... crontab: installing new crontab [student@servera ~]$ En la salida anterior, se confirma que el trabajo se programó correctamente. 3. Use el comando crontab -l para enumerar los trabajos recurrentes programados. Inspeccione el comando que programó para que se ejecute como un trabajo recurrente en el paso anterior. [student@servera ~]$ crontab -l */2 08-20 * * Mon-Fri /usr/bin/date >> /home/student/my_first_cron_job.txt Observe que el trabajo programado anterior ejecuta el comando /usr/bin/date y agrega su salida a /home/student/my_first_cron_job.txt. 4. Use el comando while para que su prompt de shell duerma hasta que se cree el archivo / home/student/my_first_cron_job.txt como resultado de la ejecución exitosa del trabajo recurrente que programó. Espere a que regrese su prompt de shell. [student@servera ~]$ while ! test -f my_first_cron_job.txt; do sleep 1s; done El comando anterior while usa ! test -f para continuar ejecutando un bucle de comandos sleep 1s hasta que se crea el archivo my_first_cron_job.txt en el directorio /home/student. 5. Use el comando cat para verificar que el contenido de /home/student/ my_first_cron_job.txt coincida con la salida del comando date. [student@servera ~]$ cat my_first_cron_job.txt Fri Mar 22 13:56:01 IST 2019 La salida anterior puede variar en su sistema. 6. Elimine todos los trabajos recurrentes programados para ejecutarse como student. 6.1. Use el comando crontab -r para eliminar todos los trabajos recurrentes programados para student. [student@servera ~]$ crontab -r 6.2. Use el comando crontab -l para verificar que no existen trabajos recurrentes para student. RH134-RHEL8.2-es-1-20200928 47 capítulo 2 | Programación de tareas futuras [student@servera ~]$ crontab -l no crontab for student 6.3. Cierre sesión en servera. [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute lab scheduling-cron finish para terminar este ejercicio. Este script elimina los archivos creados durante el ejercicio para garantizar que el entorno quede limpio. [student@workstation ~]$ lab scheduling-cron finish Esto concluye el ejercicio guiado. 48 RH134-RHEL8.2-es-1-20200928 capítulo 2 | Programación de tareas futuras Programación de trabajos del sistema recurrentes Objetivos Después de finalizar esta sesión, debe programar comandos para que se ejecuten en una programación de repetición usando el archivo crontab y directorios del sistema. Descripción de trabajos del sistema recurrentes Los administradores de sistemas a menudo necesitan ejecutar trabajos recurrentes. La mejor práctica es ejecutar estos trabajos desde cuentas del sistema en lugar de desde cuentas de usuario. Es decir, no programe para ejecutar estos trabajos usando el comando crontab, pero en su lugar usa archivos crontab en todo el sistema. Las entradas de trabajo en los archivos crontab en todo el sistema son similares a los de las entradas de crontab de los usuarios, excepto que los archivos crontab en todo el sistema tienen un campo adicional antes del campo de comando; el usuario bajo cuya autoridad debe ejecutarse el comando. El archivo /etc/crontab tiene un diagrama de sintaxis útil en los comentarios incluidos. # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue ... # | | | | | # * * * * * user-name command to be executed Los trabajos recurrentes del sistema se definen en dos ubicaciones: el archivo /etc/crontab y los archivos dentro del directorio /etc/cron.d/. Siempre debe crear sus archivos crontab personalizados bajo el directorio /etc/cron.d para programar trabajos recurrentes del sistema. Coloque el archivo crontab personalizado en /etc/cron.d para evitar que se sobrescriba si se produce alguna actualización del paquete al proveedor de /etc/crontab, que puede sobrescribir los contenidos existentes en /etc/crontab. Los paquetes que requieren trabajos recurrentes del sistema colocan sus archivos crontab en /etc/cron.d/ que contiene las entradas de trabajo. Los administradores también usan esta ubicación para agrupar trabajos relacionados en un solo archivo. El sistema crontab también incluye repositorios para scripts que necesitan ejecutarse cada hora, día, semana y mes. Estos repositorios son directorios llamados /etc/cron.hourly/, /etc/ cron.daily/, /etc/cron.weekly/ y /etc/cron.monthly/. Una vez más, estos directorios contienen scripts de shell ejecutables, no archivos crontab. RH134-RHEL8.2-es-1-20200928 49 capítulo 2 | Programación de tareas futuras Importante Recuerde hacer que todos los scripts que coloque en estos directorios sean ejecutables. Si un script no es ejecutable, no se ejecutará. Para hacer un script ejecutable, use el comando chmod +x script_name. Un comando llamado run-parts desde el archivo /etc/cron.d/0hourly ejecuta los scripts / etc/cron.hourly/*. El comando run-parts también ejecuta los trabajos diarios, semanales y mensuales también, pero desde un archivo de configuración diferente denominado /etc/ anacrontab. nota En el pasado, un servicio separado llamado anacron se usaba para manejar el archivo /etc/anacrontab, pero en Red Hat Enterprise Linux 7 y posterior, el servicio crond regular analiza este archivo. El propósito de /etc/anacrontab es garantizar que los trabajos importantes siempre se ejecuten, y que no se omitan accidentalmente porque el sistema se apagó o quedó inactivo cuando el trabajo debería haberse ejecutado. Por ejemplo, si un trabajo del sistema que se ejecuta diariamente no se ejecutó la última vez que venció debido a que el sistema se estaba reiniciando, el trabajo se ejecuta cuando el sistema está listo. Sin embargo, puede haber una demora de varios minutos para comenzar el trabajo según el valor del parámetro Delay in minutes especificado para el trabajo en /etc/anacrontab. Hay diferentes archivos en /var/spool/anacron/ para cada uno de los trabajos diarios, semanales y mensuales para determinar si un trabajo en particular se ha ejecutado. Cuando crond comienza un trabajo desde /etc/anacrontab, actualiza los sellos de hora de esos archivos. El mismo sello de hora se usa para determinar cuándo se ejecutó un trabajo por última vez. La sintaxis de /etc/anacrontab es diferente a la de los archivos de configuración de crontab regulares. Contiene exactamente cuatro campos por línea, como se detalla a continuación. • Period in days (Período en días) El intervalo en días para el trabajo que se ejecuta en una programación de repetición. Este campo acepta un entero o una macro como su valor. Por ejemplo, la macro @daily es equivalente al entero 1, lo que significa que el trabajo se ejecuta diariamente. De manera similar, la macro @weekly es equivalente al entero 7, lo que significa que el trabajo se ejecuta diariamente. • Delay in minutes (Demora en minutos) Cantidad de tiempo que el daemon crond debe esperar antes de iniciar este trabajo. • Job identifier (Identificador del trabajo) El nombre único con se identifica en los mensajes de registro. • Comando (Comando) El comando que se ejecutará. El archivo /etc/anacrontab también contiene declaraciones variables del entorno que usan la sintaxis NAME=value. De especial interés es la variable START_HOURS_RANGE, que especifica el intervalo de tiempo para que se ejecuten los trabajos. Los trabajos no se inician fuera de este 50 RH134-RHEL8.2-es-1-20200928 capítulo 2 | Programación de tareas futuras rango. Si en un día en particular, un trabajo no se ejecuta dentro de este intervalo de tiempo, el trabajo tiene que esperar hasta el día siguiente para su ejecución. Presentación del temporizador systemd Con el advenimiento de systemd en Red Hat Enterprise Linux 7, una nueva función de programación ya está disponible: unidades de temporizador systemd. Una unidad de temporizador systemd activa otra unidad de un tipo diferente (como un servicio) cuyo nombre de unidad coincide con el nombre de la unidad del temporizador. La unidad del temporizador permite la activación basada en el temporizador de otras unidades. Para facilitar la depuración, systemd registra los eventos del temporizador en los diarios (journals) del sistema. Unidad de temporizador de muestra El paquete sysstat proporciona una unidad de temporizador systemd llamada sysstatcollect.timer para recopilar estadísticas del sistema cada 10 minutos. En la siguiente salida, se muestran las líneas de configuración de /usr/lib/systemd/system/sysstatcollect.timer. ...output omitted... [Unit] Description=Run system activity accounting tool every 10 minutes [Timer] OnCalendar=*:00/10 [Install] WantedBy=sysstat.service El parámetro OnCalendar=*:00/10 significa que esta unidad de temporizador activa la unidad correspondiente (sysstat-collect.service) cada 10 minutos, Sin embargo, puede especificar intervalos de tiempo más complejos. Por ejemplo, un valor de 2019-03* 12:35,37,39:16 frente al parámetro OnCalendar hace que la unidad del temporizador active la unidad de servicio correspondiente en 12:35:16, 12:37:16 y 12:39:16 todos los días durante todo el mes de marzo de 2019. También puede especificar temporizadores relativos usando parámetros tal como OnUnitActiveSec. Por ejemplo, la opción OnUnitActiveSec=15min hace que la unidad del temporizador desencadena la unidad correspondiente 15 minutos después de la última vez que la unidad del temporizador activó su unidad correspondiente. Importante No modifique ningún archivo de configuración de la unidad bajo el directorio /usr/ lib/systemd/system porque cualquier actualización al paquete del proveedor del archivo de configuración puede anular los cambios de configuración que realizó en ese archivo. Por lo tanto, haga una copia del archivo de configuración de la unidad que desea cambiar bajo el directorio /etc/systemd/system y, luego, modifique la copia para que los cambios de configuración que realice con respecto a una unidad no se anulen con ninguna actualización del paquete del proveedor. Si existen dos archivos con el mismo nombre bajo los directorios /usr/lib/ systemd/system y /etc/systemd/system, systemd analiza el archivo bajo el directorio /etc/systemd/system. RH134-RHEL8.2-es-1-20200928 51 capítulo 2 | Programación de tareas futuras Después de cambiar el archivo de configuración de la unidad del temporizador, use el comando systemctl daemon-reload para asegurar que systemd tenga conocimiento de los cambios. Este comando recarga la configuración del administrador de systemd. [root@host ~]# systemctl daemon-reload Después de recargar la configuración del administrador systemd, use el siguiente comando systemctl para activar la unidad del temporizador. [root@host ~]# systemctl enable --now <unitname>.timer Referencias Páginas del manual crontab(5),anacron(8),anacrontab(5), systemd.time(7), systemd.timer(5) y crond(8) 52 RH134-RHEL8.2-es-1-20200928 capítulo 2 | Programación de tareas futuras Ejercicio Guiado Programación de trabajos del sistema recurrentes En este ejercicio, programará comandos para que se ejecuten en varios horarios agregando archivos de configuración a los directorios crontab del sistema. Resultados Usted deberá ser capaz de realizar lo siguiente: • Programar un trabajo del sistema recurrente para contar el número de usuarios activos • Actualizar la unidad de temporizador systemd que recopila los datos de actividad del sistema. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute lab scheduling-system start para comenzar el ejercicio. Este script asegura que el entorno esté limpio y configurado correctamente. [student@workstation ~]$ lab scheduling-system start 1. Desde workstation, abra una sesión de SSH en servera como student. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Use el comando sudo -i para cambiar a la cuenta del usuario root. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 3. Programe un trabajo del sistema recurrente que genere un mensaje de registro que indique la cantidad de usuarios activos actualmente en el sistema. El trabajo debe ejecutarse diariamente. Puede usar el comando w -h | wc -l para recuperar el número de usuarios actualmente activos en el sistema. También, use el comando logger para generar el mensaje de registro. 3.1. Cree un archivo de script llamado /etc/cron.daily/usercount con el siguiente contenido. Puedes usar el comando vi /etc/cron.daily/usercount para crear el archivo de script. RH134-RHEL8.2-es-1-20200928 53 capítulo 2 | Programación de tareas futuras #!/bin/bash USERCOUNT=$(w -h | wc -l) logger "There are currently ${USERCOUNT} active users" 3.2. Use el comando chmod para habilitar el permiso ejecutable (x) en /etc/ cron.daily/usercount. [root@servera ~]# chmod +x /etc/cron.daily/usercount 4. El paquete sysstat proporciona las unidades systemd denominadas sysstatcollect.timer y sysstat-collect.service. La unidad del temporizador desencadena la unidad de servicio cada 10 minutos para recopilar datos de actividad del sistema usando el script de shell llamado /usr/lib64/sa/sa1. Asegúrese de que el paquete sysstat se instale y cambie el archivo de configuración de la unidad del temporizador para que recopile los datos de actividad del sistema cada dos minutos. 4.1. Use el comando yum para instalar el paquete sysstat. [root@servera ~]# yum install sysstat ...output omitted... Is this ok [y/N]: y ...output omitted... Installed: sysstat-11.7.3-2.el8.x86_64 lm_sensorslibs-3.4.0-17.20180522git70f7e08.el8.x86_64 Complete! 4.2. Copie /usr/lib/systemd/system/sysstat-collect.timer en /etc/ systemd/system/sysstat-collect.timer. [root@servera ~]# cp /usr/lib/systemd/system/sysstat-collect.timer \ /etc/systemd/system/sysstat-collect.timer Importante No debe editar archivos bajo el directorio /usr/lib/systemd. Con systemd, puede copiar el archivo de la unidad al directorio /etc/systemd/system y editar esa copia. El proceso de systemd analiza su copia personalizada en lugar del archivo bajo el directorio /usr/lib/systemd. 4.3. Edite /etc/systemd/system/sysstat-collect.timer para que la unidad del temporizador funcione cada dos minutos. Además, reemplace todas las apariciones de la cadena 10 minutes con 2 minutes en todo el archivo de configuración de la unidad, incluidos los de las líneas comentadas. Puede usar el comando vi / etc/systemd/system/sysstat-collect.timer para editar el archivo de configuración. ... # 54 Activates activity collector every 2 minutes RH134-RHEL8.2-es-1-20200928 capítulo 2 | Programación de tareas futuras [Unit] Description=Run system activity accounting tool every 2 minutes [Timer] OnCalendar=*:00/02 [Install] WantedBy=sysstat.service Los cambios anteriores causan que la unidad sysstat-collect. timer desencadene la unidad de sysstat-collect.service cada dos minutos, que ejecuta /usr/lib64/sa/sa1 1 1. La ejecución de /usr/lib64/sa/sa1 1 1 recopila los datos de actividad del sistema en un archivo binario bajo el directorio / var/log/sa. 4.4. Use el comando systemctl daemon-reload para asegurarse de que systemd conozca los cambios. [root@servera ~]# systemctl daemon-reload 4.5. Use el comando systemctl para activar la unidad del temporizador sysstatcollect.timer. [root@servera ~]# systemctl enable --now sysstat-collect.timer 4.6. Use el comando while para esperar hasta que el archivo binario se cree bajo el directorio /var/log/sa. Espere a que regrese su prompt de shell. [root@servera ~]# while [ $(ls /var/log/sa | wc -l) -eq 0 ]; do sleep 1s; done \ En el comando while de arriba, el ls /var/log/sa | wc -l devuelve un 0 si el archivo no existe y un 1 si existe. El while determina si es igual a 0 y si es así, ingresa al bucle, que se detiene por un segundo. Cuando el archivo existe, el bucle while se cierra. 4.7. Use el comando ls -l para verificar que el archivo binario bajo el directorio /var/ log/sa se modificó en los últimos dos minutos. [root@servera ~]# ls -l /var/log/sa total 8 -rw-r--r--. 1 root root 5156 Mar 25 12:34 sa25 [root@servera ~]# date Mon Mar 25 12:35:32 +07 2019 La salida del comando anterior puede variar en su sistema. 4.8. Salga de la shell del usuario root y cierre sesión en servera. RH134-RHEL8.2-es-1-20200928 55 capítulo 2 | Programación de tareas futuras [root@servera ~]# exit logout [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute lab scheduling-system finish para terminar este ejercicio. Este script elimina los archivos creados durante el ejercicio para garantizar que el entorno quede limpio. [student@workstation ~]$ lab scheduling-system finish Esto concluye el ejercicio guiado. 56 RH134-RHEL8.2-es-1-20200928 capítulo 2 | Programación de tareas futuras Administración de archivos temporales Objetivos Después de finalizar esta sesión, debe ser capaz de habilitar y deshabilitar los temporizadores de systemd y configurar un temporizador que administre archivos temporales. Administración de archivos temporales Un sistema moderno requiere una gran cantidad de archivos y directorios temporales. Algunas aplicaciones (y usuarios) usan el directorio /tmp para almacenar datos temporales, mientras que otros usan una ubicación específica de la tarea como daemon y directorios volátiles específicos del usuario bajo /run. En este contexto, volátil significa que el sistema de archivos que almacena estos archivos solo existe en la memoria. Cuando el sistema vuelva a arrancar o pierda potencia, todo el contenido del almacenamiento volátil desaparecerá. Para mantener un sistema ejecutándose de forma ordenada, es necesario que estos directorios y archivos se creen cuando no existen, dado que los daemons y scripts podrían contar con que estos estén allí, y que los archivos antiguos se purguen de modo que no puedan llenar espacio en el disco ni proporcionar información errónea. Red Hat Enterprise Linux 7 y posteriores incluyen una nueva herramienta llamada systemdtmpfiles, que proporciona un método estructurado y configurable para administrar directorios y archivos temporales. Cuando systemd inicia un sistema, una de las primeras unidades de servicio iniciadas es systemd-tmpfiles-setup. Este servicio ejecuta el comando systemd-tmpfiles --create --remove. Este comando lee los archivos de configuración de /usr/lib/tmpfiles.d/ *.conf, /run/tmpfiles.d/*.conf y /etc/tmpfiles.d/*.conf. Todos los archivos y directorios marcados para la eliminación en esos archivos de configuración se eliminarán, y todos los archivos y directorios marcados para la creación (o arreglos de permisos) se crearán con los permisos correctos si es necesario. Limpieza de archivos temporales con un temporizador de systemd Para asegurar que los sistemas de larga duración no llenan sus discos con datos obsoletos, una unidad de temporizador systemd llamada systemd-tmpfiles-clean.timer desencadena systemd-tmpfiles-clean.service en un intervalo regular, que ejecuta el comando systemd-tmpfiles --clean. Los archivos de configuración de la unidad del temporizador systemd tienen una sección [Timer] que indica con qué frecuencia debe iniciarse el servicio con el mismo nombre. Use el siguiente comando systemctl para ver los contenidos del archivo de configuración de la unidad systemd-tmpfiles-clean.timer. [user@host ~]$ systemctl cat systemd-tmpfiles-clean.timer # /usr/lib/systemd/system/systemd-tmpfiles-clean.timer # SPDX-License-Identifier: LGPL-2.1+ # RH134-RHEL8.2-es-1-20200928 57 capítulo 2 | Programación de tareas futuras # # # # # # # This file is part of systemd. systemd is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. [Unit] Description=Daily Cleanup of Temporary Directories Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8) [Timer] OnBootSec=15min OnUnitActiveSec=1d En la configuración anterior, el parámetro OnBootSec=15min indica que la unidad de servicio llamada systemd-tmpfiles-clean.service se desencadena 15 minutos después de que el sistema se haya iniciado. El parámetro OnUnitActiveSec=1d indica que cualquier otro desencadenador para la unidad de servicio systemd-tmpfiles-clean.service ocurre 24 horas después de que la unidad de servicio se activó por última vez. En función de sus necesidades, puede cambiar los parámetros en el archivo de configuración de la unidad del temporizador systemd-tmpfiles-clean.timer. Por ejemplo, el valor 30 min para el parámetro OnUnitActiveSec desencadena la unidad de servicio systemd-tmpfilesclean.service 30 minutos después de la última activación de la unidad de servicio. Como resultado, systemd-tmpfiles-clean.service se activa cada 30 minutos después de que los cambios surtan efecto. Después de cambiar el archivo de configuración de la unidad del temporizador, use el comando systemctl daemon-reload para asegurar que systemd tenga conocimiento de los cambios. Este comando recarga la configuración del administrador systemd. [root@host ~]# systemctl daemon-reload Después de recargar la configuración del administrador systemd, use el siguiente comando systemctl para activar la unidad systemd-tmpfiles-clean.timer. [root@host ~]# systemctl enable --now systemd-tmpfiles-clean.timer Limpieza de archivos temporales manualmente El comando systemd-tmpfiles --clean analiza los mismos archivos de configuración que el comando systemd-tmpfiles --create, pero en lugar de crear archivos y directorios, purgará todos los archivos a los que no se haya accedido, y que no hayan sido modificados ni cambiados en una fecha anterior a la antigüedad máxima definida en el archivo de configuración. El formato de los archivos de configuración para systemd-tmpfiles se detalla en la página del manual tmpfiles.d(5). La sintaxis básica consta de siete columnas: Tipo, Ruta, Modo, UID, GID, Edad y Argumento. Tipo se refiere a la acción que debe realizar systemd-tmpfiles; por ejemplo, d ara crear un directorio si no existe aún, o Z para restaurar recursivamente contextos de SELinux y propiedad y permisos de archivos. A continuación, se dan algunos ejemplos con explicaciones: 58 RH134-RHEL8.2-es-1-20200928 capítulo 2 | Programación de tareas futuras d /run/systemd/seats 0755 root root - Cuando cree archivos y directorios, cree el directorio /run/systemd/seats si aún no existe, propiedad del usuario root y el grupo root, con permisos establecidos para rwxr-xr-x. Este directorio no se purgará automáticamente. D /home/student 0700 student student 1d Cree el directorio /home/student si aún no existe. Si existe, vacíe todos los contenidos. Cuando systemd-tmpfiles --clean se ejecute, elimine todos los archivos a los que no se haya accedido, ni se hayan modificado ni cambiado en más de un día. L /run/fstablink - root root - /etc/fstab Cree el enlace simbólico /run/fstablink que apunte a /etc/fstab. Nunca purgue automáticamente esta línea. Precedencia de archivos de configuración Los archivos de configuración pueden encontrarse en tres lugares: • /etc/tmpfiles.d/*.conf • /run/tmpfiles.d/*.conf • /usr/lib/tmpfiles.d/*.conf Los archivos en /usr/lib/tmpfiles.d/ son proporcionados por los paquetes de RPM relevantes, y no debe editarlos. Los archivos bajo /run/tmpfiles.d/ son archivos volátiles, normalmente usados por daemons para administrar sus propios archivos temporales de tiempo de ejecución. Los archivos bajo /etc/tmpfiles.d/ están pensados para que los administradores configuren ubicaciones temporales personalizadas y anulen los valores predeterminados provistos por el proveedor. Si un archivo en /run/tmpfiles.d/ tiene el mismo nombre de archivo que un archivo en / usr/lib/tmpfiles.d/, se usa el archivo en /run/tmpfiles.d/. Si un archivo en /etc/ tmpfiles.d/ tiene el mismo nombre de archivo que un archivo en /run/tmpfiles.d/ o / usr/lib/tmpfiles.d/, se usa el archivo en /etc/tmpfiles.d/. Dadas estas reglas de precedencia, puede reemplazar fácilmente la configuración proporcionada por el proveedor si copia el archivo relevante en /etc/tmpfiles.d/ y, luego, lo edita. Trabajar de esta manera garantiza que la configuración proporcionada por el administrador se puede administrar fácilmente desde un sistema de administración de configuración central, y que no se sobrescriba por una actualización de un paquete. nota Cuando evalúe configuraciones nuevas o modificadas, puede ser útil solo aplicar los comandos de un archivo de configuración. Esto se puede lograr si se especifica el nombre del archivo de configuración en la línea de comandos. RH134-RHEL8.2-es-1-20200928 59 capítulo 2 | Programación de tareas futuras Referencias Páginas del manual: systemd-tmpfiles(8), tmpfiles.d(5), stat(1), stat(2) y systemd.timer(5). 60 RH134-RHEL8.2-es-1-20200928 capítulo 2 | Programación de tareas futuras Ejercicio Guiado Administración de archivos temporales En este ejercicio, configurará systemd-tmpfiles para cambiar la rapidez con la que elimina los archivos temporales de /tmp, y también para purgar periódicamente los archivos de otro directorio. Resultados Usted deberá ser capaz de realizar lo siguiente: • Configurar systemd-tmpfiles para eliminar archivos temporales no usados de /tmp. • Configurar systemd-tmpfiles para purgar periódicamente archivos de otro directorio. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute lab scheduling-tempfiles start para iniciar el ejercicio. Este script crea los archivos necesarios y asegura la configuración correcta del entorno. [student@workstation ~]$ lab scheduling-tempfiles start 1. Desde workstation, abra una sesión de SSH en servera como student. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Configure systemd-tmpfiles para limpiar el directorio /tmp para que no contenga archivos que no se hayan usado en los últimos cinco días. Asegúrese de que la configuración no se sobrescriba con ninguna actualización del paquete. 2.1. Use el comando sudo -i para cambiar al usuario root. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 2.2. Copie /usr/lib/tmpfiles.d/tmp.conf en /etc/tmpfiles.d/tmp.conf. [root@servera ~]# cp /usr/lib/tmpfiles.d/tmp.conf \ /etc/tmpfiles.d/tmp.conf 2.3. Busque la línea de configuración en /etc/tmpfiles.d/tmp.conf que se aplica al directorio /tmp. Reemplace la edad existente de los archivos temporales en esa línea de configuración con la nueva edad de 5 días. Elimine todas las otras líneas del RH134-RHEL8.2-es-1-20200928 61 capítulo 2 | Programación de tareas futuras archivo, incluidas las comentadas. Puede usar el comando vim /etc/tmpfiles.d/ tmp.conf para editar el archivo de configuración. El archivo /etc/tmpfiles.d/ tmp.conf debe aparecer de la siguiente manera: q /tmp 1777 root root 5d En la configuración anterior, el tipo q es idéntico a d e indica a systemd-tmpfiles que cree el directorio /tmp si no existe. El directorio debe tener los permisos octales establecidos en 1777. Tanto el usuario propietario como el grupo de /tmp deben ser root. El directorio /tmp no debe contener los archivos temporales que no se han usado en los últimos cinco días. 2.4. Use el comando systemd-tmpfiles --clean para verificar que el archivo /etc/ tmpfiles.d/tmp.conf contenga la configuración correcta. [root@servera ~]# systemd-tmpfiles --clean /etc/tmpfiles.d/tmp.conf Debido a que el comando anterior no devolvió ningún error, confirma que los ajustes de configuración son correctos. 3. Agregue una nueva configuración que asegure que el directorio /run/momentary exista con la propiedad del usuario y del grupo establecida en root. Los permisos octales para el directorio deben ser 0700. La configuración debe purgar los archivos de este directorio que no se hayan usado en los últimos 30 segundos. 3.1. Cree el archivo llamado /etc/tmpfiles.d/momentary.conf con el siguiente contenido. Puede usar el comando vim /etc/tmpfiles.d/momentary.conf para crear el archivo de configuración. d /run/momentary 0700 root root 30s La configuración anterior hace que systemd-tmpfiles asegure que el directorio /run/momentary exista con sus permisos octales establecidos en 0700. El usuario propietario y el grupo de /run/momentary deben ser root. Los archivos de este directorio que no se hayan usado en los últimos 30 segundos se deben purgar. 3.2. Use el comando systemd-tmpfiles --create para verificar que el archivo / etc/tmpfiles.d/momentary.conf contenga la configuración adecuada. El comando crea el directorio /run/momentary si aún no existe. [root@servera ~]# systemd-tmpfiles --create \ /etc/tmpfiles.d/momentary.conf Debido a que el comando anterior no devolvió ningún error, confirma que los ajustes de configuración son correctos. 3.3. Use el comando ls para verificar que el directorio /run/momentary se crea con los permisos, el propietario y el propietario del grupo adecuados. [root@servera ~]# ls -ld /run/momentary drwx------. 2 root root 40 Mar 21 16:39 /run/momentary Tenga en cuenta que el conjunto de permisos octales de /run/momentary es 0700 y que la propiedad del usuario y del grupo se establece en root. 62 RH134-RHEL8.2-es-1-20200928 capítulo 2 | Programación de tareas futuras 4. Verifique que cualquier archivo bajo el directorio /run/momentary, no usado en los últimos 30 segundos, se elimina, en función de la configuración de systemd-tmpfiles para el directorio. 4.1. Use el comando touch para crear un archivo denominado /run/momentary/ testfile. [root@servera ~]# touch /run/momentary/testfile 4.2. Use el comando sleep para configurar su prompt de shell para que no regrese durante 30 segundos. [root@servera ~]# sleep 30 4.3. Después de que vuelva a aparecer el prompt de shell, use el comando systemdtmpfiles --clean para limpiar archivos obsoletos de /run/momentary, sobre la base de la regla mencionada en /etc/tmpfiles.d/momentary.conf. [root@servera ~]# systemd-tmpfiles --clean \ /etc/tmpfiles.d/momentary.conf El comando anterior elimina /run/momentary/testfile porque el archivo no se usó durante 30 segundos y debería haberse eliminado según la regla mencionada en /etc/tmpfiles.d/momentary.conf. 4.4. Use el comando ls -l para verificar que el archivo /run/momentary/testfile no exista. [root@servera ~]# ls -l /run/momentary/testfile ls: cannot access '/run/momentary/testfile': No such file or directory 4.5. Salga de la shell del usuario root y cierre sesión en servera. [root@servera ~]# exit logout [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute lab scheduling-tempfiles finish para terminar este ejercicio. Este script elimina los archivos creados durante el ejercicio para garantizar que el entorno quede limpio. [student@workstation ~]$ lab scheduling-tempfiles finish Esto concluye el ejercicio guiado. RH134-RHEL8.2-es-1-20200928 63 capítulo 2 | Programación de tareas futuras Cuestionario Programación de tareas futuras Elija las respuestas correctas para las siguientes preguntas. 1. ¿Qué comando muestra todos los trabajos de usuario que actualmente están programados para ejecutarse como trabajos diferidos? a. atq b. atrm c. at -c d. at --display 2. ¿Qué comando elimina el trabajo de usuario diferido que tiene el número de trabajo 5? a. at -c 5 b. atrm 5 c. at 5 d. at --delete 5 3. ¿Qué comando muestra todos los trabajos de usuario recurrentes programados para el actual usuario que inició sesión actualmente? a. crontab -r b. crontab -l c. crontab -u d. crontab -V 4. ¿Qué formato de trabajo ejecuta /usr/local/bin/daily_backup cada hora desde las 9:00 a. m. a las 6:00 p. m. todos los días de lunes a viernes? a. 00 ***Mon-Fri/usr/local/bin/daily_backup b. * */9 * * Mon-Fri /usr/local/bin/daily_backup c. 00 */18 * * * /usr/local/bin/daily_backup d. 00 09-18 * * Mon-Fri /usr/local/bin/daily_backup 5. ¿Qué directorio contiene los scripts de shell destinados a ejecutarse diariamente? a. /etc/cron.d b. /etc/cron.hourly c. /etc/cron.daily d. /etc/cron.weekly 64 RH134-RHEL8.2-es-1-20200928 capítulo 2 | Programación de tareas futuras 6. ¿Qué archivo de configuración define la configuración de los trabajos del sistema que se ejecutan de forma diaria, semanal y mensual? a. /etc/crontab b. /etc/anacrontab c. /etc/inittab d. /etc/sysconfig/crond 7. ¿Qué unidad systemd desencadena regularmente la limpieza de los archivos temporales? a. systemd-tmpfiles-clean.timer b. systemd-tmpfiles-clean.service c. dnf-makecache.timer d. unbound-anchor.timer RH134-RHEL8.2-es-1-20200928 65 capítulo 2 | Programación de tareas futuras Solución Programación de tareas futuras Elija las respuestas correctas para las siguientes preguntas. 1. ¿Qué comando muestra todos los trabajos de usuario que actualmente están programados para ejecutarse como trabajos diferidos? a. atq b. atrm c. at -c d. at --display 2. ¿Qué comando elimina el trabajo de usuario diferido que tiene el número de trabajo 5? a. at -c 5 b. atrm 5 c. at 5 d. at --delete 5 3. ¿Qué comando muestra todos los trabajos de usuario recurrentes programados para el actual usuario que inició sesión actualmente? a. crontab -r b. crontab -l c. crontab -u d. crontab -V 4. ¿Qué formato de trabajo ejecuta /usr/local/bin/daily_backup cada hora desde las 9:00 a. m. a las 6:00 p. m. todos los días de lunes a viernes? a. 00 ***Mon-Fri/usr/local/bin/daily_backup b. * */9 * * Mon-Fri /usr/local/bin/daily_backup c. 00 */18 * * * /usr/local/bin/daily_backup d. 00 09-18 * * Mon-Fri /usr/local/bin/daily_backup 5. ¿Qué directorio contiene los scripts de shell destinados a ejecutarse diariamente? a. /etc/cron.d b. /etc/cron.hourly c. /etc/cron.daily d. /etc/cron.weekly 66 RH134-RHEL8.2-es-1-20200928 capítulo 2 | Programación de tareas futuras 6. ¿Qué archivo de configuración define la configuración de los trabajos del sistema que se ejecutan de forma diaria, semanal y mensual? a. /etc/crontab b. /etc/anacrontab c. /etc/inittab d. /etc/sysconfig/crond 7. ¿Qué unidad systemd desencadena regularmente la limpieza de los archivos temporales? a. systemd-tmpfiles-clean.timer b. systemd-tmpfiles-clean.service c. dnf-makecache.timer d. unbound-anchor.timer RH134-RHEL8.2-es-1-20200928 67 capítulo 2 | Programación de tareas futuras Resumen En este capítulo, aprendió lo siguiente: • Los trabajos que están programados para ejecutarse una vez en el futuro se llaman trabajos o tareas diferidos. • Los trabajos de usuario recurrentes ejecutan las tareas del usuario en una programación de repetición. • Los trabajos recurrentes del sistema realizan tareas administrativas en una programación de repetición que tiene impacto en todo el sistema. • Las unidades de tipo temporizador de systemd pueden ejecutar tanto los trabajos diferidos como los recurrentes. 68 RH134-RHEL8.2-es-1-20200928 capítulo 3 Ajuste del rendimiento del sistema Meta Mejorar el rendimiento del sistema estableciendo parámetros de ajuste y ajustando la prioridad de programación de los procesos. Objetivos • Optimizar el rendimiento del sistema seleccionando un perfil de ajuste administrado por el daemon tuned. • Dar o quitar la prioridad a procesos específicos con los comandos nice y renice. • Ajuste de perfiles de optimización (y ejercicio guiado) • Influencia en la programación de procesos (y ejercicio guiado) Secciones Trabajo de laboratorio RH134-RHEL8.2-es-1-20200928 Ajuste del rendimiento del sistema 69 capítulo 3 | Ajuste del rendimiento del sistema Ajuste de perfiles de ajuste Objetivos Después de completar esta sección, debe ser capaz de optimizar el rendimiento del sistema seleccionando un perfil de ajuste administrado por el daemon tuned. Sistemas de ajuste Los administradores del sistema pueden optimizar el rendimiento de un sistema ajustando diversas configuraciones de dispositivos basadas en una variedad de cargas de trabajo de casos de uso. El daemon tuned aplica la configuración de ajuste de forma estática y dinámica, con perfiles de optimización que reflejan los requisitos particulares de la carga de trabajo. Configuración de ajuste estático El daemon tuned aplica la configuración del sistema cuando se inicia el servicio o al seleccionar un nuevo perfil de ajuste. El ajuste estático configura los parámetros predefinidos del kernel en los perfiles a los que se aplica tuned en el tiempo de ejecución. Con el ajuste estático, los parámetros del kernel se establecen para las expectativas de rendimiento general y no se ajustan a medida que cambian los niveles de actividad. Configuración de ajuste dinámico Con el ajuste dinámico, el daemon tuned monitorea la actividad del sistema y ajusta la configuración según los cambios de comportamiento del tiempo de ejecución. El ajuste dinámico se ajusta continuamente para adaptarse a la carga de trabajo actual, comenzando con las configuraciones iniciales declaradas en el perfil de ajuste elegido. Por ejemplo, los dispositivos de almacenamiento experimentan un alto uso durante el arranque y el inicio de sesión, pero tienen una actividad mínima cuando las cargas de trabajo de los usuarios consisten en el uso de navegadores web y clientes de correo electrónico. De manera similar, la actividad de la CPU y los dispositivos de red aumentan durante el uso máximo en un día laboral. El daemon tuned monitorea la actividad de estos componentes y ajusta la configuración de parámetros para maximizar el rendimiento durante momentos de mucha actividad y reducir los ajustes durante momentos de poca actividad. El daemon tuned usa los parámetros de rendimiento proporcionados en los perfiles de ajuste predefinidos. Instalación y habilitación de ajuste La instalación mínima de Red Hat Enterprise Linux 8 incluye y habilita el paquete tuned de manera predeterminada. Para instalar y habilitar el paquete manualmente: [root@host ~]$ yum install tuned [root@host ~]$ systemctl enable --now tuned Created symlink /etc/systemd/system/multi-user.target.wants/tuned.service → /usr/ lib/systemd/system/tuned.service. 70 RH134-RHEL8.2-es-1-20200928 capítulo 3 | Ajuste del rendimiento del sistema Selección de un perfil de ajuste La aplicación Tuned proporciona perfiles divididos en las siguientes categorías: • Perfiles de ahorro de energía • Perfiles de aumento de rendimiento Los perfiles de aumento de rendimiento incluyen perfiles que se centran en los siguientes aspectos: • Baja latencia de almacenamiento y red • Alto rendimiento de almacenamiento y red • Rendimiento de máquinas virtuales • Rendimiento del host de virtualización Perfiles de ajuste distribuidos con Red Hat Enterprise Linux 8 Perfil de Tuned Propósito balanced (balanceado) Ideal para los sistemas que requieren un balance entre ahorro de energía y rendimiento. desktop (escritorio) Derivado del perfil balanced. Proporciona una respuesta más rápida de las aplicaciones interactivas. throughput-performance (rendimiento de productividad) Ajusta el sistema para maximizar el rendimiento. latency-performance (rendimiento de latencia) Ideal para los sistemas de servidores que requieren baja latencia a expensas del consumo de energía. network-latency (latencia de red) Derivado del perfil latency-performance. Habilita parámetros de ajuste de red adicionales para proporcionar una baja latencia de red. network-throughput (rendimiento de red) Derivado del perfil throughput-performance. Se aplican parámetros de ajuste de red adicionales para maximizar el rendimiento de la red. powersave (ahorro de energía) Ajusta el sistema para maximizar el ahorro de energía. oracle Optimizado para cargas de base de datos de Oracle, basado en el perfil throughput-performance. virtual-guest (invitado virtual) Ajusta el sistema para maximizar el rendimiento si se ejecuta en una máquina virtual. virtual-host (host virtual) Ajusta el sistema para maximizar el rendimiento si actúa como host de máquinas virtuales. Administración de perfiles desde la línea de comandos El comando tuned-adm puede usarse para modificar la configuración del daemon tuned. El comando tuned-adm puede consultar la configuración actual, listar los perfiles disponibles, recomendar un perfil de ajuste para el sistema, modificar los perfiles directamente o desactivar los ajustes. RH134-RHEL8.2-es-1-20200928 71 capítulo 3 | Ajuste del rendimiento del sistema Un administrador del sistema identifica el perfil de ajuste activo actualmente con tuned-adm active. [root@host ~]# tuned-adm active Current active profile: virtual-guest El comando tuned-adm list enumera todos los perfiles de optimización disponibles, incluidos ambos perfiles incorporados y los perfiles de optimización personalizados creados por un administrador del sistema. [root@host ~]# tuned-adm list Available profiles: - balanced - desktop - latency-performance - network-latency - network-throughput - powersave - sap - throughput-performance - virtual-guest - virtual-host Current active profile: virtual-guest Use tuned-adm profile profilename para cambiar el perfil activo a uno diferente que se adapte mejor a los requisitos de ajuste actuales del sistema. [root@host ~]$ tuned-adm profile throughput-performance [root@host ~]$ tuned-adm active Current active profile: throughput-performance El comando tuned-adm puede recomendar un perfil de ajuste para el sistema. Este mecanismo se usa para determinar el perfil predeterminado de un sistema después de la instalación. [root@host ~]$ tuned-adm recommend virtual-guest nota La salida tuned-adm recommend se basa en diversas características del sistema, entre ellas, si el sistema es una máquina virtual y otras categorías predefinidas seleccionadas durante la instalación del sistema. Para revertir los cambios de configuración realizados por el perfil actual, cambie a otro perfil o desactive el daemon ajustado. Desactive la actividad de ajuste de tuned con tuned-adm off. [root@host ~]$ tuned-adm off [root@host ~]$ tuned-adm active No current active profile. 72 RH134-RHEL8.2-es-1-20200928 capítulo 3 | Ajuste del rendimiento del sistema Administración de perfiles con la consola web Para administrar los perfiles de rendimiento del sistema con la consola web, inicie sesión con acceso privilegiado. Haga clic en la opción Reuse my password for privileged tasks (Reutilizar mi contraseña para tareas privilegiadas). Esto permite que el usuario ejecute comandos, con privilegios de sudo, que modifican los perfiles de rendimiento del sistema. Figura 3.1: Inicio de sesión privilegiado con la consola web Como usuario privilegiado, haga clic en la opción del menú Systems (Sistemas) en la barra de navegación izquierda. El perfil activo actual se muestra en el campo Performance Profile (Perfil de rendimiento). Para seleccionar un perfil diferente, haga clic en el enlace del perfil activo. Figura 3.2: Perfil de rendimiento activo En la interfaz de usuario de Change Performance Profile (Cambiar perfil de rendimiento), desplácese por la lista de perfiles para seleccionar el que mejor se adapte al propósito del sistema. RH134-RHEL8.2-es-1-20200928 73 capítulo 3 | Ajuste del rendimiento del sistema Figura 3.3: Seleccione un perfil de rendimiento preferido Para verificar los cambios, vuelva a la página principal de System y confirme que se muestra el perfil activo en el campo Performance Profile. Figura 3.4: Verifique el perfil de rendimiento activo Referencias Páginas del manual: tuned(8), tuned.conf(5), tuned-main.conf(5) y tunedadm(1) 74 RH134-RHEL8.2-es-1-20200928 capítulo 3 | Ajuste del rendimiento del sistema Ejercicio Guiado Ajuste de perfiles de ajuste En este ejercicio, ajustará el rendimiento de un servidor activando el servicio tuned y aplicando un perfil de ajuste. Resultados Debe ser capaz de configurar un sistema para usar un perfil de ajuste. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab tuning-profiles start. El comando ejecuta un script de inicio que determina si el host servera es accesible en la red. [student@workstation ~]$ lab tuning-profiles start 1. En workstation, use SSH para iniciar sesión en servera con el usuario student. Los sistemas se configuran a fin de que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Verifique que el paquete tuned esté instalado, habilitado e iniciado. 2.1. Use yum para confirmar que el paquete tuned esté instalado. [student@servera ~]$ yum list tuned ...output omitted... Installed Packages tuned.noarch 2.10.0-15.el8 2.2. @anaconda El comando systemctl is-enabled tuned muestra si el servicio está habilitado. [student@servera ~]$ systemctl is-enabled tuned enabled 2.3. El comando systemctl is-active tuned muestra si el servicio se está ejecutando actualmente. [student@servera ~]$ systemctl is-active tuned active RH134-RHEL8.2-es-1-20200928 75 capítulo 3 | Ajuste del rendimiento del sistema 3. Enumere los perfiles de ajuste disponibles e identifique el perfil activo. Si sudo solicita una contraseña, ingrese student después del aviso. [student@servera ~]$ sudo tuned-adm list [sudo] password for student: student Available profiles: - balanced - General non-specialized tuned profile - desktop - Optimize for the desktop use-case - latency-performance - Optimize for deterministic performance at the cost of increased power consumption - network-latency - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance - network-throughput - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks - powersave - Optimize for low power consumption - throughput-performance - Broadly applicable tuning that provides excellent performance across a variety of common server workloads - virtual-guest - Optimize for running inside a virtual guest - virtual-host - Optimize for running KVM guests Current active profile: virtual-guest 4. Cambie el perfil de ajuste activo actual a powersave y, a continuación, confirme los resultados. Si sudo solicita una contraseña, ingrese student después del aviso. 4.1. Cambie el perfil de ajuste activo actual. [student@servera ~]$ sudo tuned-adm profile powersave 4.2. Confirme que powersave es el perfil de ajuste activo. [student@servera ~]$ sudo tuned-adm active Current active profile: powersave 5. Salga de servera. [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute el script lab tuning-profiles finish para terminar este ejercicio. [student@workstation ~]$ lab tuning-profiles finish Esto concluye el ejercicio guiado. 76 RH134-RHEL8.2-es-1-20200928 capítulo 3 | Ajuste del rendimiento del sistema Influencia en la programación de procesos Objetivos Después de completar esta sección, debe ser capaz de priorizar o quitar la prioridad de procesos específicos, con los comandos nice y renice. Programación y multitareas de procesos de Linux Los sistemas de computación modernos varían de los sistemas de gama baja, que tienen una CPU y solo pueden ejecutar una única instrucción a la vez, hasta las supercomputadoras de alto rendimiento con cientos de CPU cada una y decenas o incluso centenas de núcleos de procesamiento en cada CPU, que permiten ejecutar enormes cantidades de instrucciones en paralelo. Aun así, todos estos sistemas tienen algo en común: la necesidad de ejecutar más procesos y subprocesos que la cantidad de CPU que tienen. Linux y otros sistemas operativos ejecutan más procesos que la cantidad de unidades de procesamiento que tienen, con una técnica llamada particionamiento de tiempo o multitarea. El programador de procesos del sistema operativo cambia rápidamente entre procesos en un único núcleo, lo que da la impresión de que hay varios procesos ejecutándose al mismo tiempo. Prioridades relativas Los diferentes procesos tienen diferentes niveles de importancia. El programador de procesos se puede configurar para usar diferentes políticas de programación para diferentes procesos. La política de programación usada para la mayoría de los procesos que se ejecutan en un sistema normal se denomina SCHED_OTHER (también denominada SCHED_NORMAL), pero hay otras políticas disponibles para las diversas necesidades de cargas de trabajo. Debido a que no todos los procesos son igual de importantes, a los procesos que se ejecutan con la política SCHED_NORMAL se les puede dar una prioridad relativa. Esta prioridad se denomina el valor bueno de un proceso, y se organizan en 40 niveles buenos diferentes para todos los procesos. Los valores de nivel bueno van desde -20 (prioridad más alta) a 19 (prioridad más baja). De forma predeterminada, los procesos heredan su nivel bueno de sus procesos principales, que es generalmente 0. Los niveles buenos más altos indican menos prioridad (el proceso abandona fácilmente el uso de la CPU), mientras que los niveles buenos más bajos indican una mayor prioridad (el proceso tiene menos tendencia a abandonar el uso de la CPU). Si no hay disputa por recursos (por ejemplo, cuando hay menos procesos activos que núcleos de la CPU disponibles), incluso los procesos con un nivel bueno alto usarán todos los recursos de la CPU disponibles que puedan. Sin embargo, cuando hay más procesos que solicitan tiempo de CPU que núcleos disponibles, los procesos con un nivel bueno más alto recibirán menos tiempo de la CPU que aquellos con un nivel bueno más bajo. Configuración de niveles buenos y permisos Dado que establecer un nivel bueno bajo en un proceso que requiere mucha CPU podría afectar de forma negativa el rendimiento de otros procesos que se ejecutan en el mismo sistema, solo el usuario root puede reducir el nivel bueno de un proceso. RH134-RHEL8.2-es-1-20200928 77 capítulo 3 | Ajuste del rendimiento del sistema Los usuarios no privilegiados solo están autorizados a incrementar los niveles buenos de sus propios procesos. No pueden reducir los niveles buenos de sus procesos ni pueden modificar el nivel bueno de los procesos de otros usuarios. Informe de niveles buenos Varias herramientas muestran los niveles buenos de los procesos en ejecución. Las herramientas de gestión de procesos, como top, muestran el nivel bueno de manera predeterminada. Otras herramientas, como el comando ps, muestran niveles buenos cuando se usan las opciones adecuadas. Visualización de niveles buenos con el comando top Use el comando top para visualizar y administrar procesos de forma interactiva. La configuración predeterminada muestra dos columnas de interés sobre niveles buenos y prioridades. La columna NI muestra el valor bueno del proceso y la columna PR muestra su prioridad programada. En la interfaz top, el nivel bueno se asigna a una cola de prioridad interna del sistema, como se muestra en el siguiente gráfico. Por ejemplo, un nivel bueno de -20 se asigna a 0 en la columna PR. Un nivel bueno de 19 se asigna a una prioridad de 39 en la columna PR. Figura 3.5: Niveles buenos y cómo se informan con el comando top Visualización de niveles buenos desde la línea de comandos El comando ps muestra los niveles buenos de los procesos, pero solo al incluir las opciones de formato correctas. El siguiente comando ps muestra una lista de todos los procesos, con su PID, nombre, nivel bueno y clase de programación, ordenados de forma descendente por nivel bueno. Los procesos que muestran TS en la columna de clase de programación CLS se ejecutan con la política de programación SCHED_NORMAL. Los procesos con un guión (-) como nivel bueno se ejecutan con otras políticas de programación y son interpretados como una prioridad más alta por el programador. Los detalles de las políticas de programación adicionales están más allá del alcance de este curso. [user@host ~]$ ps axo pid,comm,nice,cls --sort=-nice PID COMMAND NI CLS 30 khugepaged 19 TS 29 ksmd 5 TS 1 systemd 0 TS 2 kthreadd 0 TS 9 ksoftirqd/0 0 TS 10 rcu_sched 0 TS 11 migration/0 - FF 12 watchdog/0 - FF ...output omitted... 78 RH134-RHEL8.2-es-1-20200928 capítulo 3 | Ajuste del rendimiento del sistema Inicio de procesos con niveles buenos diferentes Durante la creación del proceso, este hereda el nivel bueno del proceso superior. Cuando un proceso se inicia desde la línea de comandos, heredará el nivel bueno del proceso de la shell desde donde se inició. Generalmente, esto genera nuevos procesos que se ejecutarán con un nivel bueno de 0. El siguiente ejemplo inicia un proceso desde la shell y muestra el valor bueno del proceso. Tenga en cuenta el uso de la opción PID en ps para especificar la salida solicitada. [user@host ~]$ sha1sum /dev/zero & [1] 3480 [user@host ~]$ ps -o pid,comm,nice 3480 PID COMMAND NI 3480 sha1sum 0 Todos los usuarios pueden usar el comando nice para iniciar comandos con un nivel bueno predeterminado o superior. Sin opciones, el comando nice inicia un proceso con el valor bueno predeterminado de 10. En el siguiente ejemplo, se inicia el comando sha1sum como una tarea en segundo plano con el nivel bueno predeterminado y se muestra el nivel bueno del proceso: [user@host ~]$ nice sha1sum /dev/zero & [1] 3517 [user@host ~]$ ps -o pid,comm,nice 3517 PID COMMAND NI 3517 sha1sum 10 Use la opción -n para aplicar un nivel bueno definido por el usuario para el proceso de arranque. El proceso predeterminado es agregar 10 al nivel bueno actual del proceso. En el siguiente ejemplo, se inicia un comando como una tarea en segundo plano con el valor bueno definido por el usuario y se muestra el nivel bueno del proceso: [user@host ~]$ nice -n 15 sha1sum & [1] 3521 [user@host ~]$ ps -o pid,comm,nice 3521 PID COMMAND NI 3521 sha1sum 15 Importante Los usuarios sin privilegios solo pueden aumentar el nivel bueno de su valor actual a un máximo de 19. Una vez aumentado, los usuarios sin privilegios no pueden reducir el valor para volver al nivel bueno anterior. El usuario root puede reducir el nivel bueno de cualquier nivel actual a un mínimo de -20. Cambio del nivel bueno de un proceso existente El nivel bueno de un proceso existente se puede cambiar con el comando renice. En este ejemplo, se usa el identificador PID del ejemplo anterior para cambiar el nivel bueno actual de 15 al nivel bueno deseado de 19. RH134-RHEL8.2-es-1-20200928 79 capítulo 3 | Ajuste del rendimiento del sistema [user@host ~]$ renice -n 19 3521 3521 (process ID) old priority 15, new priority 19 El comando top también se puede usar para cambiar el nivel bueno de un proceso. Desde la interfaz interactiva top, elija la opción r para acceder al comando renice, seguido por el PID que se cambiará y el nuevo nivel bueno. Referencias Páginas del manual: nice(1), renice(1), top(1) y sched_setscheduler(2). 80 RH134-RHEL8.2-es-1-20200928 capítulo 3 | Ajuste del rendimiento del sistema Ejercicio Guiado Influencia en la programación de procesos En este ejercicio, ajustará la prioridad de programación de los procesos con los comandos nice y renice, y observará los efectos que esto tiene en la ejecución de procesos. Resultados Debe poder ajustar las prioridades de programación para los procesos. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab tuning-procscheduling start. El comando ejecuta un script de inicio que determina si el host servera es accesible en la red. [student@workstation ~]$ lab tuning-procscheduling start 1. En workstation, use SSH para iniciar sesión en servera con el usuario student. Los sistemas se configuran a fin de que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Determine la cantidad de núcleos de CPU en servera y, a continuación, inicie dos instancias del comando sha1sum /dev/zero & para cada núcleo. 2.1. Use grep para analizar la cantidad de procesadores virtuales existentes (núcleos de CPU) del archivo /proc/cpuinfo. [student@servera ~]$ grep -c '^processor' /proc/cpuinfo 2 2.2. Use un comando de bucle para iniciar varias instancias del comando sha1sum / dev/zero &. Inicie dos por procesador virtual encontrado en el paso anterior. En este ejemplo, serían cuatro instancias. Los valores de PID en su salida variarán con respecto al ejemplo. [student@servera ~]$ for i in $(seq 1 4); do sha1sum /dev/zero & done [1] 2643 [2] 2644 [3] 2645 [4] 2646 RH134-RHEL8.2-es-1-20200928 81 capítulo 3 | Ajuste del rendimiento del sistema 3. Verifique que las tareas en segundo plano se estén ejecutando para cada uno de los procesos sha1sum. [student@servera ~]$ jobs [1] Running [2] Running [3]- Running [4]+ Running sha1sum /dev/zero & sha1sum /dev/zero & sha1sum /dev/zero & sha1sum /dev/zero & 4. Use los comandos ps y pgrep para mostrar el porcentaje de uso de CPU para cada proceso sha1sum. [student@servera ~]$ ps u $(pgrep sha1sum) USER PID %CPU %MEM VSZ RSS TTY student 2643 49.8 0.0 228360 1744 pts/0 student 2644 49.8 0.0 228360 1780 pts/0 student 2645 49.8 0.0 228360 1748 pts/0 student 2646 49.8 0.0 228360 1780 pts/0 5. STAT START R 11:15 R 11:15 R 11:15 R 11:15 TIME COMMAND 6:09 sha1sum /dev/zero 6:09 sha1sum /dev/zero 6:09 sha1sum /dev/zero 6:09 sha1sum /dev/zero Cierre todos los procesos sha1sum y, a continuación, verifique que no haya trabajos en ejecución. 5.1. Use el comando pkill para cerrar todos los procesos en ejecución con el patrón de nombre sha1sum. [student@servera ~]$ pkill sha1sum [2] Terminated sha1sum /dev/zero [4]+ Terminated sha1sum /dev/zero [1]- Terminated sha1sum /dev/zero [3]+ Terminated sha1sum /dev/zero 5.2. Verifique que no haya tareas en ejecución. [student@servera ~]$ jobs [student@servera ~]$ 6. Inicie varias instancias de sha1sum /dev/zero & y, a continuación, inicie una instancia adicional de sha1sum /dev/zero & con un nivel bueno de 10. Inicie tantas instancias como procesadores virtuales tenga el sistema. En este ejemplo, se inician 3 instancias normales y otra con el nivel bueno más alto. 6.1. Use los bucles para iniciar tres instancias de sha1sum /dev/zero &. [student@servera ~]$ for i in $(seq 1 3); do sha1sum /dev/zero & done [1] 1947 [2] 1948 [3] 1949 6.2. 82 Use el comando nice para iniciar la cuarta instancia con un nivel bueno de 10. RH134-RHEL8.2-es-1-20200928 capítulo 3 | Ajuste del rendimiento del sistema [student@servera ~]$ nice -n 10 sha1sum /dev/zero & [4] 1953 7. Use los comandos ps y pgrep para mostrar el PID, el porcentaje de uso de CPU, el valor bueno y el nombre ejecutable para cada proceso. La instancia con el valor bueno de 10 debe mostrar un porcentaje menor de uso de CPU que las otras instancias. [student@servera ~]$ ps -o pid,pcpu,nice,comm $(pgrep sha1sum) PID %CPU NI COMMAND 1947 66.0 0 sha1sum 1948 65.7 0 sha1sum 1949 66.1 0 sha1sum 1953 6.7 10 sha1sum 8. Use el comando sudo renice para bajar el nivel bueno de un proceso del paso anterior. Observe el valor de PID de la instancia de proceso con el nivel bueno de 10. Use ese PID de proceso para bajar su nivel bueno a 5. [student@servera ~]$ sudo renice -n 5 1953 [sudo] password for student: student 1953 (process ID) old priority 10, new priority 5 9. Repita los comandos ps y pgrep para volver a mostrar el porcentaje de CPU y el nivel bueno. [student@servera ~]$ ps -o pid,pcpu,nice,comm $(pgrep sha1sum) PID %CPU NI COMMAND 1947 63.8 0 sha1sum 1948 62.8 0 sha1sum 1949 65.3 0 sha1sum 1953 9.1 5 sha1sum 10. Use el comando pkill para cerrar todos los procesos en ejecución con el patrón de nombre sha1sum. [student@servera ~]$ pkill sha1sum ...output omitted... 11. Salga de servera. [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute el script lab tuning-procscheduling finish para terminar este ejercicio. RH134-RHEL8.2-es-1-20200928 83 capítulo 3 | Ajuste del rendimiento del sistema [student@workstation ~]$ lab tuning-procscheduling finish Esto concluye el ejercicio guiado. 84 RH134-RHEL8.2-es-1-20200928 capítulo 3 | Ajuste del rendimiento del sistema Trabajo de laboratorio Ajuste del rendimiento del sistema Lista de verificación de rendimiento En este trabajo de laboratorio, aplicará un perfil de ajuste específico y ajustará la prioridad de programación de un proceso existente con un alto uso de CPU. Resultados Usted deberá ser capaz de realizar lo siguiente: • Activar un perfil de ajuste específico para un sistema de cómputo. • Ajustar la prioridad de programación de CPU de un proceso. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. Desde workstation, ejecute el comando lab tuning-review start. Este comando ejecuta un script de inicio para determinar si el host serverb es accesible en la red. [student@workstation ~]$ lab tuning-review start 1. Cambie el perfil de ajuste actual para serverb a balanced, un perfil de ajuste general no especializado. 2. Dos procesos en serverb están consumiendo un alto porcentaje de uso de CPU. Ajuste el nivel de nice de cada proceso en 10 para permitir más tiempo de CPU para otros procesos. Evaluación En workstation, ejecute el comando lab tuning-review grade para confirmar que ha realizado correctamente este ejercicio de laboratorio. [student@workstation ~]$ lab tuning-review grade Finalizar En workstation, ejecute el script lab tuning-review finish para terminar este ejercicio. [student@workstation ~]$ lab tuning-review finish Esto concluye el trabajo de laboratorio. RH134-RHEL8.2-es-1-20200928 85 capítulo 3 | Ajuste del rendimiento del sistema Solución Ajuste del rendimiento del sistema Lista de verificación de rendimiento En este trabajo de laboratorio, aplicará un perfil de ajuste específico y ajustará la prioridad de programación de un proceso existente con un alto uso de CPU. Resultados Usted deberá ser capaz de realizar lo siguiente: • Activar un perfil de ajuste específico para un sistema de cómputo. • Ajustar la prioridad de programación de CPU de un proceso. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. Desde workstation, ejecute el comando lab tuning-review start. Este comando ejecuta un script de inicio para determinar si el host serverb es accesible en la red. [student@workstation ~]$ lab tuning-review start Cambie el perfil de ajuste actual para serverb a balanced, un perfil de ajuste general no especializado. 1. 1.1. Desde workstation, abra una sesión de SSH en serverb como el usuario student. Los sistemas se configuran para que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@serverb ...output omitted... [student@serverb ~]$ 1.2. Use yum para confirmar que el paquete tuned esté instalado. [student@serverb ~]$ yum list tuned ...output omitted... Installed Packages tuned.noarch 2.10.0-15.el8 1.3. @anaconda Use el comando systemctl is-active tuned para mostrar el estado del servicio tuned. [student@serverb ~]$ systemctl is-active tuned active 86 RH134-RHEL8.2-es-1-20200928 capítulo 3 | Ajuste del rendimiento del sistema 1.4. Enumere todos los perfiles de ajuste disponibles y sus descripciones. Tenga en cuenta que el perfil activo actual es virtual-guest. [student@serverb ~]$ sudo tuned-adm list [sudo] password for student: student Available profiles: - balanced - General non-specialized tuned profile - desktop - Optimize for the desktop use-case - latency-performance - Optimize for deterministic performance at the cost of increased power consumption - network-latency - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance - network-throughput - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks - powersave - Optimize for low power consumption - throughput-performance - Broadly applicable tuning that provides excellent performance across a variety of common server workloads - virtual-guest - Optimize for running inside a virtual guest - virtual-host - Optimize for running KVM guests Current active profile: virtual-guest 1.5. Cambie el perfil de ajuste activo actual al perfil balanced. [student@serverb ~]$ sudo tuned-adm profile balanced 1.6. Enumere la información de resumen del perfil activo actual de tuned. Use el comando tuned-adm profile_info para confirmar que el perfil activo sea el perfil balanced. [student@serverb ~]$ sudo tuned-adm profile_info Profile name: balanced Profile summary: General non-specialized tuned profile ...output omitted... 2. Dos procesos en serverb están consumiendo un alto porcentaje de uso de CPU. Ajuste el nivel de nice de cada proceso en 10 para permitir más tiempo de CPU para otros procesos. 2.1. Determine los dos consumidores de CPU principales en serverb. Los consumidores de CPU principales aparecen en último lugar en la salida del comando. Los valores porcentuales de CPU varían. [student@serverb ~]$ ps aux --sort=pcpu USER PID %CPU %MEM VSZ RSS TTY ...output omitted... root 2983 100 0.0 228360 1744 ? root 2967 101 0.0 228360 1732 ? [student@serverb ~]$ RH134-RHEL8.2-es-1-20200928 STAT START TIME COMMAND R< RN 0:23 md5sum /dev/zero 0:23 sha1sum /dev/zero 21:08 21:08 87 capítulo 3 | Ajuste del rendimiento del sistema 2.2. Identifique el nivel actual de nice para los dos consumidores de CPU principales. [student@serverb ~]$ ps -o pid,pcpu,nice,comm \ $(pgrep sha1sum;pgrep md5sum) PID %CPU NI COMMAND 2967 99.6 2 sha1sum 2983 99.7 -2 md5sum 2.3. Use el comando sudo renice -n 10 2967 2983 para ajustar el nivel de nice de cada proceso en 10. Use los valores de PID identificados en la salida del comando anterior. [student@serverb ~]$ sudo renice -n 10 2967 2983 [sudo] password for student: student 2967 (process ID) old priority 2, new priority 10 2983 (process ID) old priority -2, new priority 10 2.4. Verifique que el nivel actual de nice de cada proceso sea 10. [student@serverb ~]$ ps -o pid,pcpu,nice,comm \ $(pgrep sha1sum;pgrep md5sum) PID %CPU NI COMMAND 2967 99.6 10 sha1sum 2983 99.7 10 md5sum 2.5. Salga de serverb. [student@serverb ~]$ exit logout Connection to serverb closed. [student@workstation ~]$ Evaluación En workstation, ejecute el comando lab tuning-review grade para confirmar que ha realizado correctamente este ejercicio de laboratorio. [student@workstation ~]$ lab tuning-review grade Finalizar En workstation, ejecute el script lab tuning-review finish para terminar este ejercicio. [student@workstation ~]$ lab tuning-review finish Esto concluye el trabajo de laboratorio. 88 RH134-RHEL8.2-es-1-20200928 capítulo 3 | Ajuste del rendimiento del sistema Resumen En este capítulo, aprendió lo siguiente: • El servicio tuned modifica automáticamente la configuración del dispositivo para satisfacer las necesidades específicas del sistema en función del perfil de ajuste predefinido seleccionado. • Para revertir todos los cambios realizados en la configuración del sistema por el perfil seleccionado, cambie a otro perfil o desactive el servicio tuned. • El sistema asigna una prioridad relativa a un proceso para determinar su acceso a la CPU. Esta prioridad se denomina el valor nice de un proceso. • El comando nice asigna una prioridad a un proceso cuando se inicia. El comando renice modifica la prioridad de un proceso en ejecución. RH134-RHEL8.2-es-1-20200928 89 90 RH134-RHEL8.2-es-1-20200928 capítulo 4 Control de acceso a archivos con ACL Meta Interpretar y establecer listas de control de acceso (ACL) en archivos para manejar situaciones que requieren permisos complejos de acceso de usuarios y grupos. Objetivos • Describir los casos de uso de las ACL, identificar los archivos que tienen ACL configuradas e interpretar el efecto de esas ACL. • Establecer y eliminar las ACL de los archivos y definir las ACL predeterminadas establecidas automáticamente por un directorio en los archivos recién creados. • Interpretación de las ACL de archivos (y ejercicio guiado) • Protección de archivos con ACL (y ejercicio guiado) Secciones Trabajo de laboratorio RH134-RHEL8.2-es-1-20200928 Control de acceso a archivos con ACL 91 capítulo 4 | Control de acceso a archivos con ACL Interpretación de ACL de archivos Objetivos Tras finalizar esta sección, usted deberá ser capaz de realizar lo siguiente: • Describir las ACL y las opciones de montaje en sistemas de archivos. • Ver e interpretar las ACL con ls y getfacl. • Describir la máscara de ACL y la precedencia de permisos de ACL. • Identificar en qué ocasiones Red Hat Enterprise Linux usa las ACL de manera predeterminada. Conceptos de lista de control de acceso Los permisos estándares de archivos de Linux son satisfactorios cuando a los archivos los usa un solo propietario y un solo grupo de personas designado. Sin embargo, algunos casos de uso requieren que varios usuarios y grupos nombrados accedan a los archivos con diferentes conjuntos de permisos de archivos. Las listas de control de acceso (ACL) proporcionan esta función. Con las ACL, puede otorgar permisos a varios usuarios y grupos, identificados por nombre de usuario, nombre de grupo, UID o GID, con los mismos indicadores de permiso que se usan para los permisos de archivos normales: leer, escribir y ejecutar. Estos usuarios y grupos adicionales, más allá del propietario del archivo y la afiliación de grupo del archivo, se denominan named users (usuarios nombrados) y named groups (grupos nombrados) respectivamente, porque se nombran no en una lista larga, sino dentro de una ACL. Los usuarios pueden establecer ACL en los archivos y directorios que poseen. Los usuarios privilegiados, a los que se asigna la capacidad de Linux CAP_FOWNER, pueden establecer ACL en cualquier archivo o directorio. Los archivos y subdirectorios nuevos pueden heredar automáticamente la configuración de ACL de las ACL predeterminadas del directorio principal, si están configuradas. Al igual que las reglas de acceso a archivos normales, la jerarquía del directorio principal necesita al menos el otro conjunto de permisos de búsqueda (ejecutar) para habilitar el acceso de usuarios y grupos nombrados. Compatibilidad del sistema de archivos con ACL Los sistemas de archivos deben montarse con el soporte para ACL habilitado. Los sistemas de archivos XFS tienen soporte para ACL incorporado. Otros sistemas de archivos, como ext3 o ext4 creados en Red Hat Enterprise Linux 8, tienen la opción acl habilitada de forma predeterminada, aunque en versiones anteriores debe confirmar que el soporte de ACL esté habilitado. Para habilitar el soporte de ACL en el sistema de archivos, use la opción de ACL con el comando mount o la entrada del sistema de archivos en el archivo de configuración /etc/fstab. Visualización e interpretación de permisos de ACL El comando ls -l solo produce detalles de configuración de ACL mínimos: [user@host content]$ ls -l reports.txt -rwxrw----+ 1 user operators 130 Mar 19 23:56 reports.txt 92 RH134-RHEL8.2-es-1-20200928 capítulo 4 | Control de acceso a archivos con ACL El signo más (+) al final de la cadena de permiso de 10 caracteres indica que existe una estructura de ACL ampliada con entradas en este archivo. usuario: muestra la configuración de ACL del usuario, que es la misma que la configuración estándar de archivos del usuario; rwx. grupo: muestra la configuración actual de la máscara de ACL, no la configuración del propietario del grupo; rw. otro: muestra la configuración de ACL de otro, que es la misma que la configuración estándar de archivos de otro; sin acceso. Importante Si se modifican los permisos del grupo en un archivo con ACL mediante el uso de chmod, no se modifican los permisos del propietario del grupo, pero sí se modifica la máscara de ACL. Use setfacl -m g::perms file si lo que intenta es actualizar los permisos del propietario del grupo de archivos. Ver ACL de archivos Para visualizar la configuración de ACL en un archivo, use getfacl file: [user@host content]$ getfacl reports.txt # file: reports.txt # owner: user # group: operators user::rwx user:consultant3:--user:1005:rwx #effective:rwgroup::rwx #effective:rwgroup:consultant1:r-group:2210:rwx #effective:rwmask::rwother::--- Repase cada sección del ejemplo anterior: Entradas comentadas: # file: reports.txt # owner: user # group: operators Las primeras tres líneas son comentarios que identifican el nombre del archivo, el propietario (user) y el propietario del grupo (operators). Si hay indicadores de archivos adicionales (por ejemplo, setuid o setgid), aparecerá una cuarta línea de comentarios que muestra los indicadores establecidos. Entradas de usuarios: RH134-RHEL8.2-es-1-20200928 93 capítulo 4 | Control de acceso a archivos con ACL user::rwx user:consultant3:--user:1005:rwx #effective:rw- Permisos del propietario de archivos. user tiene rwx. Permisos de usuarios nombrados. Una entrada para cada usuario nombrado asociado con este archivo. consultant3 no tiene permisos. Permisos de usuarios nombrados. El UID 1005 tiene rwx, pero la máscara limita los permisos efectivos a rw solamente. Entradas de grupos: group::rwx #effective:rwgroup:consultant1:r-group:2210:rwx #effective:rw- Permisos de propietario de grupo. operators tiene rwx, pero la máscara limita los permisos efectivos a rw solamente. Permisos de grupos nombrados. Una entrada para cada grupo nombrado asociado con este archivo. consultant1 tiene r solamente. Permisos de grupos nombrados. El GID 2210 tiene rwx, pero la máscara limita los permisos efectivos a rw solamente. Entrada de la máscara: mask::rw- La configuración de la máscara muestra los máximos permisos posibles para todos los usuarios nombrados, el propietario del grupo y los grupos nombrados. El UID 1005, operators y el GID 2210 no pueden ejecutar este archivo, aunque cada entrada tenga establecido el permiso de ejecución. Otra entrada: other::--- Otro permiso o permisos "globales". Todos los demás UID y GID NO tienen permisos. Visualización de ACL de directorios Para visualizar la configuración de ACL en un directorio, use el comando getfacl directory: [user@host content]$ getfacl . # file: . # owner: user # group: operators # flags: -suser::rwx user:consultant3:--user:1005:rwx group::rwx group:consultant1:r-x group:2210:rwx 94 RH134-RHEL8.2-es-1-20200928 capítulo 4 | Control de acceso a archivos con ACL mask::rwx other::--default:user::rwx default:user:consultant3:--default:group::rwx default:group:consultant1:r-x default:mask::rwx default:other::--- Repase cada sección del ejemplo anterior: Abrir entradas de comentarios: # file: . # owner: user # group: operators # flags: -s- Las primeras tres líneas son comentarios que identifican el nombre del directorio, el propietario (user) y el propietario del grupo (operators). Si hay indicadores de directorio adicionales (setuid, setgid, sticky), una cuarta línea de comentario mostrará los indicadores establecidos (en este caso, setgid). Entradas de ACL estándares: user::rwx user:consultant3:--user:1005:rwx group::rwx group:consultant1:r-x group:2210:rwx mask::rwx other::--- Los permisos de ACL en este directorio son los mismos que los del archivo del ejemplo anterior, pero se aplican al directorio. La diferencia clave es la inclusión del permiso de ejecución en estas entradas (cuando corresponda) para habilitar el permiso de búsqueda del directorio. Entradas del usuario predeterminadas: default:user::rwx default:user:consultant3:--- Permisos de ACL del propietario del archivos predeterminados. El propietario del archivo obtendrá rwx, lectura/escritura en archivos nuevos y ejecución en subdirectorios nuevos. Permisos de ACL de usuarios nombrados predeterminados. Una entrada para cada usuario nombrado al que se aplicará automáticamente la ACL predeterminada a los archivos o subdirectorios nuevos. De manera predeterminada, consultant3 no tendrá permisos. Entradas del grupo predeterminadas: default:group::rwx default:group:consultant1:r-x RH134-RHEL8.2-es-1-20200928 95 capítulo 4 | Control de acceso a archivos con ACL Permisos de ACL predeterminados del propietario del grupo El propietario del grupo de archivos obtendrá rwx, lectura/escritura en archivos nuevos y ejecución en subdirectorios nuevos. Permisos de ACL del grupo nombrado predeterminados. Una entrada para cada grupo nombrado que obtendrá automáticamente la ACL predeterminada. consultant1 obtendrá rx, solo lectura en archivos nuevos y ejecución en subdirectorios nuevos. Entrada de la máscara ACL predeterminada: default:mask::rwx La configuración de máscara predeterminada muestra los permisos máximos iniciales posibles para todos los archivos y directorios nuevos creados que tienen ACL de usuarios nombrados, ACL del propietario del grupo o ACL de grupos nombrados: lectura y escritura para archivos nuevos y permiso de ejecución en subdirectorios nuevos. Los archivos nuevos nunca obtienen permiso de ejecución. Entrada de otro predeterminada: default:other::--- Permisos "globales" o de otro predeterminados. Todos los demás UID y GID no tienen permisos para archivos nuevos o subdirectorios nuevos. Las entradas predeterminadas del ejemplo anterior no incluyen el usuario nombrado (UID 1005) ni el grupo nombrado (GID 2210); consecuentemente, no obtendrán entradas de ACL iniciales automáticamente agregadas para estas a ningún archivo nuevo o subdirectorio nuevo. Esto las limita de manera efectiva a archivos y subdirectorios que ya tienen ACL, o si el propietario del archivo relevante agrega la ACL más tarde usando setfacl. Aún pueden crear sus propios archivos y subdirectorios. nota La salida del comando getfacl se puede usar como entrada para setfacl a fin de restaurar las ACL, o para copiar las ACL de un archivo o directorio de origen y guardarlas en un archivo nuevo. Por ejemplo, para restaurar las ACL desde una copia de seguridad, use getfacl -R /dir1 > file1 para generar un archivo recursivo de volcado de salida de ACL para el directorio y su contenido. A continuación, esta salida se puede usar para la recuperación de las ACL originales al pasar la salida guardada como entrada al comando setfacl. Por ejemplo, para realizar una actualización masiva del mismo directorio en la ruta actual, use el siguiente comando: setfacl --set-file=file1 La máscara ACL La máscara de ACL define los permisos máximos que se pueden otorgar a usuarios nombrados, el propietario del grupo y los grupos nombrados. No restringe los permisos del usuario propietario del archivo ni otro. Todos los archivos y directorios que implementan ACL tendrán una máscara de ACL. La máscara se puede visualizar con getfacl y establecer explícitamente con setfacl. Se calculará y se agregará automáticamente si no se la establece de forma explícita, pero también podría heredarse de una configuración de máscara predeterminada de un directorio principal. De 96 RH134-RHEL8.2-es-1-20200928 capítulo 4 | Control de acceso a archivos con ACL forma predeterminada, la máscara se calcula nuevamente siempre que se agregue, se modifique o se elimine cualquiera de las ACL afectadas. Precedencia de permisos de ACL Al determinar si un proceso (un programa en ejecución) puede acceder a un archivo, los permisos del archivo y las ACL se aplican de la siguiente manera: • Si el proceso se ejecuta como el usuario que es propietario del archivo, se aplican los permisos de ACL del usuario del archivo. • Si el proceso se ejecuta como un usuario que está detallado en una entrada de ACL del usuario, se aplican los permisos de ACL de usuario nombrado (siempre que esté permitido por la máscara). • Si el proceso se ejecuta como grupo que coincide con el propietario del grupo del archivo, o como un grupo con una entrada de ACL de grupos nombrados explícitamente, se aplican los permisos de ACL que coinciden (siempre que esté permitido por la máscara). • De lo contrario, se aplican los otros permisos de ACL del archivo. Ejemplos de uso de ACL por el sistema operativo Red Hat Enterprise Linux tiene ejemplos que demuestran el uso típico de ACL para los requisitos de permisos ampliados. ACL en archivos de diario (journal) de Systemd systemd-journald usa entradas de ACL para permitir el acceso de lectura al archivo / run/log/journal/cb44...8ae2/system.journal a los grupos adm y wheel. Esta ACL permite que los miembros de los grupos adm y wheel tengan acceso de lectura a los registros administrados por journalctl sin tener la necesidad de dar permisos especiales al contenido privilegiado dentro de /var/log/, como messages, secure o audit. Debido a la configuración de systemd-journald, la carpeta principal del archivo system.journal puede cambiar, pero systemd-journald aplica ACL a la nueva carpeta y al archivo automáticamente. nota Los administradores del sistema deben establecer una ACL en la carpeta / var/log/journal/ cuando systemd-journald está configurado para usar almacenamiento persistente. [user@host ]$ getfacl /run/log/journal/cb44...8ae2/system.journal getfacl: Removing leading '/' from absolute path names # file: run/log/journal/cb44...8ae2/system.journal # owner: root # group: systemd-journal user::rwgroup::r-group:adm:r-group:wheel:r-mask::r-other::--- RH134-RHEL8.2-es-1-20200928 97 capítulo 4 | Control de acceso a archivos con ACL ACL en dispositivos administrados por Systemd systemd-udev usa un conjunto de reglas de udev que permiten el uso de la etiqueta uaccess en algunos dispositivos, como reproductores o grabadoras de CD/DVD, dispositivos de almacenamiento USB, tarjetas de sonido y muchos otros. Las reglas de udev mencionadas anteriormente establecen las ACL en esos dispositivos para permitir que los usuarios que hayan iniciado sesión en una interfaz gráfica de usuario (por ejemplo gdm) tengan control total de esos dispositivos. Las ACL permanecerán activas hasta que el usuario cierre la sesión de la GUI. Al siguiente usuario que inicie sesión en la GUI se le aplicará una nueva ACL para los dispositivos requeridos. En el siguiente ejemplo, puede ver que user tiene una entrada de ACL con permisos rw aplicados al dispositivo /dev/sr0 que es una unidad de CD/DVD. [user@host ]$ getfacl /dev/sr0 getfacl: Removing leading '/' from absolute path names # file: dev/sr0 # owner: root # group: cdrom user::rwuser:group:rwgroup::rwmask::rwother::--- Referencias Páginas del manual: acl(5), getfacl(1), journald.conf(5), ls(1), systemdjournald(8) y systemd-udevd(8) 98 RH134-RHEL8.2-es-1-20200928 capítulo 4 | Control de acceso a archivos con ACL Cuestionario Interpretación de ACL de archivos Establezca una coincidencia entre los siguientes elementos y sus equivalentes de la tabla. Archivo g::rw Archivo user::rx Archivo user:mary:rx default:m::rx /directory default:user:mary:rx /directory g::rw /directory getfacl /directory group:hug:rwx /directory Descripción Operación de ACL Visualizar la ACL en un directorio. Usuario nombrado con permisos de lectura y ejecución para un archivo. Propietario del archivo con permisos de lectura y ejecución para un archivo. Permisos de lectura y escritura para un directorio otorgados al propietario del grupo del directorio. Permisos de lectura y escritura para un archivo otorgados al propietario del grupo del archivo. Permisos de lectura, escritura y ejecución para un directorio otorgados a un grupo nombrado. Permisos de lectura y ejecución establecidos como la máscara predeterminada. Permiso de lectura inicial otorgado a usuario nombrado para archivos nuevos y permisos de lectura y ejecución para subdirectorios nuevos. RH134-RHEL8.2-es-1-20200928 99 capítulo 4 | Control de acceso a archivos con ACL Solución Interpretación de ACL de archivos Establezca una coincidencia entre los siguientes elementos y sus equivalentes de la tabla. Descripción Operación de ACL Visualizar la ACL en un directorio. getfacl /directory Usuario nombrado con permisos de lectura y ejecución para un archivo. Archivo user:mary:rx Propietario del archivo con permisos de lectura y ejecución para un archivo. Archivo user::rx Permisos de lectura y escritura para un directorio otorgados al propietario del grupo del directorio. g::rw /directory Permisos de lectura y escritura para un archivo otorgados al propietario del grupo del archivo. Archivo g::rw Permisos de lectura, escritura y ejecución para un directorio otorgados a un grupo nombrado. group:hug:rwx /directory Permisos de lectura y ejecución establecidos como la máscara predeterminada. default:m::rx /directory Permiso de lectura inicial otorgado a usuario nombrado para archivos nuevos y permisos de lectura y ejecución para subdirectorios nuevos. default:user:mary:rx /directory 100 RH134-RHEL8.2-es-1-20200928 capítulo 4 | Control de acceso a archivos con ACL Protección de archivos con ACL Objetivos Tras finalizar esta sección, usted deberá ser capaz de realizar lo siguiente: • Cambiar permisos de archivos de ACL regulares usando setfacl. • Controlar permisos de archivos de ACL predeterminados para archivos y directorios nuevos. Cambio de permisos de archivos de ACL Use setfacl para agregar, modificar o eliminar ACL en archivos y directorios. Las ACL usan la representación de permisos de sistema de archivos normal, "r" para permiso de lectura, "w" para permiso de escritura y "x" para permiso de ejecución. Un "-" (guión) indica que el permiso relevante está ausente. Cuando (recursivamente) se configuran ACL, se puede usar una "X" mayúscula para indicar que el permiso de ejecución solo se debe establecer en directorios y no en archivos regulares, a menos que el archivo ya tenga el permiso de ejecución relevante. Este es el mismo comportamiento de chmod. Adición o modificación de ACL Las ACL se pueden establecer a través de la línea de comandos usando la opción -m, o se pueden especificar a través de un archivo usando la opción -M (use "-" [guión]) en lugar de un nombre de archivo para stdin). Estas dos opciones son las opciones "modificar"; agregan entradas de ACL nuevas o reemplazan entradas de ACL existentes específicas en un archivo o directorio. Las demás entradas de ACL existentes en el archivo o el directorio permanecen intactas. nota Use las opciones --set o --set-file para reemplazar completamente la configuración de ACL en un archivo. Cuando se define por primera vez una ACL en un archivo, si la operación de adición no incluye configuración para permisos del propietario del archivo, el propietario del grupo u otros, se establecerán en función de los permisos de archivos estándares actuales (estas también son conocidas como entradas de ACL de base y no se pueden eliminar), y, asimismo, se calculará y se agregará un nuevo valor de máscara. Para agregar o modificar una ACL de usuario o usuario nombrado: [user@host ~]$ setfacl -m u:name:rX file Si name se deja en blanco, se aplica al propietario del archivo; de lo contrario, name puede ser un nombre de usuario o un valor de UID. En este ejemplo, los permisos otorgados serían de solo lectura y, si ya están establecidos, de ejecución (a menos que file fuera un directorio, en cuyo caso el directorio obtendría el permiso de ejecución establecido para permitir la búsqueda en el directorio). RH134-RHEL8.2-es-1-20200928 101 capítulo 4 | Control de acceso a archivos con ACL Los permisos del propietario del archivo de ACL y el propietario del archivo estándar son equivalentes; por consiguiente, el uso de chmod en los permisos del propietario del archivo es equivalente a usar setfacl en los permisos del propietario del archivo. chmod no tiene efecto sobre los usuarios nombrados. Para agregar o modificar una ACL de grupo o grupo nombrado: [user@host ~]$ setfacl -m g:name:rw file Esto sigue el mismo patrón para agregar o modificar una entrada de ACL de usuario. Si name se deja en blanco, se aplica al propietario del grupo. De lo contrario, especifique un nombre de grupo o un valor de GID para un grupo nombrado. Los permisos serían de lectura y escritura en este ejemplo. chmod no tiene efecto en permisos de ningún grupo para archivos con configuraciones de ACL, pero actualiza la máscara de ACL. Para agregar o modificar la ACL de otro: [user@host ~]$ setfacl -m o::- file otro solo acepta configuración de permisos. Estas son las configuraciones típicas de permisos para otros: sin permisos, configurado con un guión (-); y permisos de solo lectura, configurados como de costumbre con r. Por supuesto, puede establecer cualquiera de los permisos estándares. Los permisos de otro de ACL y otro estándar son equivalentes; por consiguiente, el uso de chmod en los permisos de otro es equivalente a usar setfacl en los permisos de otro. Puede agregar varias entradas con el mismo comando; use una lista de entradas separadas por coma: [user@host ~]$ setfacl -m u::rwx,g:consultants:rX,o::- file Esto establece permisos de lectura, escritura y ejecución para el propietario del archivo, establece al grupo nombrado consultants en solo lectura y ejecución condicional, y restringe a todos los usuarios other a ningún permiso. El propietario del grupo mantiene sus permisos de ACL o de archivo existentes y las otras entradas "nombradas" permanecen iguales. Uso de getfacl como entrada La salida de getfacl se puede usar como entrada para setfacl: [user@host ~]$ getfacl file-A | setfacl --set-file=- file-B La opción --set-file acepta la entrada de un archivo o de stdin. El carácter de guión (-) especifica el uso de stdin. En este caso, file-B tendrá la misma configuración de ACL que file-A. Configuración de una máscara de ACL explícita Puede configurar una máscara de ACL de forma explícita en un archivo o directorio para limitar los permisos efectivos máximos para usuarios nombrados, el propietario del grupo y los grupos nombrados. Esto restringe los permisos existentes que superen la máscara, pero no afecta los permisos que son menos permisivos que la máscara. 102 RH134-RHEL8.2-es-1-20200928 capítulo 4 | Control de acceso a archivos con ACL [user@host ~]$ setfacl -m m::r file Esto agrega un valor de máscara que restringe a cualquiera de los usuarios nombrados, el propietario del grupo y cualquiera de los grupos nombrados a permiso de solo lectura, independientemente de su configuración existente. Los usuarios propietario del archivo y otro no se ven afectados por la configuración de la máscara. getfacl muestra un comentario "efectivo" además de entradas que son restringidas por una configuración de máscara. Importante De forma predeterminada, cada vez que una de las configuraciones de ACL afectadas (usuarios nombrados, propietario del grupo o grupos nombrados) se modifica o elimina, la máscara de ACL se vuelve a calcular y potencialmente se restablece una configuración de máscara explícita anterior. Para evitar calcular nuevamente la máscara, use la opción -n o incluya una configuración de máscara (-m m::perms) con cualquier operación setfacl que modifique la configuración de ACL afectada de la máscara. Modificaciones de ACL recursivas Al configurar una ACL en un directorio, use la opción -R para aplicar la ACL de forma recursiva. Recuerde que es probable que quiera usar el permiso "X" (x mayúscula) con recursión, de modo que los archivos con permiso de ejecución establecido retienen la configuración y los directorios obtienen el permiso de ejecución establecido para permitir la búsqueda de directorios. También se considera práctica recomendada usar la "X" mayúscula cuando se configuran ACL de manera no recursiva, dado que esto evita que los administradores agreguen de forma accidental permisos de ejecución a un archivo normal. [user@host ~]$ setfacl -R -m u:name:rX directory Esto agrega el usuario name al directorio directory y todos los archivos y subdirectorios existentes, con permisos de solo lectura y ejecución condicional. Eliminación de ACL La eliminación de entradas de ACL específicas sigue el mismo formato básico que la operación de modificar, excepto que ":perms" no se especifica. [user@host ~]$ setfacl -x u:name,g:name file Esto solo elimina al usuario nombrado y al grupo nombrado de la ACL de archivos o directorios. El resto de las entradas de ACL existentes permanecen activas. Puede incluir las operaciones de eliminación (-x) y modificación (-m) en la misma operación setfacl. La máscara solo puede eliminarse si no hay otras ACL establecidas (excluidas las ACL base que no se pueden eliminar), de modo que debe eliminarse última. El archivo ya no tendrá ACL y ls -l no mostrará el símbolo más (+) junto a la cadena de permisos. De forma alternativa, para eliminar RH134-RHEL8.2-es-1-20200928 103 capítulo 4 | Control de acceso a archivos con ACL todas las entradas de ACL de un archivo o directorio (incluidas las ACL predeterminadas en los directorios), use el siguiente comando: [user@host ~]$ setfacl -b file Control de permisos de archivos de ACL predeterminadas Para asegurarse de que los archivos y directorios creados dentro de un directorio hereden ciertas ACL, use la ACL predeterminada en un directorio. Puede configurar una ACL predeterminada y cualquiera de las configuraciones de ACL estándares, incluida una máscara predeterminada. El directorio en sí aún requiere ACL estándares para el control de acceso porque las ACL predeterminadas no implementan control de acceso para el directorio; solo proporcionan soporte de herencia para permisos de ACL. Por ejemplo: [user@host ~]$ setfacl -m d:u:name:rx directory Esto agrega un usuario nombrado predeterminados (d:u:name) con permiso de solo lectura y ejecución en subdirectorios. El comando setfacl para agregar una ACL predeterminada para cada uno de los tipos de ACL es exactamente el mismo que para las ACL estándares, pero incluye d: delante. De forma alternativa, use la opción -d en la línea de comandos. Importante Al configurar las ACL predeterminadas en un directorio, asegúrese de que los usuarios podrán acceder al contenido de los subdirectorios nuevos creados en este, al incluir el permiso de ejecución en la ACL predeterminada. Los usuarios no recibirán automáticamente el permiso de ejecución establecido en los archivos regulares creados recientemente, ya que, a diferencia de los directorios nuevos, la máscara de ACL de un archivo regular nuevo es rw-. nota Los archivos y subdirectorios nuevos continúan obteniendo los valores de UID de su propietario y de GID del grupo primario establecidos a partir del usuario creador, excepto cuando la marca setgid del directorio principal está habilitada, en cuyo caso el GID del grupo primario es el mismo que el GID del directorio principal. Eliminación de entradas de ACL predeterminadas Puede eliminar una ACL predeterminada de la misma manera que elimina una ACL estándar; se agrega d: adelante o se usa la opción -d. [user@host ~]$ setfacl -x d:u:name directory Esto elimina la entrada de ACL predeterminada que se agregó en el ejemplo anterior. 104 RH134-RHEL8.2-es-1-20200928 capítulo 4 | Control de acceso a archivos con ACL Para eliminar todas las entradas de ACL predeterminadas en un directorio, use setfacl -k directory. Referencias Páginas del manual: acl(5), setfacl(1), getfacl(1) RH134-RHEL8.2-es-1-20200928 105 capítulo 4 | Control de acceso a archivos con ACL Ejercicio Guiado Protección de archivos con ACL En este ejercicio, usará las entradas de ACL para otorgar acceso a un directorio para un grupo y negar el acceso a un usuario, establecer la ACL predeterminada en un directorio y confirmar que los nuevos archivos creados en ese directorio heredan la ACL predeterminada. Resultados Usted deberá ser capaz de realizar lo siguiente: • Use las entradas de ACL para otorgar acceso a un grupo y denegar el acceso a uno de sus miembros. • Verifique que los archivos y directorios existentes reflejen los nuevos permisos de ACL. • Establezca la ACL predeterminada en un directorio y confirme que los archivos y directorios nuevos heredan su configuración. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab acl-secure start. Este comando ejecuta un script de inicio que determina si la máquina servera es accesible en la red. También crea los usuarios, grupos, directorios y archivos usados en este ejercicio. [student@workstation ~]$ lab acl-secure start Los operadores y consultores son miembros de una empresa de soporte de TI. Necesitan empezar a compartir información. servera contiene un directorio compartido configurado correctamente ubicado en /shares/content que aloja archivos. Actualmente, solo los miembros del grupo operators tienen acceso a este directorio, pero los miembros del grupo consultants necesitan acceso completo a este directorio. El usuario consultant1 es miembro del grupo consultants, pero ha causado problemas en muchas ocasiones, por lo que este usuario no debería tener acceso al directorio. Su trabajo es agregar entradas de ACL adecuadas al directorio y su contenido, de modo que los miembros del grupo consultants tengan acceso completo, pero negar todo tipo de acceso al usuario consultant1. Asegúrese de que a los archivos y directorios futuros almacenados en / shares/content se le apliquen las entradas de ACL adecuadas. Información importante: • Los usuarios sysadmin1 y operator1 son miembros del grupo operators. • Los usuarios consultant1 y consultant2 son miembros del grupo consultants. • El directorio /shares/content contiene un subdirectorio llamado server-info y varios archivos para evaluar la ACL. Además, el directorio /shares/content contiene un script ejecutable llamado loadvg.sh que puede usar para la prueba. 106 RH134-RHEL8.2-es-1-20200928 capítulo 4 | Control de acceso a archivos con ACL • Los usuarios sysadmin1, operator1, consultant1 y consultant2 tienen sus contraseñas configuradas en redhat. • Todos los cambios deben ocurrir en el directorio /shares/content y sus archivos; no ajuste el directorio /shares. 1. Inicie sesión en servera y cambie al usuario root. 1.1. Use el comando ssh para iniciar sesión en servera como el usuario student. Los sistemas se configuran para que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 1.2. Use el comando sudo -i para cambiar al usuario root. La contraseña del usuario student es student. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 2. Agregue la ACL nombrada al directorio /shares/content y todo su contenido. 2.1. Use setfacl para actualizar recursivamente el directorio /shares/content, lo que otorga permisos de lectura, escritura y ejecución condicional al grupo consultants. [root@servera ~]# setfacl -Rm g:consultants:rwX /shares/content La opción -R significa recursivo, la opción -m significa modificar/agregar, rwX significa aplicar permisos de lectura, escritura y ejecución condicional. 2.2. Use setfacl para actualizar recursivamente el directorio /shares/content, denegar al usuario consultant1 del grupo consultants todo tipo de acceso. [root@servera ~]# setfacl -Rm u:consultant1:- /shares/content La opción -R significa recursivo, la opción -m significa modificar/agregar, - significa no dar acceso. 3. Agregue la ACL nombrada como ACL predeterminada para admitir futuras adiciones de archivos y directorios. 3.1. Use setfacl para agregar una regla de acceso predeterminada para el grupo consultants. Otorgue permisos de lectura, escritura y ejecución en el directorio content. [root@servera ~]# setfacl -m d:g:consultants:rwx /shares/content La opción -m significa modificar/agregar, d:g significa grupo predeterminado, :rwx significa permisos de lectura/escritura/ejecución (necesario para la creación y el acceso adecuados a subdirectorio) RH134-RHEL8.2-es-1-20200928 107 capítulo 4 | Control de acceso a archivos con ACL 3.2. Use setfacl para agregar una regla de acceso predeterminada para el usuario consultant1. Niegue todo acceso al directorio content. [root@servera ~]# setfacl -m d:u:consultant1:- /shares/content La opción -m significa modificar/agregar, d:u significa usuario predeterminado, significa que no hay permisos. 4. Verifique sus cambios en ACL. consultant2 debe ser capaz de leer cualquier archivo y crear un directorio nuevo con un nuevo archivo en este. consultant1 no debe ser capaz de leer, escribir ni ejecutar ningún archivo; esto incluye no poder enumerar el contenido del directorio. Use su - user para cambiar a usuarios de prueba. Use exit o Ctrl+D para salir de la shell de usuarios de prueba. [root@servera ~]# exit [student@servera ~]$ su - consultant2 Password: redhat [consultant2@servera ~]$ cd /shares/content/ 4.1. Use cat para comprobar que consultant2 pueda leer un archivo. [consultant2@servera content]$ cat serverb-loadavg.txt ################################################# serverb.lab.example.com ################################################# Wed Mar 25 15:25:19 EDT 2019 ################################################# ldavg 0.18, 0.06, 0.05 ################################################# 4.2. Use el script loadavg.sh para comprobar que consultant2 pueda ejecutar un archivo. [consultant2@servera content]$ ./loadavg.sh ldavg 0.00, 0.00, 0.04 4.3. Cree un directorio denominado reports. Use echo para crear un archivo con cierto contenido, nombre el archivo test.txt y colóquelo en el directorio nuevo. Cambie nuevamente a student cuando haya finalizado. [consultant2@servera content]$ mkdir reports [consultant2@servera content]$ echo "TEST REPORT" > reports/test.txt [consultant2@servera content]$ exit logout [student@servera ~]$ 108 RH134-RHEL8.2-es-1-20200928 capítulo 4 | Control de acceso a archivos con ACL 4.4. Inicie sesión como el usuario consultant1. Use cd para tratar de cambiar de directorio como consultant1 y también pruebe ls para detallar el directorio. Ambos comandos deben fallar con permiso denegado. Pruebe uno o más de los comandos que usó consultant2, pero como consultant1, para verificar aún más la falta de acceso. Use la ruta completa, / shares/content, porque no puede usar cd para cambiar al directorio. Cambie nuevamente a student cuando haya terminado de probar consultant1. [student@servera ~]$ su - consultant1 Password: redhat [consultant1@servera ~]$ cd /shares/content/ -bash: cd: /shares/content/: Permission denied [consultant1@servera ~]$ ls /shares/content/ ls: cannot open directory '/shares/content/': Permission denied [consultant1@servera ~]$ cat /shares/content/serverb-loadavg.txt cat: /shares/content/serverb-loadavg.txt: Permission denied [consultant1@servera ~]$ exit logout [student@servera ~]$ 4.5. Inicie sesión como el usuario sysadmin1. Use getfacl para ver todas las entradas de ACL en /shares/content y las entradas de ACL en /shares/content/ reports. Cambie nuevamente a student cuando haya terminado de probar consultant1. [student@servera ~]$ su - sysadmin1 Password: redhat [sysadmin1@servera ~]$ getfacl /shares/content getfacl: Removing leading '/' from absolute path names # file: shares/content/ # owner: root # group: operators # flags: -suser::rwx user:consultant1:--group::rwx group:consultants:rwx mask::rwx other::--default:user::rwx default:user:consultant1:--default:group::rwx default:group:consultants:rwx default:mask::rwx default:other::--[sysadmin1@servera ~]$ getfacl /shares/content/reports getfacl: Removing leading '/' from absolute path names # file: shares/content/reports # owner: consultant2 # group: operators # flags: -suser::rwx RH134-RHEL8.2-es-1-20200928 109 capítulo 4 | Control de acceso a archivos con ACL user:consultant1:--group::rwx group:consultants:rwx mask::rwx other::--default:user::rwx default:user:consultant1:--default:group::rwx default:group:consultants:rwx default:mask::rwx default:other::--[sysadmin1@servera ~]$ exit logout [student@servera ~]$ 4.6. Cierre sesión en servera. [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute el script lab acl-secure finish para terminar este ejercicio. [student@workstation ~]$ lab acl-secure finish Esto concluye el ejercicio guiado. 110 RH134-RHEL8.2-es-1-20200928 capítulo 4 | Control de acceso a archivos con ACL Trabajo de laboratorio Control de acceso a archivos con ACL Lista de verificación de rendimiento En esta práctica de laboratorio, configurará un directorio de colaboración para usuarios de dos grupos, combinando el permiso set-GID y las entradas de ACL predeterminadas para proporcionar permisos de acceso correctos. Resultados Usted deberá ser capaz de realizar lo siguiente: • Configure el permiso set-GID en una carpeta, para que se herede la propiedad del grupo en los archivos y las carpetas que tiene dentro. • Configure las entradas de ACL para permitir o denegar los permisos de lectura, escritura o ejecución para usuarios y grupos en archivos y directorios. • Configure la ACL predeterminada para obtener los permisos correctos de ACL y archivos automáticamente en los nuevos archivos y directorios. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab acl-review start. Este comando ejecuta un script de inicio que determina si la máquina serverb es accesible en la red. También crea los usuarios, grupos, directorios y archivos usados en este ejercicio. [student@workstation ~]$ lab acl-review start Una agencia de finanzas e inversiones está configurando un directorio compartido de colaboración para contener archivos de casos, para los cuales los miembros del grupo managers (gerentes) tendrán permisos de lectura y escritura. El cofundador de la agencia, manager1, ha decidido que los miembros del grupo contractors (contratistas) también deben ser capaces de leer y escribir en el directorio compartido. Sin embargo, manager1 no confía en el usuario contractor3 (un miembro del grupo contractors); por ello, el acceso de contractor3 al directorio debe restringirse a solo lectura. manager1 ha creado los usuarios y grupos; además, ha iniciado el proceso de configuración del directorio compartido copiando algunos archivos de plantillas. Como manager1 ha estado demasiado ocupado, le corresponde a usted terminar el trabajo. Su tarea es completar la configuración del directorio compartido. El directorio y todo su contenido deben ser propiedad del grupo managers, y los archivos se deben actualizar para lectura y escritura para el propietario y el grupo (managers). Los otros usuarios no deben tener permisos. También debe proporcionar permisos de lectura y escritura para el grupo contractors, con la excepción de contractor3, quien solo obtiene permisos de lectura. Asegúrese de que su configuración se aplique a archivos existentes y futuros. RH134-RHEL8.2-es-1-20200928 111 capítulo 4 | Control de acceso a archivos con ACL Información importante: • Directorio compartido: /shares/cases en serverb. • Los usuarios manager1 y manager2 son miembros del grupo managers. • Los usuarios contractor1 , contractor2 y contractor3 son miembros del grupo contractors. • Existen dos archivos en el directorio: shortlist.txt y backlog.txt. • Las cinco contraseñas de usuario son redhat. • Todos los cambios deben ocurrir en el directorio /shares/cases y sus archivos; no ajuste el directorio /shares. 1. El directorio cases y su contenido deben pertenecer al grupo managers. Los nuevos archivos agregados en el directorio cases deben pertenecer automáticamente al grupo managers. Los usuarios y grupos propietarios de los archivos existentes deben tener permisos de lectura y escritura; los otros usuarios no deben tener ningún permiso. nota Pista: no use setfacl. 2. Agregue entradas de ACL al directorio cases (y su contenido) que permitan que los miembros del grupo contractors tengan acceso de lectura/escritura a los archivos y permiso de ejecución en el directorio. Restrinja al usuario contractor3 a acceso de lectura a los archivos y permiso de ejecución en el directorio. 3. Agregue entradas de ACL que aseguren que todos los archivos o directorios nuevos del directorio cases tengan los permisos correctos aplicados para todos los grupos y usuarios autorizados. 4. Verifique que haya hecho los cambios en el sistema de archivos y ACL correctamente. Use ls y getfacl para revisar su configuración en /shares/cases. Como el usuario student, use su - user para cambiar primero a manager1 y, luego, a contractor1. Verifique que puede escribir en un archivo, leer desde un archivo, hacer un directorio y escribir en un archivo en el directorio nuevo. Use ls para comprobar los permisos del directorio nuevo y getfacl para revisar las ACL del directorio nuevo. Como el usuario student, use su - contractor3 para cambiar de usuario. Intente escribir en un archivo (debería fallar) e intente hacer un directorio nuevo (debería fallar). Como el usuario contractor3, debe poder leer desde el archivo shortlist.txt en el directorio cases y leer desde los archivos de "prueba" escritos en cualquiera de los directorios nuevos creados por los usuarios manager1 y contractor1. nota El conjunto de pruebas anteriores son algunas de las pruebas que podría realizar para comprobar que los permisos de acceso sean correctos. Debe idear pruebas de validación de acceso adecuadas para su entorno. Evaluación En workstation, ejecute el comando lab acl-review grade para confirmar que ha realizado correctamente este ejercicio. 112 RH134-RHEL8.2-es-1-20200928 capítulo 4 | Control de acceso a archivos con ACL [student@workstation ~]$ lab acl-review grade Finalizar En workstation, ejecute el comando lab acl-review finish para terminar este ejercicio. [student@workstation ~]$ lab acl-review finish Esto concluye el trabajo de laboratorio. RH134-RHEL8.2-es-1-20200928 113 capítulo 4 | Control de acceso a archivos con ACL Solución Control de acceso a archivos con ACL Lista de verificación de rendimiento En esta práctica de laboratorio, configurará un directorio de colaboración para usuarios de dos grupos, combinando el permiso set-GID y las entradas de ACL predeterminadas para proporcionar permisos de acceso correctos. Resultados Usted deberá ser capaz de realizar lo siguiente: • Configure el permiso set-GID en una carpeta, para que se herede la propiedad del grupo en los archivos y las carpetas que tiene dentro. • Configure las entradas de ACL para permitir o denegar los permisos de lectura, escritura o ejecución para usuarios y grupos en archivos y directorios. • Configure la ACL predeterminada para obtener los permisos correctos de ACL y archivos automáticamente en los nuevos archivos y directorios. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab acl-review start. Este comando ejecuta un script de inicio que determina si la máquina serverb es accesible en la red. También crea los usuarios, grupos, directorios y archivos usados en este ejercicio. [student@workstation ~]$ lab acl-review start Una agencia de finanzas e inversiones está configurando un directorio compartido de colaboración para contener archivos de casos, para los cuales los miembros del grupo managers (gerentes) tendrán permisos de lectura y escritura. El cofundador de la agencia, manager1, ha decidido que los miembros del grupo contractors (contratistas) también deben ser capaces de leer y escribir en el directorio compartido. Sin embargo, manager1 no confía en el usuario contractor3 (un miembro del grupo contractors); por ello, el acceso de contractor3 al directorio debe restringirse a solo lectura. manager1 ha creado los usuarios y grupos; además, ha iniciado el proceso de configuración del directorio compartido copiando algunos archivos de plantillas. Como manager1 ha estado demasiado ocupado, le corresponde a usted terminar el trabajo. Su tarea es completar la configuración del directorio compartido. El directorio y todo su contenido deben ser propiedad del grupo managers, y los archivos se deben actualizar para lectura y escritura para el propietario y el grupo (managers). Los otros usuarios no deben tener permisos. También debe proporcionar permisos de lectura y escritura para el grupo contractors, con la excepción de contractor3, quien solo obtiene permisos de lectura. Asegúrese de que su configuración se aplique a archivos existentes y futuros. 114 RH134-RHEL8.2-es-1-20200928 capítulo 4 | Control de acceso a archivos con ACL Información importante: • Directorio compartido: /shares/cases en serverb. • Los usuarios manager1 y manager2 son miembros del grupo managers. • Los usuarios contractor1 , contractor2 y contractor3 son miembros del grupo contractors. • Existen dos archivos en el directorio: shortlist.txt y backlog.txt. • Las cinco contraseñas de usuario son redhat. • Todos los cambios deben ocurrir en el directorio /shares/cases y sus archivos; no ajuste el directorio /shares. 1. El directorio cases y su contenido deben pertenecer al grupo managers. Los nuevos archivos agregados en el directorio cases deben pertenecer automáticamente al grupo managers. Los usuarios y grupos propietarios de los archivos existentes deben tener permisos de lectura y escritura; los otros usuarios no deben tener ningún permiso. nota Pista: no use setfacl. 1.1. Inicie sesión en serverb como el usuario student. [student@workstation ~]$ ssh student@serverb ...output omitted... [student@serverb ~]$ 1.2. Use el comando sudo -i para cambiar al usuario root. La contraseña del usuario student es student. [student@serverb ~]$ sudo -i [sudo] password for student: student [root@serverb ~]# 1.3. Use el comando chgrp para actualizar recursivamente la propiedad del grupo en el directorio y su contenido. [root@serverb ~]# chgrp -R managers /shares/cases 1.4. Use el comando chmod para actualizar el indicador set-GID en el directorio. [root@serverb ~]# chmod g+s /shares/cases 1.5. Use chmod para actualizar todos los permisos de archivo existentes para rw para el propietario y el grupo. [root@serverb ~]# chmod 660 /shares/cases/* RH134-RHEL8.2-es-1-20200928 115 capítulo 4 | Control de acceso a archivos con ACL Agregue entradas de ACL al directorio cases (y su contenido) que permitan que los miembros del grupo contractors tengan acceso de lectura/escritura a los archivos y permiso de ejecución en el directorio. Restrinja al usuario contractor3 a acceso de lectura a los archivos y permiso de ejecución en el directorio. 2. 2.1. Use setfacl para actualizar recursivamente el directorio cases existente y sus contenidos. Otorgue al grupo contractors permisos de lectura, escritura y ejecución condicional. [root@serverb ~]# setfacl -Rm g:contractors:rwX /shares/cases 2.2. Use setfacl para actualizar recursivamente el directorio cases existente y sus contenidos. Otorgue al usuario contractor3 permisos de lectura y ejecución condicional. [root@serverb ~]# setfacl -Rm u:contractor3:rX /shares/cases 3. Agregue entradas de ACL que aseguren que todos los archivos o directorios nuevos del directorio cases tengan los permisos correctos aplicados para todos los grupos y usuarios autorizados. 3.1. Use setfacl para actualizar los permisos predeterminados para los miembros del grupo contractors. Los permisos predeterminados son de lectura, escritura y ejecución (necesarios para la creación y el acceso adecuados de subdirectorios). [root@serverb ~]# setfacl -m d:g:contractors:rwx /shares/cases 3.2. Use setfacl para actualizar los permisos predeterminados para el usuario contractor3. Los permisos predeterminados son de lectura y ejecución (necesarios para el acceso adecuado a subdirectorios). [root@serverb ~]# setfacl -m d:u:contractor3:rx /shares/cases 4. Verifique que haya hecho los cambios en el sistema de archivos y ACL correctamente. Use ls y getfacl para revisar su configuración en /shares/cases. Como el usuario student, use su - user para cambiar primero a manager1 y, luego, a contractor1. Verifique que puede escribir en un archivo, leer desde un archivo, hacer un directorio y escribir en un archivo en el directorio nuevo. Use ls para comprobar los permisos del directorio nuevo y getfacl para revisar las ACL del directorio nuevo. Como el usuario student, use su - contractor3 para cambiar de usuario. Intente escribir en un archivo (debería fallar) e intente hacer un directorio nuevo (debería fallar). Como el usuario contractor3, debe poder leer desde el archivo shortlist.txt en el directorio cases y leer desde los archivos de "prueba" escritos en cualquiera de los directorios nuevos creados por los usuarios manager1 y contractor1. 4.1. 116 Como el usuario root, use ls para verificar el directorio cases y su contenido. Busque los permisos de propiedad, directorio y archivos. La "s" en los permisos de archivo de grupo indica que el indicador set-GID ya está configurado; el "+" indica que existen entradas de ACL. Al final, salga de la sesión de usuario root. RH134-RHEL8.2-es-1-20200928 capítulo 4 | Control de acceso a archivos con ACL [root@serverb ~]# ls -ld /shares/cases drwxrws---+ 2 root managers 46 Mar 29 00:40 /shares/cases [root@serverb ~]# ls -l /shares/cases total 8 -rw-rw----+ 1 root managers 44 Mar 29 00:33 backlog.txt -rw-rw----+ 1 root managers 46 Mar 29 00:33 shortlist.txt 4.2. Use getfacl y revise su salida. Busque las entradas de usuarios nombrados y grupos nombrados en ACL estándares y predeterminadas. [root@serverb ~]# getfacl /shares/cases # file: shares/cases # owner: root # group: managers # flags: -suser::rwx user:contractor3:r-x group::rwx group:contractors:rwx mask::rwx other::--default:user::rwx default:user:contractor3:r-x default:group::rwx default:group:contractors:rwx default:mask::rwx default:other::--[root@serverb ~]# exit logout 4.3. Cambie al usuario manager1 y realice las siguientes operaciones. Compruebe que obtenga el comportamiento de acceso esperado. [student@serverb ~]$ su - manager1 Password: redhat [manager1@serverb ~]$ cd /shares/cases [manager1@serverb cases]$ echo hello > manager1.txt [manager1@serverb cases]$ cat shortlist.txt ###Shortlist of Clients to call###TEMPLATE### [manager1@serverb cases]$ mkdir manager1.dir [manager1@serverb cases]$ echo hello > manager1.dir/test.txt [manager1@serverb cases]$ ls -ld manager1.dir drwxrws---+ 2 manager1 managers 22 Mar 29 00:59 manager1.dir [manager1@serverb cases]$ ls -l manager1.dir total 4 -rw-rw----+ 1 manager1 managers 6 Mar 29 00:59 test.txt [manager1@serverb cases]$ getfacl manager1.dir # file: manager1.dir/ # owner: manager1 # group: managers # flags: -s- RH134-RHEL8.2-es-1-20200928 117 capítulo 4 | Control de acceso a archivos con ACL user::rwx user:contractor3:r-x group::rwx group:contractors:rwx mask::rwx other::--default:user::rwx default:user:contractor3:r-x default:group::rwx default:group:contractors:rwx default:mask::rwx default:other::--[manager1@serverb cases]$ exit logout 4.4. Cambie al usuario contractor1 y realice las siguientes operaciones. Compruebe que obtenga el comportamiento de acceso esperado. [student@serverb ~]$ su - contractor1 Password: redhat [contractor1@serverb ~]$ cd /shares/cases [contractor1@serverb cases]$ echo hello > manager1.txt [contractor1@serverb cases]$ cat shortlist.txt ###Shortlist of Clients to call###TEMPLATE### [contractor1@serverb cases]$ mkdir contractor1.dir [contractor1@serverb cases]$ echo hello > contractor1.dir/test.txt [contractor1@serverb cases]$ ls -ld contractor1.dir drwxrws---+ 2 contractor1 managers 22 Mar 29 01:05 contractor1.dir [contractor1@serverb cases]$ ls -l contractor1.dir total 4 -rw-rw----+ 1 contractor1 managers 6 Mar 29 01:07 test.txt [manager1@serverb cases]$ getfacl contractor1.dir # file: contractor1.dir/ # owner: contractor1 # group: managers # flags: -suser::rwx user:contractor3:r-x group::rwx group:contractors:rwx mask::rwx other::--default:user::rwx default:user:contractor3:r-x default:group::rwx default:group:contractors:rwx default:mask::rwx default:other::--[contractor1@serverb cases]$ exit logout 118 RH134-RHEL8.2-es-1-20200928 capítulo 4 | Control de acceso a archivos con ACL 4.5. Cambie al usuario contractor3 y realice las siguientes operaciones. Compruebe que obtenga el comportamiento de acceso esperado. [student@serverb ~]# su - contractor3 Password: redhat [contractor3@serverb ~]# cd /shares/cases [contractor3@serverb cases]# echo hello > contractor3.txt -bash: contractor3.txt: Permission denied [contractor3@serverb cases]# cat shortlist.txt ###Shortlist of Clients to call###TEMPLATE### [contractor3@serverb cases]# mkdir contractor3.dir mkdir: cannot create directory ‘contractor3.dir’: Permission denied [contractor3@serverb cases]# cat manager1.dir/test.txt hello [contractor3@serverb cases]# cat contractor1.dir/test.txt hello [contractor3@serverb cases]# exit logout [student@serverb ~]# 4.6. Cierre sesión en serverb [student@serverb ~]# exit logout Connection to serverb closed. [student@workstation ~]$ nota El conjunto de pruebas anteriores son algunas de las pruebas que podría realizar para comprobar que los permisos de acceso sean correctos. Debe idear pruebas de validación de acceso adecuadas para su entorno. Evaluación En workstation, ejecute el comando lab acl-review grade para confirmar que ha realizado correctamente este ejercicio. [student@workstation ~]$ lab acl-review grade Finalizar En workstation, ejecute el comando lab acl-review finish para terminar este ejercicio. [student@workstation ~]$ lab acl-review finish Esto concluye el trabajo de laboratorio. RH134-RHEL8.2-es-1-20200928 119 capítulo 4 | Control de acceso a archivos con ACL Resumen En este capítulo, aprendió lo siguiente: • Las ACL proporcionan control de acceso detallado a archivos y directorios. • Con el comando getfacl, se visualizan las ACL en un archivo o directorio. • El comando setfacl establece, modifica y elimina las ACL predeterminadas y estándares de los archivos y directorios. • Use las ACL predeterminadas para controlar los permisos de archivos y directorios nuevos. • Red Hat Enterprise Linux usa systemd y udev para aplicar ACL predefinidas en dispositivos, carpetas y archivos. 120 RH134-RHEL8.2-es-1-20200928 capítulo 5 Administración de seguridad de SELinux Meta Proteger y administrar la seguridad de un servidor con SELinux. Objetivos • Describir cómo SELinux protege los recursos y cómo seleccionar el modo de cumplimiento. • Configurar el contexto de SELinux de un archivo para controlar la interacción de los procesos con ese archivo. • Configurar los booleanos de SELinux para permitir cambios en la política de tiempo de ejecución para diferentes necesidades de acceso. • Investigar los mensajes de registro de SELinux y solucionar los problemas de denegación de AVC de SELinux. • Cambio del modo de cumplimiento de SELinux (y ejercicio guiado) • Control de contextos de archivo de SELinux (y ejercicio guiado) • Ajuste de la política de SELinux con booleanos (y ejercicio guiado) • Investigación y resolución de problemas de SELinux (y ejercicio guiado) Secciones Trabajo de laboratorio RH134-RHEL8.2-es-1-20200928 Administración de seguridad de SELinux 121 capítulo 5 | Administración de seguridad de SELinux Cambio del modo de cumplimiento de SELinux Objetivos Tras finalizar esta sección, usted deberá ser capaz de realizar lo siguiente: • Explicar la manera en que SELinux protege los recursos. • Modificar el modo actual de SELinux de un sistema. • Configurar el modo predeterminado de SELinux de un sistema Protección de recursos de SELinux SELinux es una característica de seguridad importante de Linux. El acceso a los archivos y otros recursos se controla a un nivel muy granular. Los procesos solo tienen permitido el acceso a los recursos especificados por su política, o bien SELinux parámetros booleanos. Los permisos de archivo controlan qué usuarios o grupos de usuarios pueden acceder a qué archivos específicos. Sin embargo, un usuario con acceso de lectura o escritura a cualquier archivo específico puede usar ese archivo de cualquier manera que el usuario elija, incluso si ese uso no es la forma en que se debe usar el archivo. Por ejemplo, con acceso de escritura a un archivo, ¿un archivo de datos estructurados, diseñado para escribirse y usar un único programa, debería poder ser abierto y modificado por otros editores que podrían resultar en daños? Los permisos de archivo no pueden detener este acceso no deseado. No fueron diseñados para controlar cómo se usa un archivo, sino solo quién tiene permiso para leer, escribir o ejecutar un archivo. SELinux consiste en conjuntos de políticas, definidas por los desarrolladores de la aplicación, que declaran exactamente qué acciones y accesos son adecuados y permitidos para cada ejecutable binario, archivo de configuración y archivo de datos usados por una aplicación. Esto se conoce como política dirigida porque se escribe una política para cubrir las actividades de una sola aplicación. Las políticas declaran etiquetas predefinidas que se colocan en programas, archivos y puertos de red individuales. ¿Por qué usar Security Enhanced Linux? No todos los problemas de seguridad se pueden predecir de antemano. SELinux aplica un conjunto de reglas de acceso que impiden que una debilidad en una aplicación afecte a otras aplicaciones o al sistema subyacente. SELinux proporciona una capa adicional de seguridad; también agrega una capa de complejidad que puede ser desalentadora para las personas que recién empiezan a usar este subsistema. Aprender a trabajar con SELinux puede llevar tiempo, pero la política de cumplimiento significa que una debilidad en una parte del sistema no se extiende a otras partes. Si SELinux funciona mal con un subsistema en particular, puede desactivar la aplicación para ese servicio específico hasta que encuentre una solución al problema subyacente. SELinux tiene tres modos: 122 RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux • Enforcing (Cumplimiento): SELinux hace cumplir las reglas de control de acceso. Las computadoras generalmente se ejecutan en este modo. • Permissive (Permisivo): SELinux está activo, pero en lugar de aplicar las reglas de control de acceso, registra advertencias de reglas que se han infringido. Este modo se usa principalmente para pruebas y solución de problemas. • Disabled (Deshabilitado): SELinux está desactivado por completo; no se niegan las infracciones de SELinux, ni siquiera se registran. No se recomienda usarlo. Conceptos básicos de seguridad de SELinux Security Enhanced Linux (SELinux) es una capa adicional de seguridad del sistema. El objetivo principal de SELinux es proteger los datos del usuario de los servicios del sistema que han sido comprometidos. La mayoría de los administradores de Linux están familiarizados con el modelo de seguridad de permisos de usuario/grupo/otro. Este es un modelo basado en usuarios y grupos conocido como control de acceso discrecional. SELinux proporciona un nivel adicional de seguridad que está basado en objetos y controlado por reglas más sofisticadas, conocido como control de acceso obligatorio. Para permitir el acceso anónimo remoto a un servidor web, se deben abrir los puertos de firewall. Sin embargo, esta acción otorga a las personas malintencionadas la oportunidad de comprometer el sistema mediante una vulnerabilidad. Si logran comprometer el proceso del servidor web, obtienen sus permisos. En concreto, los permisos del usuario apache y del grupo apache. Ese usuario y grupo tiene acceso de lectura a la raíz del documento, /var/www/html. También tiene acceso a /tmp y /var/tmp, y cualquier otro archivo y directorio que se pueda escribir en todo el mundo. SELinux es un conjunto de reglas de seguridad que determina qué proceso puede acceder a qué archivos, directorios y puertos. Los archivos, procesos, directorios y puertos tienen etiquetas de seguridad especiales denominadas contextos de SELinux. Un contexto es un nombre que usa la política de SELinux para determinar si un proceso puede o no acceder a un archivo, directorio o puerto. De forma predeterminada, la política no permite ninguna interacción, a menos que una regla explícita otorgue acceso. Si no hay ninguna regla de permiso, no se permite ningún tipo de acceso. Las etiquetas de SELinux tienen varios contextos: user (usuario), role (rol), type (tipo) y sensitivity (sensibilidad). La política de destino, que es la política predeterminada habilitada en Red Hat Enterprise Linux, basa sus reglas en el tercer contexto: el contexto de tipo. Por lo general, los nombres de contexto de tipo finalizan en _t. Figura 5.1: Contexto de archivo de SELinux El contexto de tipo para un servidor web es httpd_t. El contexto de tipo para los archivos y los directorios que generalmente se encuentran en /var/www/html es httpd_sys_content_t. El contexto para los archivos y directorios que normalmente se encuentran en /tmp y /var/tmp es tmp_t. El contexto de tipo para los puertos del servidor web es http_port_t. Apache tiene un contexto de tipo de httpd_t. Hay una regla de política que permite que Apache acceda a archivos y directorios con el contexto de tipo httpd_sys_content_t. De manera predeterminada, los archivos encontrados en /var/www/html y otros directorios del servidor RH134-RHEL8.2-es-1-20200928 123 capítulo 5 | Administración de seguridad de SELinux web tienen el contexto de tipo httpd_sys_content_t. No hay una regla allow (permitir) en la política para los archivos que normalmente se encuentran en /tmp y /var/tmp, de modo que no se permite el acceso. Con SELinux habilitado, un usuario malintencionado que haya comprometido el proceso del servidor web no podría acceder al directorio /tmp. El servidor MariaDB tiene un contexto de tipo de mysqld_t. De manera predeterminada, los archivos encontrados en /data/mysql tienen el contexto de tipo de mysqld_db_t. Este tipo de contexto permite que MariaDB acceda a esos archivos, pero deshabilita el acceso de otros servicios, como el servicio web de Apache. Figura 5.2: Acceso de SELinux Muchos comandos que tienen que ver con archivos usan la opción -Z para mostrar o configurar contextos de SELinux. Por ejemplo, ps, ls, cp y mkdir usan la opción -Z para mostrar o configurar contextos de SELinux. [root@host ~]# ps axZ LABEL PID TTY STAT TIME COMMAND system_u:system_r:init_t:s0 1 ? Ss 0:09 /usr/lib/systemd/... system_u:system_r:kernel_t:s0 2 ? S 0:00 [kthreadd] system_u:system_r:kernel_t:s0 3 ? S 0:00 [ksoftirqd/0] ...output omitted... [root@host ~]# systemctl start httpd [root@host ~]# ps -ZC httpd LABEL PID TTY TIME CMD system_u:system_r:httpd_t:s0 1608 ? 00:00:05 httpd system_u:system_r:httpd_t:s0 1609 ? 00:00:00 httpd ...output omitted... [root@host ~]# ls -Z /home drwx------. root root system_u:object_r:lost_found_t:s0 lost+found drwx------. student student unconfined_u:object_r:user_home_dir_t:s0 student drwx------. visitor visitor unconfined_u:object_r:user_home_dir_t:s0 visitor [root@host ~]# ls -Z /var/www drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 error drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 icons Cambio del modo actual de SELinux El subsistema de SELinux proporciona herramientas para mostrar y cambiar los modos. Para determinar el modo actual de SELinux, ejecute el comando getenforce. Para configurar SELinux en un modo diferente, use el comando setenforce: 124 RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux [user@host ~]# getenforce Enforcing [user@host ~]# setenforce usage: setenforce [ Enforcing | Permissive | 1 | 0 ] [user@host ~]# setenforce 0 [user@host ~]# getenforce Permissive [user@host ~]# setenforce Enforcing [user@host ~]# getenforce Enforcing Alternativamente, puede establecer el modo de SELinux en el momento del arranque pasando un parámetro al kernel: el argumento del kernel de enforcing=0 arranca el sistema en modo permisivo; un valor de enforcing=1 establece el modo de cumplimiento. También puede desactivar SELinux completamente pasando el parámetro del kernel selinux=0. Un valor de selinux=1 habilita SELinux. Configuración del modo predeterminado de SELinux También puede configurar SELinux de manera persistente con el archivo /etc/selinux/ config. En el siguiente ejemplo (la configuración predeterminada), el archivo de configuración establece SELinux en enforcing. Los comentarios también muestran los otros valores válidos: permissive y disabled. # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes # are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted El sistema lee este archivo en el momento del arranque y configura SELinux como se muestra. Lo argumentos del kernel (selinux=0|1 y enforcing=0|1) anulan esta configuración. Referencias Páginas del manual: getenforce(8), setenforce(8) y selinux_config(5) RH134-RHEL8.2-es-1-20200928 125 capítulo 5 | Administración de seguridad de SELinux Ejercicio Guiado Cambio del modo de cumplimiento de SELinux En este trabajo de laboratorio, administrará modos de SELinux, tanto de forma temporal como de forma persistente. Resultados Debería ser capaz de ver y configurar el modo de SELinux actual. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab selinux-opsmode start. Este comando ejecuta un script de inicio que determina si la máquina servera es accesible en la red. [student@workstation ~]$ lab selinux-opsmode start 1. Use el comando ssh para iniciar sesión en servera como el usuario student. Los sistemas se configuran para que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Use el comando sudo -i para cambiar al usuario root. La contraseña del usuario student es student. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 3. Cambie el modo predeterminado de SELinux a permisivo y reinicie. 3.1. Use el comando getenforce para verificar que servera está en modo enforcing. [root@servera ~]# getenforce Enforcing 3.2. Use el comando vim para abrir el archivo de configuración /etc/selinux/config. Cambie el parámetro SELINUX de enforcing a permissive. [root@servera ~]# vim /etc/selinux/config 126 RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux 3.3. Use el comando grep para confirmar que el parámetro SELINUX se establece en permissive. [root@servera ~]# grep '^SELINUX' /etc/selinux/config SELINUX=permissive SELINUXTYPE=targeted 3.4. Use el comando systemctl reboot para reiniciar servera. [root@servera ~]# systemctl reboot Connection to servera closed by remote host. Connection to servera closed. [student@workstation ~]$ 4. servera tarda unos minutos en reiniciarse. Después de unos minutos, inicie sesión en servera como el usuario student. Use el comando sudo -i para convertirse en root. Visualice el modo de SELinux actual con el comando getenforce. 4.1. En workstation, use el comando ssh para iniciar sesión en servera con el usuario student. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 4.2. Use el comando sudo -i para convertirse en root. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 4.3. Visualice el modo de SELinux actual con el comando getenforce. [root@servera ~]# getenforce Permissive 5. En el archivo /etc/selinux/config, cambie el modo predeterminado de SELinux a enforcing. Este cambio solo tendrá efecto en el siguiente reinicio. 5.1. Use el comando vim para abrir el archivo de configuración /etc/selinux/config. Vuelva a cambiar SELINUX a enforcing. [root@servera ~]# vim /etc/selinux/config 5.2. Use el comando grep para confirmar que el parámetro SELINUX se establece en enforcing. [root@servera ~]# grep '^SELINUX' /etc/selinux/config SELINUX=enforcing SELINUXTYPE=targeted RH134-RHEL8.2-es-1-20200928 127 capítulo 5 | Administración de seguridad de SELinux 6. Use el comando setenforce para configurar el modo de SELinux actual en enforcing sin reiniciar. Confirme que el modo se ha configurado en enforcing con el comando getenforce. [root@servera ~]# setenforce 1 [root@servera ~]# getenforce Enforcing 7. Salga de servera. [root@servera ~]# exit logout [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute el script lab selinux-opsmode finish para terminar este ejercicio. [student@workstation ~]$ lab selinux-opsmode finish Esto concluye el ejercicio guiado. 128 RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux Control de contextos de archivo de SELinux Objetivos Tras finalizar esta sección, usted deberá ser capaz de realizar lo siguiente: • Administrar las reglas de políticas de SELinux que determinan el contexto predeterminado para archivos y directorios con el comando semanage fcontext. • Aplicar el contexto definido por la política de SELinux a archivos y directorios con el comando restorecon. Contexto inicial de SELinux En los sistemas que ejecutan SELinux, todos los procesos y archivos están etiquetados. La etiqueta representa la información relevante de seguridad, conocida como el contexto de SELinux. En general, los nuevos archivos heredan su contexto de SELinux del directorio principal, garantizando así que tengan el contexto adecuado. Sin embargo, este procedimiento de herencia puede verse comprometido de dos maneras diferentes. Primero, si crea un archivo en una ubicación diferente de la ubicación final y, luego, mueve el archivo, este aún tiene el contexto de SELinux del directorio donde se creó, no del directorio de destino. Segundo, si copia un archivo conservando el contexto de SELinux, como con el comando cp -a, el contexto de SELinux refleja la ubicación del archivo original. En el siguiente ejemplo, se demuestran la herencia y sus escollos. Considere estos dos archivos creados en /tmp, uno se movió a /var/www/html y el segundo se copió al mismo directorio. Tenga en cuenta los contextos de SELinux de los archivos. El archivo que se movió al directorio / var/www/html conserva el contexto de archivo para el directorio /tmp. El archivo que se copió al directorio /var/www/html heredó el contexto de SELinux del directorio /var/www/html. El comando ls -Z muestra el contexto de SELinux de un archivo. Tenga en cuenta la etiqueta del archivo. [root@host ~]# ls -Z /var/www/html/index.html -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/ index.html El comando ls -Zd muestra el contexto de SELinux de un directorio: [root@host ~]# ls -Zd /var/www/html/ drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/ Tenga en cuenta que el /var/www/html/index.html tiene la misma etiqueta que el directorio principal /var/www/html/. Ahora, cree archivos fuera del directorio /var/www/html y observe su contexto de archivo: RH134-RHEL8.2-es-1-20200928 129 capítulo 5 | Administración de seguridad de SELinux [root@host ~]# touch /tmp/file1 /tmp/file2 [root@host ~]# ls -Z /tmp/file* unconfined_u:object_r:user_tmp_t:s0 /tmp/file1 unconfined_u:object_r:user_tmp_t:s0 /tmp/file2 Mueva uno de estos archivos al directorio /var/www/html, copie otro, y observe la etiqueta de cada uno: [root@host ~]# mv /tmp/file1 /var/www/html/ [root@host ~]# cp /tmp/file2 /var/www/html/ [root@host ~]# ls -Z /var/www/html/file* unconfined_u:object_r:user_tmp_t:s0 /var/www/html/file1 unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file2 El archivo movido mantiene su etiqueta original, mientras que el archivo copiado hereda la etiqueta del directorio /var/www/html. unconfined_u: es el usuario, object_r: denota el rol y s0 es el nivel. Un nivel de sensibilidad de 0 es el nivel de sensibilidad más bajo posible. Cambio del contexto de SELinux de un archivo Los comandos para cambiar el contexto de SELinux de los archivos incluyen semanage fcontext, restorecon y chcon. El método preferido para establecer el contexto de SELinux para un archivo es declarar el etiquetado predeterminado para un archivo con el comando semanage fcontext y, luego, aplicar ese contexto al archivo con el comando restorecon. Esto asegura que el etiquetado sea el deseado incluso después de haber etiquetado de nuevo todo el sistema de archivos. El comando chcon cambia los contextos de SELinux. chcon establece el contexto de seguridad en el archivo, almacenado en el sistema de archivos. Es útil para pruebas y experimentos. Sin embargo, no guarda los cambios de contexto en la base de datos de contexto de SELinux. Cuando se ejecuta un comando restorecon, los cambios realizados por el comando chcon tampoco se guardan. Además, si se vuelve a etiquetar todo el sistema de archivos, se revierte el contexto de SELinux para los archivos modificados con chcon. En la siguiente pantalla, se muestra un directorio que se está creando. El directorio tiene un valor de tipo de default_t. [root@host ~]# mkdir /virtual [root@host ~]# ls -Zd /virtual drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /virtual El comando chcon cambia el contexto de archivo del directorio /virtual: el valor de tipo cambia a httpd_sys_content_t. [root@host ~]# chcon -t httpd_sys_content_t /virtual [root@host ~]# ls -Zd /virtual drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /virtual El comando restorecon se ejecuta y el valor de tipo vuelve al valor de default_t. Observe el mensaje Relabeled (reetiquetado). 130 RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux [root@host ~]# restorecon -v /virtual Relabeled /virtual from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0 [root@host ~]# ls -Zd /virtual drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /virtual Definición de las reglas de contextos de archivos predeterminados de SELinux El comando semanage fcontext muestra o modifica las reglas que usa restorecon para configurar los contextos de archivos predeterminados. Usa expresiones regulares ampliadas para especificar los nombres de archivo y las rutas de acceso. La expresión regular ampliada más frecuente usada en las reglas fcontext es (/.*)?, que significa “como opción, coincidir con un / seguido por una serie de caracteres”. Busca coincidencias con el directorio detallado antes de la expresión y todo lo que contiene ese directorio de forma recursiva. Operaciones básicas de contexto de archivo La siguiente tabla es una referencia para las opciones semanage fcontext para agregar, eliminar o enumerar contextos de archivos de SELinux. Comandos de semanage fcontext opción descripción -a, --add Agregar un registro del tipo de objeto especificado -d, --delete Eliminar un registro del tipo de objeto especificado -l, --list Mostrar registros del tipo de objeto especificado Para asegurarse de tener las herramientas para administrar los contextos de SELinux, instale el paquete policycoreutils y el paquete policycoreutils-python si es necesario. Estos contienen el comando restorecon y el comando semanage, respectivamente. Para asegurarse de que todos los archivos de un directorio tengan el contexto de archivo correcto, ejecute el comando semanage fcontext -l seguido por el comando restorecon. En el siguiente ejemplo, observe el contexto de archivo de cada archivo antes y después de que se ejecuten los comandos semanage y restorecon. [root@host ~]# ls -Z /var/www/html/file* unconfined_u:object_r:user_tmp_t:s0 /var/www/html/file1 unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file2 [root@host ~]# semanage fcontext -l ...output omitted... /var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 ...output omitted... RH134-RHEL8.2-es-1-20200928 131 capítulo 5 | Administración de seguridad de SELinux [root@host; ~]# restorecon -Rv /var/www/ Relabeled /var/www/html/file1 from unconfined_u:object_r:user_tmp_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 [root@host ~]# ls -Z /var/www/html/file* unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1 unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file2 En el siguiente ejemplo, se muestra cómo usar semanage para agregar un contexto para un directorio nuevo. [root@host ~]# mkdir /virtual [root@host ~]# touch /virtual/index.html [root@host ~]# ls -Zd /virtual/ drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /virtual/ [root@host ~]# ls -Z /virtual/ -rw-r--r--. root root unconfined_u:object_r:default_t:s0 index.html [root@host ~]# semanage fcontext -a -t httpd_sys_content_t '/virtual(/.*)?' [root@host ~]# restorecon -RFvv /virtual [root@host ~]# ls -Zd /virtual/ drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /virtual/ [root@host ~]# ls -Z /virtual/ -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html Referencias Páginas del manual: chcon(1), restorecon(8), semanage(8) y semanagefcontext(8) 132 RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux Ejercicio Guiado Control de contextos de archivo de SELinux En este trabajo de laboratorio, realizará un cambio persistente en el contexto de SELinux de un directorio y su contenido. Resultados Debe poder configurar el servidor HTTP Apache para publicar contenido web desde una raíz de documento no estándar. Andes De Comenzar Inicie sesión con el usuario student en workstation con la contraseña student. En workstation, ejecute el comando lab selinux-filecontexts start. Este comando ejecuta un script de inicio que determina si la máquina servera es accesible en la red. También instala el servicio httpd y configura el firewall en servera para permitir conexiones http. [student@workstation ~]$ lab selinux-filecontexts start 1. Use el comando ssh para iniciar sesión en servera como el usuario student. Los sistemas se configuran a fin de que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Use el comando sudo -i para cambiar al usuario root. La contraseña del usuario student es student. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 3. Configure Apache para usar una root de documento en una ubicación no estándar. 3.1. Cree la nueva root del documento, /custom, con el comando mkdir. [root@servera ~]# mkdir /custom 3.2. Cree el archivo index.html en la raíz del documento /custom con el comando echo. RH134-RHEL8.2-es-1-20200928 133 capítulo 5 | Administración de seguridad de SELinux [root@servera ~]# echo 'This is SERVERA.' > /custom/index.html 3.3. Configure Apache para que use la nueva ubicación de la raíz del documento. Para hacerlo, edite el archivo de configuración de Apache /etc/httpd/conf/ httpd.conf y reemplace las dos apariciones de /var/www/html con /custom. ...output omitted... DocumentRoot "/custom" ...output omitted... <Directory "/custom"> ...output omitted... 4. Inicie y habilite el servicio web Apache y confirme que el servicio se está ejecutando. 4.1. Inicie y habilite el servicio web Apache con el comando systemctl. [root@servera ~]# systemctl enable --now httpd 4.2. Use el comando systemctl para confirmar que el servicio se está ejecutando. [root@servera ~]# systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: active (running) since Mon 2019-03-25 19:16:48 CET; 15h ago Docs: man:httpd.service(8) Main PID: 6565 (httpd) Status: "Total requests: 16; Idle/Busy workers 100/0;Requests/sec: 0.000285; Bytes served/sec: 0 B/sec" Tasks: 213 (limit: 11406) Memory: 37.3M CGroup: /system.slice/httpd.service ├─6565 /usr/sbin/httpd -DFOREGROUND ├─6566 /usr/sbin/httpd -DFOREGROUND ├─6567 /usr/sbin/httpd -DFOREGROUND ├─6568 /usr/sbin/httpd -DFOREGROUND └─6569 /usr/sbin/httpd -DFOREGROUND Mar 25 19:16:48 servera.lab.example.com systemd[1]: Starting The Apache HTTP Server... Mar 25 19:16:48 servera.lab.example.com httpd[6565]: Server configured, listening on: port 80 Mar 25 19:16:48 servera.lab.example.com systemd[1]: Started The Apache HTTP Server. 5. Abra un navegador web en workstation e intente ver http://servera/index.html. Recibirá un mensaje de error que dice que no tiene permiso para acceder al archivo. 6. Para permitir el acceso al archivo index.html en servera, SELinux debe estar configurado. Defina una regla de contextos de archivos de SELinux que establezca el tipo 134 RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux de contexto en httpd_sys_content_t para el directorio /custom y todos los archivos debajo de este. [root@servera ~]# semanage fcontext -a \ -t httpd_sys_content_t '/custom(/.*)?' 7. Use el comando restorecon para cambiar los contextos de archivos. [root@servera ~]# restorecon -Rv /custom Relabeled /custom from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 Relabeled /custom/index.html from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 8. Intente ver http://servera/index.html nuevamente. Debería ver el mensaje This is SERVERA. (Este es SERVERA). 9. Salga de servera. [root@servera ~]# exit logout [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute el script lab selinux-filecontexts finish para terminar este ejercicio. [student@workstation ~]$ lab selinux-filecontexts finish Esto concluye el ejercicio guiado. RH134-RHEL8.2-es-1-20200928 135 capítulo 5 | Administración de seguridad de SELinux Ajuste de la política de SELinux con booleanos Objetivos Tras finalizar esta sección, usted deberá ser capaz de realizar lo siguiente: • Activar y desactivar las reglas de políticas de SELinux con setsebool. • Administrar el valor persistente de los booleanos SELinux con el comando semanage boolean -l. • Consultar las páginas del manual que finalizan con _selinux para encontrar información útil sobre los booleanos de SELinux. Booleanos de SELinux Los booleanos de SELinux son opciones que modifican el comportamiento de la política de SELinux. Los booleanos de SELinux son reglas que pueden habilitarse o deshabilitarse. Los administradores de seguridad pueden usarlos para realizar ajustes selectivos en la política. Las páginas del manual de SELinux, provistas con el paquete selinux-policy-doc, describen el propósito de los booleanos disponibles. El comando man -k '_selinux' enumera estas páginas del manual. Los comandos útiles para la gestión de booleanos de SELinux incluyen getsebool, que enumera los booleanos y su estado, y setsebool, que modifica los booleanos. setsebool -P modifica la política de SELinux para hacer la modificación persistente. semanage boolean -l informa si un booleano es persistente o no, junto con una breve descripción del booleano. Los usuarios no privilegiados pueden ejecutar el comando getsebool, pero solo los superusuarios pueden ejecutar semanage boolean -l y setsebool -P. [user@host ~]$ getsebool -a abrt_anon_write --> off abrt_handle_event --> off abrt_upload_watch_anon_write --> on antivirus_can_scan_system --> off antivirus_use_jit --> off ...output omitted... [user@host ~]$ getsebool httpd_enable_homedirs httpd_enable_homedirs --> off [user@host ~]$ setsebool httpd_enable_homedirs on Could not change active booleans. Please try as root: Permission denied [user@host ~]$ sudo setsebool httpd_enable_homedirs on [user@host ~]$ sudo semanage boolean -l | grep httpd_enable_homedirs httpd_enable_homedirs (on , off) Allow httpd to enable homedirs [user@host ~]$ getsebool httpd_enable_homedirs httpd_enable_homedirs --> on 136 RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux La opción -P escribe todos los valores pendientes en la política, haciéndolos persistentes en los reinicios. En el ejemplo que sigue, tenga en cuenta los valores entre paréntesis: ambos ahora están configurados en on (activado). [user@host ~]$ setsebool -P httpd_enable_homedirs on [user@host ~]$ sudo semanage boolean -l | grep httpd_enable_homedirs httpd_enable_homedirs (on , on) Allow httpd to enable homedirs Para enumerar los valores booleanos en los que el estado actual difiere del estado predeterminado, ejecute semanage boolean -l -C. [user@host ~]$ sudo semanage boolean -l -C SELinux boolean State Default Description cron_can_relabel (off , on) Allow cron to can relabel Referencias Páginas del manual: booleans(8), getsebool(8), setsebool(8), semanage(8), semanage-boolean(8) RH134-RHEL8.2-es-1-20200928 137 capítulo 5 | Administración de seguridad de SELinux Ejercicio Guiado Ajuste de la política de SELinux con booleanos Apache puede publicar contenido web alojado en los directorios de inicio de los usuarios, pero SELinux lo impide de forma predeterminada. En este ejercicio, identificará y cambiará el booleano de SELinux que permite a Apache acceder a los directorios de inicio de los usuarios. Resultados Debe poder configurar Apache para publicar contenido web desde los directorios de inicio de los usuarios. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab selinux-booleans start. Este comando ejecuta un script de inicio que determina si la máquina servera es accesible en la red. También instala el servicio httpd y configura el firewall en servera para permitir conexiones http. [student@workstation ~]$ lab selinux-booleans start 1. Use el comando ssh para iniciar sesión en servera como el usuario student. Los sistemas se configuran para que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Use el comando sudo -i para cambiar al usuario root. La contraseña del usuario student es student. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 3. 138 Para habilitar la función Apache que permite que los usuarios publiquen contenido web desde sus directorios de inicio, debe editar el archivo de configuración /etc/httpd/ conf.d/userdir.conf. Comente la línea que establece UserDir en disabled (desactivado) y quite el comentario de la línea que establece UserDir en public_html. RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux [root@servera ~]# vim /etc/httpd/conf.d/userdir.conf #UserDir disabled UserDir public_html 4. Use el comando grep para confirmar los cambios. [root@servera ~]# grep '#UserDir' /etc/httpd/conf.d/userdir.conf #UserDir disabled [root@servera ~]# grep '^ *UserDir' /etc/httpd/conf.d/userdir.conf UserDir public_html 5. Inicie y habilite el servicio web Apache para que tengan efecto los cambios realizados. [root@servera ~]# systemctl enable --now httpd 6. En otra ventana de terminal inicie sesión como student. SSH en servera. Cree algo de contenido web que sea publicado desde un directorio de inicio de los usuarios. 6.1. En otra ventana de terminal inicie sesión como student. Use el comando ssh para iniciar sesión en servera como el usuario student. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 6.2. Use el comando mkdir para crear un directorio denominado ~/public_html. [student@servera ~]$ mkdir ~/public_html 6.3. Cree el archivo index.html con el siguiente contenido: [student@servera ~]$ echo 'This is student content on SERVERA.' > \ ~/public_html/index.html 6.4. Use el comando chmod para cambiar los permisos en el directorio de inicio de student de modo que Apache pueda acceder al subdirectorio public_html. [student@servera ~]$ chmod 711 ~ 7. Abra un navegador web en workstation e intente ver la siguiente URL: http:// servera/~student/index.html. Recibe un mensaje de error que dice que no tiene permiso para acceder al archivo. 8. En la ventana de terminal con acceso root, use el comando getsebool para ver si hay booleanos que restrinjan el acceso a los directorios de inicio. RH134-RHEL8.2-es-1-20200928 139 capítulo 5 | Administración de seguridad de SELinux [root@servera ~]# getsebool -a | grep home ...output omitted... httpd_enable_homedirs --> off ...output omitted... 9. En la ventana de terminal con acceso root, use el comando setsebool para habilitar el acceso al directorio de inicio de forma persistente. [root@servera ~]# setsebool -P httpd_enable_homedirs on 10. Intente ver http://servera/~student/index.html nuevamente. Debe ver el mensaje: This is student content on SERVERA. (Este es contenido de student en SERVERA). 11. Salga de servera. [root@servera ~]# exit logout [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute el script lab selinux-booleans finish para terminar este ejercicio. [student@workstation ~]$ lab selinux-booleans finish Esto concluye el ejercicio guiado. 140 RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux Investigación y resolución de problemas de SELinux Objetivos Tras finalizar esta sección, usted deberá ser capaz de realizar lo siguiente: • Usar las herramientas de análisis de registros de SELinux. • Visualizar información útil durante la resolución de problemas de SELinux con el comando sealert. Solución de problemas de SELinux Es importante comprender qué acciones debe tomar cuando SELinux impide el acceso a los archivos en un servidor que debe ser accesible. Use los siguientes pasos como guía para solucionar estos problemas: 1. Antes de pensar en hacer ajustes, considere que SELinux puede estar haciendo este trabajo correctamente al prohibir el intento de acceso. Si un servidor web intenta acceder a archivos en /home, esto podría indicar un riesgo para el servicio si el contenido web no es publicado por usuarios. Si el acceso debería haberse otorgado, es necesario realizar pasos adicionales para solucionar el problema. 2. El problema más frecuente de SELinux es un contexto de archivos incorrecto. Esto puede ocurrir cuando un archivo se crea en una ubicación con un contexto de archivos y se traslada a una ubicación donde se espera un contexto diferente. En la mayoría de los casos, la ejecución de restorecon corregirá el problema. Corregir los problemas de este modo tiene poco impacto en la seguridad del resto del sistema. 3. Otra solución para un acceso demasiado restrictivo podría ser el ajuste de un booleano. Por ejemplo, el booleano ftpd_anon_write controla si usuarios del FTP anónimos pueden cargar archivos. Debe activar este booleano para permitir que los usuarios anónimos de FTP carguen archivos en un servidor. El ajuste de booleanos requiere más cuidado porque estos pueden tener un amplio impacto en la seguridad del sistema. 4. Es posible que la política de SELinux tenga un error que impida un acceso legítimo. Debido a que SELinux se ha consolidado, es poco común que esto ocurra. Cuando está claro que se ha identificado un error en la política, comuníquese con el soporte de Red Hat para informar el error de modo que se pueda resolver. Monitoreo de las violaciones de SELinux Instale el paquete setroubleshoot-server para enviar mensajes de SELinux a /var/log/ messages. setroubleshoot-server escucha mensajes de auditoría en /var/log/ audit/audit.log y envía un breve resumen a /var/log/messages. Este resumen incluye identificadores únicos (UUID) para violaciones de SELinux que se pueden usar para reunir más información. El comando sealert -l UUID se usa para generar un informe para un incidente específico. Use sealert -a /var/log/audit/audit.log para generar informes para todos los incidentes en ese archivo. Considere el siguiente ejemplo de secuencia de comandos en un servidor web Apache estándar: RH134-RHEL8.2-es-1-20200928 141 capítulo 5 | Administración de seguridad de SELinux [root@host ~]# touch /root/file3 [root@host ~]# mv /root/file3 /var/www/html [root@host ~]# systemctl start httpd [root@host ~]# curl http://localhost/file3 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>403 Forbidden</title> </head><body> <h1>Forbidden</h1> <p>You don't have permission to access /file3 on this server.</p> </body></html> Se espera que el servidor web envíe el contenido de file3, pero en cambio, devuelve un error de permission denied (Permiso denegado). Si se inspeccionan /var/log/audit/audit.log y /var/log/messages, se puede obtener más información sobre este error. [root@host ~]# tail /var/log/audit/audit.log ...output omitted... type=AVC msg=audit(1392944135.482:429): avc: denied { getattr } for pid=1609 comm="httpd" path="/var/www/html/file3" dev="vda1" ino=8980981 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file ...output omitted... [root@host ~]# tail /var/log/messages ...output omitted... Feb 20 19:55:42 host setroubleshoot: SELinux is preventing /usr/sbin/httpd from getattr access on the file . For complete SELinux messages. run sealert -l 613ca624-248d-48a2-a7d9-d28f5bbe2763 Ambos archivos de registro indican que el motivo del error es una denegación de SELinux. El comando sealert que es parte de la salida de /var/log/messages proporciona más información, que incluye una posible corrección. [root@host ~]# sealert -l 613ca624-248d-48a2-a7d9-d28f5bbe2763 SELinux is preventing /usr/sbin/httpd from getattr access on the file . ***** Plugin catchall (100. confidence) suggests ************************** If you believe that httpd should be allowed getattr access on the file by default. Then you should report this as a bug. You can generate a local policy module to allow this access. Do allow this access for now by executing: # grep httpd /var/log/audit/audit.log | audit2allow -M mypol # semodule -i mypol.pp Additional Information: Source Context Target Context Target Objects 142 system_u:system_r:httpd_t:s0 unconfined_u:object_r:admin_home_t:s0 [ file ] RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux Source Source Path Port Host Source RPM Packages Target RPM Packages Policy RPM Selinux Enabled Policy Type Enforcing Mode Host Name Platform Alert Count First Seen Last Seen Local ID httpd /usr/sbin/httpd <Unknown> servera httpd-2.4.6-14.el7.x86_64 selinux-policy-3.12.1-124.el7.noarch True targeted Enforcing servera Linux servera 3.10.0-84.el7.x86_64 #1 SMP Tue Feb 4 16:28:19 EST 2014 x86_64 x86_64 2 2014-02-20 19:55:35 EST 2014-02-20 19:55:35 EST 613ca624-248d-48a2-a7d9-d28f5bbe2763 Raw Audit Messages type=AVC msg=audit(1392944135.482:429): avc: denied { getattr } for pid=1609 comm="httpd" path="/var/www/html/file3" dev="vda1" ino=8980981 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file type=SYSCALL msg=audit(1392944135.482:429): arch=x86_64 syscall=lstat success=no exit=EACCES a0=7f9fed0edea8 a1=7fff7bffc770 a2=7fff7bffc770 a3=0 items=0 ppid=1608 pid=1609 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm=httpd exe=/usr/sbin/httpd subj=system_u:system_r:httpd_t:s0 key=(null) Hash: httpd,httpd_t,admin_home_t,file,getattr nota La sección Raw Audit Messages (Mensajes de auditoría sin formato) revela el archivo de destino que presenta el problema, /var/www/html/file3. Además, el contexto objetivo, tcontext, no parece pertenecer a un servidor web. Use el comando restorecon /var/www/html/file3 para corregir el contexto de archivos. Si deben ajustarse otros archivos, restorecon puede restablecer de forma recursiva el contexto: restorecon -R /var/www/. La sección Raw Audit Messages (Mensajes de auditoría en bruto) del comando sealert contiene información de /var/log/audit.log. Para buscar el archivo /var/log/audit.log, use el comando ausearch. La opción -m busca en el tipo de mensaje. La opción -ts busca en función del tiempo. RH134-RHEL8.2-es-1-20200928 143 capítulo 5 | Administración de seguridad de SELinux [root@host ~]# ausearch -m AVC -ts recent ---time->Tue Apr 9 13:13:07 2019 type=PROCTITLE msg=audit(1554808387.778:4002): proctitle=2F7573722F7362696E2F6874747064002D44464F524547524F554E44 type=SYSCALL msg=audit(1554808387.778:4002): arch=c000003e syscall=49 success=no exit=-13 a0=3 a1=55620b8c9280 a2=10 a3=7ffed967661c items=0 ppid=1 pid=9340 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null) type=AVC msg=audit(1554808387.778:4002): avc: denied { name_bind } for pid=9340 comm="httpd" src=82 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:reserved_port_t:s0 tclass=tcp_socket permissive=0 Consola web Si la Consola web está instalada, también se puede usar para solucionar problemas de SELinux. Inicie sesión en la Consola Web y seleccione SELinux en el menú de la izquierda. La ventana SELinux Policy (Política de SELinux) le informa del estado de cumplimiento actual. Cualquier problema se detalla en la sección SELinux Access Control Errors (Errores de control de acceso de SELinux). Figura 5.3: Política de SELinux en la consola web Haga clic en el carácter > para mostrar los detalles del error. Haga clic en solution details (detalles de la solución) para mostrar todos los detalles y la posible solución. Figura 5.4: Solución de política de SELinux en la consola web Una vez resuelto el problema, la sección SELinux Access Control Errors ya no debería mostrar el error. Si aparece el mensaje No SELinux alerts (No hay alertas de SELinux), se han corregido todos los problemas. 144 RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux Figura 5.5: No hay alertas de SELinux en la consola web Referencias Página del manual: sealert(8) RH134-RHEL8.2-es-1-20200928 145 capítulo 5 | Administración de seguridad de SELinux Ejercicio Guiado Investigación y resolución de problemas de SELinux En este trabajo de laboratorio, aprenderá cómo solucionar problemas de denegaciones por seguridad de SELinux. Resultados Podrá obtener algo de experiencia en el uso de herramientas de solución de problemas de SELinux. Andes De Comenzar Inicie sesión con el usuario student en workstation con la contraseña student. En workstation, ejecute el comando lab selinux-issues start. Este comando ejecuta un script de inicio que determina si la máquina servera es accesible en la red. Instala el servicio httpd, configura el firewall en servera para permitir conexiones HTTP y elimina el contexto de SELinux del directorio /custom. [student@workstation ~]$ lab selinux-issues start 1. Abra un navegador web en workstation e intente ver http://servera/index.html. Recibirá un mensaje de error que dice que no tiene permiso para acceder al archivo. 2. Use el comando ssh para iniciar sesión en servera como el usuario student. Los sistemas se configuran a fin de que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 3. Use el comando sudo -i para cambiar al usuario root. La contraseña del usuario student es student. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 4. Con el comando less, vea el contenido de /var/log/messages. Use la tecla / para buscar sealert. Copie el comando sugerido sealert para que pueda usarse en el siguiente paso. Use la tecla q para salir del comando less. 146 RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux [root@servera ~]# less /var/log/messages ...output omitted... Mar 28 06:07:03 servera setroubleshoot[15326]: SELinux is preventing /usr/sbin/ httpd from getattr access on the file /custom/index.html. For complete SELinux messages run: sealert -l b1c9cc8f-a953-4625-b79b-82c4f4f1fee3 Mar 28 06:07:03 servera platform-python[15326]: SELinux is preventing /usr/sbin/ httpd from getattr access on the file /custom/index.html.#012#012***** Plugin catchall (100. confidence) suggests **************************#012#012If you believe that httpd should be allowed getattr access on the index.html file by default.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by executing:#012# ausearch -c 'httpd' --raw | audit2allow -M my-httpd#012# semodule -X 300 -i my-httpd.pp#012 Mar 28 06:07:04 servera setroubleshoot[15326]: failed to retrieve rpm info for / custom/index.html ...output omitted... 5. Ejecute el comando sugerido sealert. Tenga en cuenta el contexto de origen, los objetos de destino, la política y el modo de cumplimiento. [root@servera ~]# sealert -l b1c9cc8f-a953-4625-b79b-82c4f4f1fee3 SELinux is preventing /usr/sbin/httpd from getattr access on the file /custom/ index.html. ***** Plugin catchall (100. confidence) suggests ************************** If you believe that httpd should be allowed getattr access on the index.html file by default. Then you should report this as a bug. You can generate a local policy module to allow this access. Do allow this access for now by executing: # ausearch -c 'httpd' --raw | audit2allow -M my-httpd # semodule -X 300 -i my-httpd.pp Additional Information: Source Context Target Context Target Objects Source Source Path Port Host Source RPM Packages Target RPM Packages Policy RPM Selinux Enabled Policy Type Enforcing Mode Host Name Platform RH134-RHEL8.2-es-1-20200928 system_u:system_r:httpd_t:s0 unconfined_u:object_r:default_t:s0 /custom/index.html [ file ] httpd /usr/sbin/httpd <Unknown> servera.lab.example.com selinux-policy-3.14.1-59.el8.noarch True targeted Enforcing servera.lab.example.com Linux servera.lab.example.com 4.18.0-67.el8.x86_64 #1 SMP Sat Feb 9 12:44:00 147 capítulo 5 | Administración de seguridad de SELinux Alert Count First Seen Last Seen Local ID UTC 2019 x86_64 x86_64 18 2019-03-25 19:25:28 CET 2019-03-28 11:07:00 CET b1c9cc8f-a953-4625-b79b-82c4f4f1fee3 Raw Audit Messages type=AVC msg=audit(1553767620.970:16958): avc: denied { getattr } for pid=15067 comm="httpd" path="/custom/index.html" dev="vda1" ino=4208311 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file permissive=0 Hash: httpd,httpd_t,default_t,file,getattr 6. La sección Raw Audit Messages (Mensajes de auditoría en bruto) del comando sealert contiene información de /var/log/audit/audit.log. Use el comando ausearch para buscar el archivo /var/log/audit/audit.log. La opción -m busca en el tipo de mensaje. La opción -ts busca en función del tiempo. Esta entrada identifica el proceso relevante y el archivo que causa la alerta. El proceso es el servidor web Apache httpd, el archivo es /custom/index.html y el contexto es system_r:httpd_t. [root@servera ~]# ausearch -m AVC -ts recent ---time->Thu Mar 28 13:39:30 2019 type=PROCTITLE msg=audit(1553776770.651:17000): proctitle=2F7573722F7362696E2F6874747064002D44464F524547524F554E44 type=SYSCALL msg=audit(1553776770.651:17000): arch=c000003e syscall=257 success=no exit=-13 a0=ffffff9c a1=7f8db803f598 a2=80000 a3=0 items=0 ppid=15063 pid=15065 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null) type=AVC msg=audit(1553776770.651:17000): avc: denied { open } for pid=15065 comm="httpd" path="/custom/index.html" dev="vda1" ino=4208311 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file permissive=0 7. Para resolver el problema, use los comandos semanage y restorecon. El contexto que se debe administrar es httpd_sys_content_t . [root@servera ~]# semanage fcontext -a \ -t httpd_sys_content_t '/custom(/.*)?' [root@servera ~]# restorecon -Rv /custom Relabeled /custom from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 Relabeled /custom/index.html from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 8. Intente ver http://servera/index.html nuevamente. Debería ver el mensaje This is SERVERA. (Este es SERVERA). 148 RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux 9. Salga de servera. [root@servera ~]# exit logout [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute el script lab selinux-issues finish para terminar este ejercicio. [student@workstation ~]$ lab selinux-issues finish Esto concluye el ejercicio guiado. RH134-RHEL8.2-es-1-20200928 149 capítulo 5 | Administración de seguridad de SELinux Trabajo de laboratorio Administración de seguridad de SELinux Lista de verificación de rendimiento En este trabajo de laboratorio, solucionará un problema de denegación de acceso de SELinux. Los administradores de sistemas tienen problemas para obtener un nuevo servidor web para proporcionar contenido a clientes cuando SELinux está en modo de cumplimiento. Resultados Usted deberá ser capaz de realizar lo siguiente: • Identificar problemas en los archivos de registro del sistema. • Ajustar la configuración de SELinux. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab selinux-review start. Este comando ejecuta un script de inicio que determina si la máquina serverb es accesible en la red. También instala el servidor httpd Apache, crea un nuevo DocumentRoot para Apache y actualiza el archivo de configuración. [student@workstation ~]$ lab selinux-review start 1. Inicie sesión en serverb como el usuario root. 2. Inicie un navegador web en workstation y diríjase a http://serverb/lab.html. Verá el mensaje de error: You do not have permission to access /lab.html on this server (No tiene permiso para acceder a /lab.html en este servidor). 3. Investigue e identifique el problema de SELinux que impide que Apache proporcione el contenido web. 4. Muestre el contexto de SELinux de la nueva raíz de documentos HTTP y la raíz de documentos HTTP original. Resuelva el problema de SELinux que impide que Apache proporcione el contenido web. 5. Verifique que el problema de SELinux se haya resuelto y que Apache pueda proporcionar contenido web. 6. Salga de serverb. Evaluación En workstation, ejecute el script lab selinux-review grade para confirmar que ha realizado correctamente este ejercicio. [student@workstation ~]$ lab selinux-review grade 150 RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux Finalizar En workstation, ejecute el script lab selinux-review finish para terminar el trabajo de laboratorio. [student@workstation ~]$ lab selinux-review finish Esto concluye el trabajo de laboratorio. RH134-RHEL8.2-es-1-20200928 151 capítulo 5 | Administración de seguridad de SELinux Solución Administración de seguridad de SELinux Lista de verificación de rendimiento En este trabajo de laboratorio, solucionará un problema de denegación de acceso de SELinux. Los administradores de sistemas tienen problemas para obtener un nuevo servidor web para proporcionar contenido a clientes cuando SELinux está en modo de cumplimiento. Resultados Usted deberá ser capaz de realizar lo siguiente: • Identificar problemas en los archivos de registro del sistema. • Ajustar la configuración de SELinux. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab selinux-review start. Este comando ejecuta un script de inicio que determina si la máquina serverb es accesible en la red. También instala el servidor httpd Apache, crea un nuevo DocumentRoot para Apache y actualiza el archivo de configuración. [student@workstation ~]$ lab selinux-review start Inicie sesión en serverb como el usuario root. 1. 1.1. Use el comando ssh para iniciar sesión en serverb como el usuario student. Los sistemas se configuran a fin de que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@serverb ...output omitted... [student@serverb ~]$ 1.2. Use el comando sudo -i para cambiar al usuario root. La contraseña del usuario student es student. [student@serverb ~]$ sudo -i [sudo] password for student: student [root@serverb ~]# 2. 152 Inicie un navegador web en workstation y diríjase a http://serverb/lab.html. Verá el mensaje de error: You do not have permission to access /lab.html on this server (No tiene permiso para acceder a /lab.html en este servidor). RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux 3. Investigue e identifique el problema de SELinux que impide que Apache proporcione el contenido web. 3.1. Con el comando less, vea el contenido de /var/log/messages. Use la tecla / para buscar sealert. Use la tecla q para salir del comando less. [root@serverb ~]# less /var/log/messages Mar 28 10:19:51 serverb setroubleshoot[27387]: SELinux is preventing /usr/sbin/ httpd from getattr access on the file /lab-content/lab.html. For complete SELinux messages run: sealert -l 8824e73d-3ab0-4caf-8258-86e8792fee2d Mar 28 10:19:51 serverb platform-python[27387]: SELinux is preventing /usr/sbin/ httpd from getattr access on the file /lab-content/lab.html.#012#012***** Plugin catchall (100. confidence) suggests **************************#012#012If you believe that httpd should be allowed getattr access on the lab.html file by default.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by executing:#012# ausearch -c 'httpd' --raw | audit2allow -M my-httpd#012# semodule -X 300 -i my-httpd.pp#012 3.2. Ejecute el comando sugerido sealert. Tenga en cuenta el contexto de origen, los objetos de destino, la política y el modo de cumplimiento. [root@serverb ~]# sealert -l 8824e73d-3ab0-4caf-8258-86e8792fee2d SELinux is preventing /usr/sbin/httpd from getattr access on the file /labcontent/lab.html. ***** Plugin catchall (100. confidence) suggests ************************** If you believe that httpd should be allowed getattr access on the lab.html file by default. Then you should report this as a bug. You can generate a local policy module to allow this access. Do allow this access for now by executing: # ausearch -c 'httpd' --raw | audit2allow -M my-httpd # semodule -X 300 -i my-httpd.pp Additional Information: Source Context Target Context Target Objects Source Source Path Port Host Source RPM Packages Target RPM Packages Policy RPM Selinux Enabled Policy Type Enforcing Mode Host Name Platform RH134-RHEL8.2-es-1-20200928 system_u:system_r:httpd_t:s0 unconfined_u:object_r:default_t:s0 /lab-content/lab.html [ file ] httpd /usr/sbin/httpd <Unknown> serverb.lab.example.com selinux-policy-3.14.1-59.el8.noarch True targeted Enforcing serverb.lab.example.com Linux serverb.lab.example.com 153 capítulo 5 | Administración de seguridad de SELinux Alert Count First Seen Last Seen Local ID 4.18.0-67.el8.x86_64 #1 SMP Sat Feb 9 12:44:00 UTC 2019 x86_64 x86_64 2 2019-03-28 15:19:46 CET 2019-03-28 15:19:46 CET 8824e73d-3ab0-4caf-8258-86e8792fee2d Raw Audit Messages type=AVC msg=audit(1553782786.213:864): avc: denied { getattr } for pid=15606 comm="httpd" path="/lab-content/lab.html" dev="vda1" ino=8763212 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file permissive=0 Hash: httpd,httpd_t,default_t,file,getattr 3.3. La sección Raw Audit Messages (Mensajes de auditoría en bruto) del comando sealert contiene información de /var/log/audit/audit.log. Use el comando ausearch para buscar el archivo /var/log/audit/audit.log. La opción -m busca en el tipo de mensaje. La opción ts busca en función del tiempo. Esta entrada identifica el proceso relevante y el archivo que causa la alerta. El proceso es el servidor web Apache httpd, el archivo es /lab-content/lab.html y el contexto es system_r:httpd_t. [root@serverb ~]# ausearch -m AVC -ts recent time->Thu Mar 28 15:19:46 2019 type=PROCTITLE msg=audit(1553782786.213:864): proctitle=2F7573722F7362696E2F6874747064002D44464F524547524F554E44 type=SYSCALL msg=audit(1553782786.213:864): arch=c000003e syscall=6 success=no exit=-13 a0=7fb900004930 a1=7fb92dfca8e0 a2=7fb92dfca8e0 a3=1 items=0 ppid=15491 pid=15606 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null) type=AVC msg=audit(1553782786.213:864): avc: denied { getattr } for pid=15606 comm="httpd" path="/lab-content/lab.html" dev="vda1" ino=8763212 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file permissive=0 4. Muestre el contexto de SELinux de la nueva raíz de documentos HTTP y la raíz de documentos HTTP original. Resuelva el problema de SELinux que impide que Apache proporcione el contenido web. 4.1. Use ls-dZ para comparar la raíz del documento de /lab-content y /var/www/ html. [root@serverb ~]# ls -dZ /lab-content /var/www/html unconfined_u:object_r:default_t:s0 /lab-content/ system_u:object_r:httpd_sys_content_t:s0 /var/www/html/ 4.2. 154 Cree una regla de contextos de archivos que establezca el tipo predeterminado en httpd_sys_content_ para /lab-content y todos los archivos debajo de este. RH134-RHEL8.2-es-1-20200928 capítulo 5 | Administración de seguridad de SELinux [root@serverb ~]# semanage fcontext -a \ -t httpd_sys_content_t '/lab-content(/.*)?' 4.3. Use el comando restorecon para establecer el contexto de SELinux para los archivos en /lab-content. [root@serverb ~]# restorecon -R /lab-content/ 5. Verifique que el problema de SELinux se haya resuelto y que Apache pueda proporcionar contenido web. Use su navegador web para actualizar el enlace http://serverb/lab.html. Ahora debería ver algo de contenido web. This is the html file for the SELinux final lab on SERVERB. 6. Salga de serverb. [root@serverb ~]# exit logout [student@serverb ~]$ exit logout Connection to serverb closed. [student@workstation ~]$ Evaluación En workstation, ejecute el script lab selinux-review grade para confirmar que ha realizado correctamente este ejercicio. [student@workstation ~]$ lab selinux-review grade Finalizar En workstation, ejecute el script lab selinux-review finish para terminar el trabajo de laboratorio. [student@workstation ~]$ lab selinux-review finish Esto concluye el trabajo de laboratorio. RH134-RHEL8.2-es-1-20200928 155 capítulo 5 | Administración de seguridad de SELinux Resumen En este capítulo, aprendió lo siguiente: • Los comandos getenforce y setenforce se usan para administrar el modo de SELinux de un sistema. • El comando semanage se usa para administrar las reglas de políticas de SELinux. El comando restorecon aplica el contexto definido por la política. • Los booleanos son opciones que modifican el comportamiento de la política de SELinux. Se pueden habilitar o deshabilitar, y se usan para ajustar la política. • El comando sealert muestra información útil que ayuda con la solución de problemas de SELinux. 156 RH134-RHEL8.2-es-1-20200928 capítulo 6 Administración de almacenamiento básico Meta Crear y administrar dispositivos de almacenamiento, particiones, sistemas de archivos y espacios de intercambio desde la línea de comandos. Objetivos • Crear particiones de almacenamiento, formatearlas con sistemas de archivos y montarlas para su uso. • Crear y administrar espacios de intercambio para complementar la memoria física. • Adición de particiones, sistemas de archivos y montajes persistentes (y ejercicio guiado) • Administración de espacio de intercambio (y ejercicio guiado) Secciones Trabajo de laboratorio RH134-RHEL8.2-es-1-20200928 Administración de almacenamiento básico 157 capítulo 6 | Administración de almacenamiento básico Adición de particiones, sistemas de archivos y montajes persistentes Objetivos Tras completar esta sección, debería ser capaz de crear particiones de almacenamiento, formatearlas con sistemas de archivos y montarlas para su uso. Partición de un disco La partición de discos permite a los administradores de sistemas dividir un disco duro en varias unidades de almacenamiento lógico denominadas particiones. Al separar un disco en particiones, los administradores de sistemas pueden usar diferentes particiones para realizar diferentes funciones. Por ejemplo, la partición de discos es necesaria o beneficiosa en las siguientes situaciones: • Limitar espacio disponible para aplicaciones o usuarios. • Separar archivos de programa y de sistemas operativos de archivos de usuarios. • Crear un área separada para el intercambio de memoria. • Limitar el uso de espacio en disco para mejorar el rendimiento de herramientas de diagnóstico e imágenes de copia de seguridad. Esquema de partición MBR Desde 1982, el esquema de particiones Master Boot Record (MBR) ha indicado cómo los discos se deben particionar en sistemas que ejecutan firmware de BIOS. Este esquema admite un máximo de cuatro particiones primarias. En sistemas Linux, con el uso de particiones ampliadas y lógicas, los administradores pueden crear un máximo de 15 unidades. Dado que los datos del tamaño de la partición se almacenan como valores de 32 bits, los discos particionados con el esquema MBR tienen un tamaño de disco y partición máximo de 2 TiB. Figura 6.1: Particiones MBR del dispositivo de almacenamiento /dev/vdb Dado que los discos físicos son cada vez más grandes, y volúmenes basados en SAN aún más grandes, el límite de tamaño de la partición y del disco de 2 TiB del esquema de partición MBR ya no es un límite teórico, sino más bien un problema del mundo real que los administradores de sistemas encuentran cada vez más frecuentemente en los entornos de producción. Como consecuencia, el esquema MBR heredado está en proceso de ser sustituido por el nuevo esquema GUID Partition Table (GPT) para la partición de disco. 158 RH134-RHEL8.2-es-1-20200928 capítulo 6 | Administración de almacenamiento básico Esquema de partición GPT Para sistemas que ejecutan firmware Unified Extensible Firmware Interface (UEFI), GPT es el estándar para el diseño de tablas de partición en discos duros físicos. GPT es parte del estándar UEFI y aborda muchas de las limitaciones que impone el antiguo esquema basado en MBR. Un GPT proporciona un máximo de 128 particiones. A diferencia de MBR, que usa 32 bits para almacenar información de tamaño y direcciones en bloques lógicos, un GPT asigna 64 bits para direcciones en bloques lógicos. Esto permite que GPT incluya particiones y discos de hasta ocho zebibyte (ZiB), u 8 mil millones de tebibytes. Además de abordar las limitaciones del esquema de partición MBR, GPT también ofrece algunas funciones y beneficios adicionales. Un GPT usa un identificador único global (GUID) para identificar cada disco y partición. En contraste con MBR, que tiene un único punto de error, GPT ofrece redundancia de la información de su tabla de particiones. El GPT primario reside en el cabezal del disco, mientras que una copia de seguridad, el GPT secundario, se aloja en el extremo del disco. GPT usa la suma de comprobación para detectar errores y daños en la tabla de particiones y el encabezado de GPT. Figura 6.2: Particiones GPT del dispositivo de almacenamiento /dev/vdb Administración de particiones con parted Los editores de particiones son programas que permiten a los administradores hacer cambios en particiones de discos, como crear particiones, eliminar particiones y cambiar el tipo de partición. Para realizar estas operaciones, los administradores pueden usar el editor de particiones Parted tanto para el esquema de partición GPT como MBR. El comando parted toma el nombre del dispositivo de todo el disco como primer argumento y uno o más subcomandos. En el siguiente ejemplo, se usa el subcomando print para visualizar la tabla de particiones en el disco /dev/vda. [root@host ~]# parted /dev/vda print Model: Virtio Block Device (virtblk) Disk /dev/vda: 53.7GB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number 1 2 Start 1049kB 10.7GB End 10.7GB 53.7GB Size 10.7GB 42.9GB Type primary primary File system xfs xfs Flags boot Si no proporciona un subcomando, parted abre una sesión interactiva para emitir comandos. [root@host ~]# parted /dev/vda GNU Parted 3.2 Using /dev/vda Welcome to GNU Parted! Type 'help' to view a list of commands. RH134-RHEL8.2-es-1-20200928 159 capítulo 6 | Administración de almacenamiento básico (parted) print Model: Virtio Block Device (virtblk) Disk /dev/vda: 53.7GB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number 1 2 Start 1049kB 10.7GB End 10.7GB 53.7GB Size 10.7GB 42.9GB Type primary primary File system xfs xfs Flags boot (parted) quit [root@host ~]# De forma predeterminada, parted muestra todos los tamaños en potencias de 10 (KB, MB, GB). Puede cambiar ese valor predeterminado con el subcomando unit que acepta los siguientes parámetros: • s para sector • B para byte • MiB, GiB o TiB (potencias de 2) • MB, GB o TB (potencias de 10) [root@host ~]# parted /dev/vda unit s print Model: Virtio Block Device (virtblk) Disk /dev/vda: 104857600s Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number 1 2 Start 2048s 20971520s End 20971486s 104857535s Size 20969439s 83886016s Type primary primary File system xfs xfs Flags boot Como se muestra en el ejemplo anterior, también puede especificar varios subcomandos (aquí, unit y print) en la misma línea. Escritura de la tabla de particiones en un disco nuevo Para particionar una nueva unidad, primero debe escribir una etiqueta de disco. La etiqueta del disco indica qué esquema de partición usar. Advertencia Tenga en cuenta que parted realiza los cambios de inmediato. Un error con parted podría provocar la pérdida de datos. Como el usuario root, use el siguiente comando para escribir una etiqueta de disco MBR en un disco. [root@host ~]# parted /dev/vdb mklabel msdos 160 RH134-RHEL8.2-es-1-20200928 capítulo 6 | Administración de almacenamiento básico Para escribir una etiqueta de disco GPT, use el siguiente comando. [root@host ~]# parted /dev/vdb mklabel gpt Advertencia El subcomando mklabel borra la tabla de particiones existente. Solo use mklabel cuando la intención sea volver a usar el disco sin tener en cuenta los datos existentes. Si una nueva etiqueta cambia los límites de la partición, todos los datos en los sistemas de archivos existentes serán inaccesibles. Creación de particiones de MBR La creación de una partición de disco estilo MBR incluye varios pasos: 1. Especifique el dispositivo de disco donde creará la partición. Como usuario root, ejecute el comando parted y especifique el nombre del dispositivo de disco como un argumento. Esto inicia el comando parted en modo interactivo, y muestra un prompt de comando. [root@host ~]# parted /dev/vdb GNU Parted 3.2 Using /dev/vdb Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) 2. Use el subcomando mkpart para crear una nueva partición primaria o ampliada. (parted) mkpart Partition type? primary/extended? primary nota En el caso de situaciones donde se necesitan más de cuatro particiones en un disco particionado con MBR, cree tres particiones primarias y una partición ampliada. Esta partición ampliada sirve como contenedor dentro del cual se pueden crear varias particiones lógicas. 3. Indique el tipo de sistema de archivos que desea crear en la partición, como xfs o ext4. Esto no crea el sistema de archivos en la partición; es solo una indicación del tipo de partición. File system type? [ext2]? xfs Para obtener la lista de los tipos de sistemas de archivos admitidos, use el siguiente comando: [root@host ~]# parted /dev/vdb help mkpart mkpart PART-TYPE [FS-TYPE] START END make a partition PART-TYPE is one of: primary, logical, extended FS-TYPE is one of: btrfs, nilfs2, ext4, ext3, ext2, fat32, fat16, hfsx, hfs+, hfs, jfs, swsusp, linux-swap(v1), linux-swap(v0), ntfs, reiserfs, RH134-RHEL8.2-es-1-20200928 161 capítulo 6 | Administración de almacenamiento básico hp-ufs, sun-ufs, xfs, apfs2, apfs1, asfs, amufs5, amufs4, amufs3, amufs2, amufs1, amufs0, amufs, affs7, affs6, affs5, affs4, affs3, affs2, affs1, affs0, linux-swap, linux-swap(new), linux-swap(old) START and END are disk locations, such as 4GB or 10%. Negative values count from the end of the disk. For example, -1s specifies exactly the last sector. 'mkpart' makes a partition without creating a new file system on the partition. FS-TYPE may be specified to set an appropriate partition ID. 4. Especifique el sector en el disco donde se iniciará la nueva partición. Start? 2048s Observe el sufijo s para proporcionar el valor en sectores. También puede usar los sufijos MiB, GiB, TiB, MB, GB o TB. Si no proporciona un sufijo, MB es el predeterminado. parted puede redondear el valor que proporcione para satisfacer las restricciones de disco. Cuando parted comienza, recupera la topología del disco del dispositivo. Por ejemplo, el tamaño del bloque físico del disco suele ser un parámetro que recopila parted. Con esa información, parted asegura que la posición de inicio que proporcione alinea correctamente la partición con la estructura del disco. La alineación correcta de la partición es importante para un rendimiento óptimo. Si la posición de inicio genera una partición desalineada, parted muestra una advertencia. Con la mayoría de los discos, un sector de inicio que es un múltiplo de 2048 es una suposición segura. 5. Especifique el sector del disco donde debería terminar la nueva partición. End? 1000MB Con parted, no puede proporcionar directamente el tamaño de su partición, pero puede calcularlo rápidamente con la siguiente fórmula: Size = End - Start Tan pronto como usted proporcione la posición final, parted actualiza la tabla de particiones en el disco con los detalles de la nueva partición. Salga de parted. 6. (parted) quit Information: You may need to update /etc/fstab. [root@host ~]# Ejecute el comando udevadm settle. Este comando espera a que el sistema detecte la nueva partición y cree el archivo de dispositivo asociado en el directorio /dev. Sólo regresa cuando finaliza. 7. [root@host ~]# udevadm settle [root@host ~]# 162 RH134-RHEL8.2-es-1-20200928 capítulo 6 | Administración de almacenamiento básico Como alternativa al modo interactivo, también puede crear la partición de la siguiente manera: [root@host ~]# parted /dev/vdb mkpart primary xfs 2048s 1000MB Creación de particiones GPT El esquema GTP también usa el comando parted para crear nuevas particiones: 1. Especifique el dispositivo de disco donde creará la partición. Como el usuario root, ejecute el comando parted con el dispositivo de disco como único argumento para iniciar parted en modo interactivo con un prompt del sistema. [root@host ~]# parted /dev/vdb GNU Parted 3.2 Using /dev/vdb Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) 2. Use el subcomando mkpart para comenzar a crear la nueva partición. Con el esquema GPT, cada partición recibe un nombre. (parted) mkpart Partition name? 3. []? usersdata Indique el tipo de sistema de archivos que desea crear en la partición, como xfs o ext4. Esto no crea el sistema de archivos en la partición; es solo una indicación del tipo de partición. File system type? 4. [ext2]? xfs Especifique el sector en el disco donde se iniciará la nueva partición. Start? 2048s 5. Especifique el sector del disco donde debería terminar la nueva partición. End? 1000MB Tan pronto como usted proporcione la posición final, parted actualiza la tabla de particiones en el disco con los detalles de la nueva partición. 6. Salga de parted. (parted) quit Information: You may need to update /etc/fstab. [root@host ~]# 7. Ejecute el comando udevadm settle. Este comando espera a que el sistema detecte la nueva partición y cree el archivo de dispositivo asociado en el directorio /dev. Sólo regresa cuando finaliza. RH134-RHEL8.2-es-1-20200928 163 capítulo 6 | Administración de almacenamiento básico [root@host ~]# udevadm settle [root@host ~]# Como alternativa al modo interactivo, también puede crear la partición de la siguiente manera: [root@host ~]# parted /dev/vdb mkpart usersdata xfs 2048s 1000MB Eliminación de particiones Los siguientes pasos se aplican a los esquemas de partición MBR y GPT. 1. Especifique el disco que contiene la partición que se eliminará. Como el usuario root, ejecute el comando parted con el dispositivo de disco como único argumento para iniciar parted en modo interactivo con un prompt del sistema. [root@host ~]# parted /dev/vdb GNU Parted 3.2 Using /dev/vdb Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) 2. Identifique el número de partición de la partición que se eliminará. (parted) print Model: Virtio Block Device (virtblk) Disk /dev/vdb: 5369MB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number 1 3. Start 1049kB End 1000MB Size 999MB File system xfs Name usersdata Flags Elimine la partición. (parted) rm 1 El subcomando rm elimina inmediatamente la partición de la tabla de particiones en el disco. Salga de parted. 4. (parted) quit Information: You may need to update /etc/fstab. [root@host ~]# Creación de sistemas de archivos Después de la creación de un dispositivo de bloque, el siguiente paso es agregarle un sistema de archivos. Red Hat Enterprise Linux admite muchos tipos de sistema de archivos diferentes, pero 164 RH134-RHEL8.2-es-1-20200928 capítulo 6 | Administración de almacenamiento básico dos tipos comunes son XFS y ext4. Anaconda, el instalador para Red Hat Enterprise Linux, usa XFS de forma predeterminada. Como el usuario root, use el comando mkfs.xfs para aplicar un sistema de archivos XFS a un dispositivo de bloque. Para ext4, use mkfs.ext4 . [root@host ~]# mkfs.xfs /dev/vdb1 meta-data=/dev/vdb1 isize=512 = sectsz=512 = crc=1 = reflink=1 data = bsize=4096 = sunit=0 naming =version 2 bsize=4096 log =internal log bsize=4096 = sectsz=512 realtime =none extsz=4096 agcount=4, agsize=60992 blks attr=2, projid32bit=1 finobt=1, sparse=1, rmapbt=0 blocks=243968, imaxpct=25 swidth=0 blks ascii-ci=0, ftype=1 blocks=1566, version=2 sunit=0 blks, lazy-count=1 blocks=0, rtextents=0 Montaje de sistemas de archivos Después de haber agregado el sistema de archivos, el último paso es montar el sistema de archivos en un directorio en la estructura de directorios. Cuando monta un sistema de archivos en la jerarquía del directorio, las utilidades de espacio de usuarios pueden acceder o escribir archivos en el dispositivo. Montaje manual de sistemas de archivos Los administradores usan el comando mount para conectar manualmente el dispositivo a una ubicación de directorio o punto de montaje. El comando mount espera el dispositivo, el punto de montaje y, opcionalmente, las opciones del sistema de archivos como argumentos. Las opciones del sistema de archivos personalizan el comportamiento del sistema de archivos. [root@host ~]# mount /dev/vdb1 /mnt También puede usar el comando mount para ver los sistemas de archivos montados actualmente, los puntos de montaje y las opciones. [root@host ~]# mount | grep vdb1 /dev/vdb1 on /mnt type xfs (rw,relatime,seclabel,attr2,inode64,noquota) Montaje de forma persistente de sistemas de archivos Montar manualmente un sistema de archivos es una buena manera de verificar que un dispositivo formateado sea accesible y funcione de la manera esperada. Sin embargo, cuando el servidor se reinicia, el sistema no vuelve a montar automáticamente el sistema de archivos en el árbol de directorios; los datos están intactos en el sistema de archivos, pero los usuarios no pueden acceder a ellos. Para asegurarse de que el sistema monte automáticamente el sistema de archivos en el arranque del sistema, agregue una entrada al archivo /etc/fstab. Este archivo de configuración enumera los sistemas de archivos para montar en el arranque del sistema. /etc/fstab es un archivo delimitado por espacios en blanco con seis campos por línea. RH134-RHEL8.2-es-1-20200928 165 capítulo 6 | Administración de almacenamiento básico [root@host ~]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Wed Feb 13 16:39:59 2019 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # UUID=a8063676-44dd-409a-b584-68be2c9f5570 / xfs defaults 0 0 UUID=7a20315d-ed8b-4e75-a5b6-24ff9e1f9838 /dbdata xfs defaults 0 0 Cuando agregue o elimine una entrada en el archivo /etc/fstab, ejecute el comando systemctl daemon-reload, o reinicie el servidor, para systemd para registrar la nueva configuración. [root@host ~]# systemctl daemon-reload El primer campo especifica el dispositivo. En este ejemplo, se usa el UUID para especificar el dispositivo. Los sistemas de archivos crean y almacenan el UUID en su superbloque en el momento de la creación. O puede usar el archivo del dispositivo, como /dev/vdb1. nota Es preferible usar el UUID porque los identificadores del dispositivo de bloques pueden cambiar en determinadas situaciones, como en el caso de que un proveedor de la nube cambie la capa de almacenamiento subyacente de una máquina virtual, o que los discos se detecten en un orden diferente con cada arranque del sistema. El nombre del archivo del dispositivo de bloque puede cambiar, pero el UUID permanece constante en el superbloque del sistema de archivos. Use el comando lsblk --fs para escanear los dispositivos de bloque conectados a una máquina y recuperar los UUID del sistema de archivos. [root@host ~]# lsblk --fs NAME FSTYPE LABEL UUID MOUNTPOINT sr0 vda └─vda1 xfs a8063676-44dd-409a-b584-68be2c9f5570 / vdb └─vdb1 xfs 7a20315d-ed8b-4e75-a5b6-24ff9e1f9838 /dbdata El segundo campo es el punto de montaje del directorio, desde el cual se podrá acceder al dispositivo de bloque en la estructura del directorio. El punto de montaje debe existir; de lo contrario, créelo con el comando mkdir. El tercer campo contiene el tipo del sistema de archivos, como xfs o ext4. 166 RH134-RHEL8.2-es-1-20200928 capítulo 6 | Administración de almacenamiento básico El cuarto campo es la lista de opciones separada por comas para aplicar al dispositivo. defaults es un conjunto de opciones que se usan comúnmente. La página del manual mount(8) documenta las otras opciones disponibles. El quinto campo es usado por el comando dump para hacer una copia de seguridad del dispositivo. Otras aplicaciones de copia de seguridad no suelen usar este campo. El último campo, el campo de orden de fsck, determina si debería ejecutarse el comando fsck en el arranque del sistema para verificar que los sistemas de archivos estén limpios. El valor en este campo indica el orden en el que debe ejecutarse fsck. Para sistemas de archivos XFS, establezca este campo en 0 porque XFS no usa fsck para comprobar el estado de su sistema de archivos. Para sistemas de archivos ext4, configúrelo en 1 para el sistema de archivos raíz y en 2 para los otros sistemas de archivos ext4. De esta manera, fsck primero procesa el sistema de archivos raíz y, luego, verifica los sistemas de archivos en discos separados al mismo tiempo, y los sistemas de archivos en el mismo disco en secuencia. nota Si hay una entrada incorrecta en /etc/fstab, es posible que la máquina no pueda volver a arrancarse. Los administradores deben comprobar que la entrada sea válida al desmontar el sistema de archivos nuevo y usar mount /mountpoint, que lee / etc/fstab, para montar el sistema de archivos nuevamente. Si el comando mount arroja un error, corríjalo antes de volver a arrancar la máquina. Como alternativa, puede usar el comando findmnt --verify para controlar el archivo /etc/fstab. Referencias info parted( Manual de usuario de GNU Parted ) Páginas del manual parted(8), mkfs(8), mount(8), lsblk(8) y fstab(5) Para obtener más información, consulte la guía Configuración y administración de sistemas de archivos en https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/htmlsingle/configuring_and_managing_file_systems/ RH134-RHEL8.2-es-1-20200928 167 capítulo 6 | Administración de almacenamiento básico Ejercicio Guiado Adición de particiones, sistemas de archivos y montajes persistentes En este ejercicio, creará una partición en un nuevo dispositivo de almacenamiento, la formateará con un sistema de archivos XFS, la configurará para que se monte en el arranque y la montará para su uso. Resultados Debería ser capaz de usar parted , mkfs.xfs y otros comandos para crear una partición en un disco nuevo, formatearla y montarla de manera persistente. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab storage-partitions start. Este comando ejecuta un script de inicio que determina si la máquina servera es accesible en la red. También prepara el segundo disco en servera para el ejercicio. [student@workstation ~]$ lab storage-partitions start 1. Use el comando ssh para iniciar sesión en servera como el usuario student. Los sistemas se configuran para que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Use el comando sudo -i para cambiar al usuario root. Si se le solicita, use student como la contraseña. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 3. Use parted para crear una nueva etiqueta de disco de tipo msdos en el disco /dev/vdb para preparar ese nuevo disco para el esquema de partición MBR. [root@servera ~]# parted /dev/vdb mklabel msdos Information: You may need to update /etc/fstab. 168 RH134-RHEL8.2-es-1-20200928 capítulo 6 | Administración de almacenamiento básico 4. Agregue una nueva partición primaria que tenga un tamaño de 1 GiB. Para una correcta alineación, inicie la partición en el sector 2048. Establezca el tipo de sistema de archivo de la partición en XFS. 4.1. Use el modo interactivo parted para poder crear la partición. [root@servera ~]# parted /dev/vdb GNU Parted 3.2 Using /dev/vdb Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) mkpart Partition type? primary/extended? primary File system type? [ext2]? xfs Start? 2048s End? 1001MB (parted) quit Information: You may need to update /etc/fstab. Dado que la partición comienza en el sector 2048, el comando anterior establece la posición final en 1001MB para obtener un tamaño de partición de 1000MB (1 GB). Como alternativa, puede realizar la misma operación con el siguiente comando no interactivo: parted /dev/vdb mkpart primary xfs 2048s 1001MB 4.2. Verifique su trabajo enumerando las particiones en /dev/vdb. [root@servera ~]# parted /dev/vdb print Model: Virtio Block Device (virtblk) Disk /dev/vdb: 5369MB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number 1 Start 1049kB End 1001MB Size 1000MB Type primary File system Flags 4.3. Ejecute el comando udevadm settle. Este comando espera a que el sistema registre la nueva partición y regresa cuando finaliza. [root@servera ~]# udevadm settle 5. Formatee la nueva partición con el sistema de archivos XFS. [root@servera ~]# mkfs.xfs /dev/vdb1 meta-data=/dev/vdb1 isize=512 = sectsz=512 = crc=1 = reflink=1 data = bsize=4096 = sunit=0 naming =version 2 bsize=4096 log =internal log bsize=4096 = sectsz=512 realtime =none extsz=4096 RH134-RHEL8.2-es-1-20200928 agcount=4, agsize=61056 blks attr=2, projid32bit=1 finobt=1, sparse=1, rmapbt=0 blocks=244224, imaxpct=25 swidth=0 blks ascii-ci=0, ftype=1 blocks=1566, version=2 sunit=0 blks, lazy-count=1 blocks=0, rtextents=0 169 capítulo 6 | Administración de almacenamiento básico 6. Configure el nuevo sistema de archivos para montarlo de forma persistente en /archive. 6.1. Use mkdir para crear el punto de montaje del directorio /archive. [root@servera ~]# mkdir /archive 6.2. Use el comando lsblk con la opción --fs para descubrir el UUID del dispositivo / dev/vdb1. [root@servera ~]# lsblk --fs /dev/vdb NAME FSTYPE LABEL UUID MOUNTPOINT vdb └─vdb1 xfs e3db1abe-6d96-4faa-a213-b96a6f85dcc1 El UUID en la salida anterior es probablemente diferente en su sistema. 6.3. Agregue una entrada a /etc/fstab. En el siguiente contenido, reemplace el UUID con el que descubrió en el paso anterior. ...output omitted... UUID=e3db1abe-6d96-4faa-a213-b96a6f85dcc1 /archive xfs defaults 0 0 6.4. Actualice systemd para que el sistema registre la configuración de /etc/fstab nueva. [root@servera ~]# systemctl daemon-reload 6.5. Ejecute el comando mount /archive para montar el sistema de archivos nuevo usando la nueva entrada agregada a /etc/fstab. [root@servera ~]# mount /archive 6.6. Verifique que el sistema de archivos nuevo esté montado en /archive. [root@servera ~]# mount | grep /archive /dev/vdb1 on /archive type xfs (rw,relatime,seclabel,attr2,inode64,noquota) 7. Reinicie servera. Después de reiniciar el servidor, inicie sesión y verifique que /dev/vdb1 se monte en /archive. Cuando finalice, cierre sesión en servera. 7.1. Reinicie servera. [root@servera ~]# systemctl reboot Connection to servera closed by remote host. Connection to servera closed. [student@workstation ~]$ 7.2. 170 Espere unos minutos a que se reinicie servera e inicie sesión como el usuario student. RH134-RHEL8.2-es-1-20200928 capítulo 6 | Administración de almacenamiento básico [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 7.3. Verifique que /dev/vdb1 esté montado en /archive. [student@servera ~]$ mount | grep /archive /dev/vdb1 on /archive type xfs (rw,relatime,seclabel,attr2,inode64,noquota) 7.4. Cierre sesión en servera. [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute el script lab storage-partitions finish para terminar este ejercicio. [student@workstation ~]$ lab storage-partitions finish Esto concluye el ejercicio guiado. RH134-RHEL8.2-es-1-20200928 171 capítulo 6 | Administración de almacenamiento básico Administración de espacio de intercambio Objetivos Tras completar esta sección, debería ser capaz de crear y administrar espacios de intercambio para complementar la memoria física. Introducción a los conceptos de espacio de intercambio Un espacio de intercambio es un área del disco bajo el control del subsistema de administración de memoria del kernel Linux. El kernel usa espacio de intercambio para complementar la memoria RAM del sistema al contener páginas inactivas de memoria. La combinación de la memoria RAM del sistema más el espacio de intercambio se denomina memoria virtual. Cuando el uso de la memoria en un sistema supera un límite definido, el kernel busca en la memoria RAM páginas de memoria asignadas a los procesos, pero inactivas. El kernel escribe las páginas inactivas en el área de intercambio y, luego, reasigna la página RAM a otros procesos. Si el programa requiere acceso a una página en el disco, el kernel localiza otra página de memoria inactiva, la escribe en el disco y, luego, vuelve a convocar la página necesaria desde el área de intercambio. Dado que las áreas de intercambio residen en el disco, el intercambio es lento cuando se lo compara con la memoria RAM. Si bien se usa para aumentar la memoria RAM del sistema, no debe considerar el espacio de intercambio como una solución sostenible para una RAM insuficiente para su carga de trabajo. Tamaño del espacio de intercambio Los administradores deben establecer el tamaño del espacio de intercambio en función de la carga de trabajo de memoria en el sistema. Los proveedores de aplicaciones a veces proporcionan recomendaciones sobre ese tema. En la siguiente tabla, se proporcionan algunas instrucciones basadas en la cantidad total de memoria física. Recomendaciones de memoria RAM y espacio de intercambio RAM Espacio de intercambio Espacio de intercambio si se permite la hibernación 2 GiB o menos Dos veces la memoria RAM Tres veces la memoria RAM Entre 2 GiB y 8 GiB Igual que la memoria RAM Dos veces la memoria RAM Entre 8 GiB y 64 GiB Al menos 4 GiB 1,5 veces la memoria RAM Mas de 64 GiB Al menos 4 GiB No se recomienda la hibernación. La función de hibernación de los equipos portátiles y de escritorio usa el espacio de intercambio para guardar el contenido de la memoria RAM antes de apagar el sistema. Cuando vuelve a 172 RH134-RHEL8.2-es-1-20200928 capítulo 6 | Administración de almacenamiento básico encender el sistema, el kernel restaura el contenido de la memoria RAM desde el espacio de intercambio y no necesita un arranque completo. Para esos sistemas, el espacio de intercambio debe ser mayor que la cantidad de memoria RAM. El artículo de la base de conocimiento en la sección de referencia al final de esta sección brinda más orientación sobre el tamaño del espacio de intercambio. Creación de un espacio de intercambio Para crear un espacio de intercambio, debe realizar lo siguiente: • Cree una partición con un tipo de sistema de archivos de linux-swap. • Coloque una firma de intercambio en el dispositivo. Creación de una partición de intercambio Use parted para crear una partición del tamaño deseado y establezca su tipo de sistema de archivos en linux-swap. Anteriormente, las herramientas observaban el tipo de sistema de archivos de la partición para determinar si el dispositivo debía activarse; no obstante, eso ya no sucede. Si bien las utilidades ya no usan el tipo de sistema de archivos de la partición, establecer ese tipo permite a los administradores determinar rápidamente el propósito de la partición. En el siguiente ejemplo, se crea una partición de 256 MB. [root@host ~]# parted /dev/vdb GNU Parted 3.2 Using /dev/vdb Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) print Model: Virtio Block Device (virtblk) Disk /dev/vdb: 5369MB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number 1 Start 1049kB End 1001MB Size 1000MB File system Name data Flags (parted) mkpart Partition name? []? swap1 File system type? [ext2]? linux-swap Start? 1001MB End? 1257MB (parted) print Model: Virtio Block Device (virtblk) Disk /dev/vdb: 5369MB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number 1 2 Start 1049kB 1001MB End 1001MB 1257MB Size 1000MB 256MB File system linux-swap(v1) Name data swap1 Flags (parted) quit RH134-RHEL8.2-es-1-20200928 173 capítulo 6 | Administración de almacenamiento básico Information: You may need to update /etc/fstab. [root@host ~]# Después de crear la partición, ejecute el comando udevadm settle. Este comando espera que el sistema detecte la nueva partición y cree el archivo de dispositivo asociado en /dev. Sólo regresa cuando finaliza. [root@host ~]# udevadm settle [root@host ~]# Formateo del dispositivo El comando mkswap aplica una firma de intercambio al dispositivo. A diferencia de otras utilidades de formateo, mkswap escribe un único bloque de datos al inicio del dispositivo, dejando el resto del dispositivo sin formatear de modo que el kernel pueda usarlo para almacenar páginas de memoria. [root@host ~]# mkswap /dev/vdb2 Setting up swapspace version 1, size = 244 MiB (255848448 bytes) no label, UUID=39e2667a-9458-42fe-9665-c5c854605881 Activación de un espacio de intercambio Puede usar el comando swapon para activar un espacio de intercambio formateado. Use swapon con el dispositivo como parámetro, o use swapon -a para activar todos los espacios de intercambio detallados en el archivo /etc/fstab. Use los comandos swapon --show y free para inspeccionar los espacios de intercambio disponibles. [root@host ~]# free total used Mem: 1873036 134688 Swap: 0 0 [root@host ~]# swapon /dev/vdb2 [root@host ~]# free total used Mem: 1873036 135044 Swap: 249852 0 free 1536436 0 shared 16748 buff/cache 201912 available 1576044 free 1536040 249852 shared 16748 buff/cache 201952 available 1575680 Puede desactivar un espacio de intercambio con el comando swapoff. Si el espacio de intercambio tiene páginas escritas, swapoff intenta mover esas páginas a otros espacios de intercambio activos o volver a la memoria. Si no puede escribir datos en otros lugares, el comando swapoff falla, con un error, y el espacio de intercambio permanece activo. Activación del espacio de intercambio de forma persistente Para activar un espacio de intercambio en cada arranque, coloque una entrada en el archivo / etc/fstab. En el siguiente ejemplo, se muestra una línea típica en /etc/fstab basada en el espacio de intercambio creado anteriormente. UUID=39e2667a-9458-42fe-9665-c5c854605881 174 swap swap defaults 0 0 RH134-RHEL8.2-es-1-20200928 capítulo 6 | Administración de almacenamiento básico El ejemplo anterior usa el UUID como el primer campo. Cuando formatea el dispositivo, el comando mkswap muestra ese UUID. Si perdió la salida de mkswap, use el comando lsblk --fs. Como alternativa, también puede usar el nombre del dispositivo en el primer campo. El segundo campo se reserva típicamente para el punto de montaje. Sin embargo, para dispositivos de intercambio, que no son accesibles a través de la estructura del directorio, este campo toma el valor del marcador de posición swap. La página man fstab(5) usa un valor de marcador de posición de none; sin embargo, el uso de un valor de swap permite mensajes de error más informativos en el caso de que algo salga mal. El tercer campo es el tipo de sistema de archivos. El tipo de sistemas de archivos para un espacio de intercambio es swap. El cuarto campo es para opciones. El ejemplo usa la opción defaults. La opción defaults incluye la opción de montaje auto, que significa activar el espacio de intercambio automáticamente en el arranque del sistema. Los dos campos finales son el indicador dump y el orden fsck. Los espacios de intercambio no requieren copias de seguridad ni revisión del sistema de archivos y por lo tanto, estos campos deben establecerse en cero. Cuando agregue o elimine una entrada en el archivo /etc/fstab, ejecute el comando systemctl daemon-reload, o reinicie el servidor, para systemd para registrar la nueva configuración. [root@host ~]# systemctl daemon-reload Configuración de la prioridad de espacio de intercambio De forma predeterminada, el sistema usa espacios de intercambio en serie, lo que significa que el kernel usa el primer espacio de intercambio activado hasta que esté lleno; luego, el kernel empieza a usar el segundo espacio de intercambio. Sin embargo, puede definir una prioridad para cada espacio de intercambio para forzar ese orden. Para establecer la prioridad, use la opción pri en /etc/fstab. El kernel usa el espacio de intercambio con la prioridad más alta primero. La prioridad predeterminada es -2. En el siguiente ejemplo, se muestran tres espacios de intercambio definidos en /etc/fstab. El kernel usa la última entrada primero, con pri=10. Cuando ese espacio está lleno, usa la segunda entrada, con pri=4. Por último, usa la primera entrada, que tiene una prioridad predeterminada de -2. UUID=af30cbb0-3866-466a-825a-58889a49ef33 UUID=39e2667a-9458-42fe-9665-c5c854605881 UUID=fbd7fa60-b781-44a8-961b-37ac3ef572bf swap swap swap swap swap swap defaults pri=4 pri=10 0 0 0 0 0 0 Use swapon --show para visualizar las prioridades de espacio de intercambio. Cuando los espacios de intercambio tienen la misma prioridad, el kernel los escribe con el método Round-Robin. RH134-RHEL8.2-es-1-20200928 175 capítulo 6 | Administración de almacenamiento básico Referencias Páginas del manual mkswap(8), swapon(8), swapoff(8), mount(8) y parted(8) Base de conocimiento: ¿Cuál es el tamaño de intercambio (swap) recomendado para las plataformas Red Hat? https://access.redhat.com/solutions/15244 176 RH134-RHEL8.2-es-1-20200928 capítulo 6 | Administración de almacenamiento básico Ejercicio Guiado Administración de espacio de intercambio En este ejercicio, creará y formateará una partición para usar como espacio de intercambio, la formateará como intercambio y la activará de forma persistente. Resultados Debería poder crear una partición y un espacio de intercambio en un disco con el esquema de partición GPT. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab storage-swap start. Este comando ejecuta un script de inicio que determina si la máquina servera es accesible en la red. También prepara el segundo disco en servera para el ejercicio. [student@workstation ~]$ lab storage-swap start 1. Use el comando ssh para iniciar sesión en servera como el usuario student. Los sistemas se configuran para que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Use el comando sudo -i para cambiar al usuario root. Si se le solicita, use student como la contraseña. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 3. Use el comando parted para inspeccionar el disco /dev/vdb. [root@servera ~]# parted /dev/vdb print Model: Virtio Block Device (virtblk) Disk /dev/vdb: 5369MB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: RH134-RHEL8.2-es-1-20200928 177 capítulo 6 | Administración de almacenamiento básico Number 1 Start 1049kB End 1001MB Size 1000MB File system Name data Flags Observe que el disco ya tiene una tabla de particiones y usa el esquema de partición GPT. Además, ya existe una partición de 1 GB. 4. Agregue una nueva partición con un tamaño de 500 MB para usar como espacio de intercambio. Establezca el tipo de partición en linux-swap. 4.1. Use parted para crear la partición. Dado que el disco usa el esquema de partición GPT, debe asignarle un nombre a la partición. Asígnele el nombre myswap. [root@servera ~]# parted /dev/vdb mkpart myswap linux-swap \ 1001MB 1501MB Information: You may need to update /etc/fstab. Observe en el comando anterior que la posición inicial, 1001 MB, es el final de la primera partición existente. De esta manera parted se asegura de que la nueva partición siga inmediatamente a la anterior, sin ninguna brecha. Dado que la partición comienza en la posición 1001 MB, el comando establece la posición final en 1501 MB para obtener un tamaño de partición de 500 MB. 4.2. Verifique su trabajo enumerando las particiones en /dev/vdb. [root@servera ~]# parted /dev/vdb print Model: Virtio Block Device (virtblk) Disk /dev/vdb: 5369MB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number 1 2 Start 1049kB 1001MB End 1001MB 1501MB Size 1000MB 499MB File system Name Flags data myswap swap El tamaño de la nueva partición no es exactamente 500 MB. Esto es porque parted tiene que alinear la partición con el diseño del disco. 4.3. Ejecute el comando udevadm settle. Este comando espera a que el sistema registre la nueva partición y regresa cuando finaliza. [root@servera ~]# udevadm settle 5. Inicialice la partición creada recientemente como espacio de intercambio. [root@servera ~]# mkswap /dev/vdb2 Setting up swapspace version 1, size = 476 MiB (499118080 bytes) no label, UUID=cb7f71ca-ee82-430e-ad4b-7dda12632328 6. Habilite el espacio de intercambio creado recientemente. 6.1. 178 Use el comando swapon --show para mostrar que la creación e inicialización del espacio de intercambio no lo habilita aún para su uso. RH134-RHEL8.2-es-1-20200928 capítulo 6 | Administración de almacenamiento básico [root@servera ~]# swapon --show 6.2. Habilite el espacio de intercambio creado recientemente. [root@servera ~]# swapon /dev/vdb2 6.3. Verifique que el espacio de intercambio creado recientemente ahora esté disponible. [root@servera ~]# swapon --show NAME TYPE SIZE USED PRIO /dev/vdb2 partition 476M 0B -2 6.4. Deshabilite el espacio de intercambio. [root@servera ~]# swapoff /dev/vdb2 6.5. Confirme que el espacio de intercambio está deshabilitado. [root@servera ~]# swapon --show 7. Configure el nuevo espacio de intercambio para que esté habilitado en el arranque del sistema. 7.1. Use el comando lsblk con la opción --fs para descubrir el UUID del dispositivo / dev/vdb2. [root@servera ~]# lsblk --fs /dev/vdb2 NAME FSTYPE LABEL UUID MOUNTPOINT vdb2 swap cb7f71ca-ee82-430e-ad4b-7dda12632328 El UUID en la salida anterior es probablemente diferente en su sistema. 7.2. Agregue una entrada a /etc/fstab. En el siguiente comando, reemplace el UUID con el que descubrió en el paso anterior. ...output omitted... UUID=cb7f71ca-ee82-430e-ad4b-7dda12632328 7.3. swap swap defaults 0 0 Actualice systemd para que el sistema registre la configuración de /etc/fstab nueva. [root@servera ~]# systemctl daemon-reload 7.4. Habilite el espacio de intercambio con la nueva entrada recién agregada a /etc/ fstab. [root@servera ~]# swapon -a 7.5. Verifique que el nuevo espacio de intercambio esté habilitado. RH134-RHEL8.2-es-1-20200928 179 capítulo 6 | Administración de almacenamiento básico [root@servera ~]# swapon --show NAME TYPE SIZE USED PRIO /dev/vdb2 partition 476M 0B -2 8. Reinicie servera. Después de reiniciar el servidor, inicie sesión y verifique que el espacio de intercambio esté habilitado. Cuando finalice, cierre sesión en servera. 8.1. Reinicie servera. [root@servera ~]# systemctl reboot Connection to servera closed by remote host. Connection to servera closed. [student@workstation ~]$ 8.2. Espere unos minutos a que se reinicie servera e inicie sesión como el usuario student. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 8.3. Verifique que el espacio de intercambio esté habilitado. [root@servera ~]# swapon --show NAME TYPE SIZE USED PRIO /dev/vdb2 partition 476M 0B -2 8.4. Cierre sesión en servera. [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute el script lab storage-swap finish para terminar este ejercicio. [student@workstation ~]$ lab storage-swap finish Esto concluye el ejercicio guiado. 180 RH134-RHEL8.2-es-1-20200928 capítulo 6 | Administración de almacenamiento básico Trabajo de laboratorio Administración de almacenamiento básico Lista de verificación de rendimiento En este trabajo de laboratorio, creará varias particiones en un disco nuevo, formateará algunas con sistemas de archivos y las montará, y activará otras como espacios de intercambio. Resultados Usted deberá ser capaz de realizar lo siguiente: • Visualizar y crear particiones con el comando parted. • Crear nuevos sistemas de archivos en particiones y montarlos de forma persistente. • Crear espacios de intercambio y activarlos en el arranque. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab storage-review start. Este comando ejecuta un script de inicio que determina si la máquina serverb es accesible en la red. También prepara el segundo disco en serverb para el ejercicio. [student@workstation ~]$ lab storage-review start 1. Hay nuevos discos disponibles en serverb. En el primer disco nuevo, cree una partición GPT de 2 GB denominada copia de seguridad. Dado que puede ser difícil establecer el tamaño exacto, un tamaño entre 1,8 GB y 2,2 GB es aceptable. Establezca el tipo de sistema de archivos correcto en esa partición para alojar un sistema de archivos XFS. La contraseña para la cuenta de usuario student en serverb es student. Este usuario tiene acceso completo root a través de sudo. 2. Formatee la partición de 2 GB con un sistema de archivos XFS y móntelo de manera persistente en /backup. 3. En el mismo disco nuevo, cree dos particiones GPT de 512 MB denominadas swap1 y swap2. Un tamaño entre 460 MB y 564 MB es aceptable. Establezca el tipo de sistema de archivos correcto en esas particiones para alojar espacios de intercambio. 4. Inicialice las dos particiones de 512 MiB como espacios de intercambio y configúrelas para que se activen en el arranque. Establezca el espacio de intercambio en la partición swap2 para que se prefiera sobre el otro. 5. Para verificar su trabajo, reinicie serverb. Confirme que el sistema monta automáticamente la primera partición en /backup. Además, confirme que el sistema activa los dos espacios de intercambio. Cuando finalice, cierre sesión en serverb. RH134-RHEL8.2-es-1-20200928 181 capítulo 6 | Administración de almacenamiento básico Evaluación En workstation, ejecute el script lab storage-review grade para confirmar que ha realizado correctamente este ejercicio. [student@workstation ~]$ lab storage-review grade Finalizar En workstation, ejecute el script lab storage-review finish para terminar el trabajo de laboratorio. [student@workstation ~]$ lab storage-review finish Esto concluye el trabajo de laboratorio. 182 RH134-RHEL8.2-es-1-20200928 capítulo 6 | Administración de almacenamiento básico Solución Administración de almacenamiento básico Lista de verificación de rendimiento En este trabajo de laboratorio, creará varias particiones en un disco nuevo, formateará algunas con sistemas de archivos y las montará, y activará otras como espacios de intercambio. Resultados Usted deberá ser capaz de realizar lo siguiente: • Visualizar y crear particiones con el comando parted. • Crear nuevos sistemas de archivos en particiones y montarlos de forma persistente. • Crear espacios de intercambio y activarlos en el arranque. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab storage-review start. Este comando ejecuta un script de inicio que determina si la máquina serverb es accesible en la red. También prepara el segundo disco en serverb para el ejercicio. [student@workstation ~]$ lab storage-review start 1. Hay nuevos discos disponibles en serverb. En el primer disco nuevo, cree una partición GPT de 2 GB denominada copia de seguridad. Dado que puede ser difícil establecer el tamaño exacto, un tamaño entre 1,8 GB y 2,2 GB es aceptable. Establezca el tipo de sistema de archivos correcto en esa partición para alojar un sistema de archivos XFS. La contraseña para la cuenta de usuario student en serverb es student. Este usuario tiene acceso completo root a través de sudo. 1.1. Use el comando ssh para iniciar sesión en serverb como el usuario student. Los sistemas se configuran para que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@serverb ...output omitted... [student@serverb ~]$ 1.2. Dado que crear particiones y sistemas de archivos requiere acceso root, use el comando sudo -i para cambiar al usuario root. Si se le solicita, use student como la contraseña. RH134-RHEL8.2-es-1-20200928 183 capítulo 6 | Administración de almacenamiento básico [student@serverb ~]$ sudo -i [sudo] password for student: student [root@serverb ~]# 1.3. Use el comando lsblk para identificar los nuevos discos. Esos discos no deberían tener particiones todavía. [root@serverb ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom vda 252:0 0 10G 0 disk └─vda1 252:1 0 10G 0 part / vdb 252:16 0 5G 0 disk vdc 252:32 0 5G 0 disk vdd 252:48 0 5G 0 disk Tenga en cuenta que el primer disco nuevo, vdb, no tiene particiones. 1.4. Confirme que el disco no tiene etiqueta. [root@serverb ~]# parted /dev/vdb print Error: /dev/vdb: unrecognised disk label Model: Virtio Block Device (virtblk) Disk /dev/vdb: 5369MB Sector size (logical/physical): 512B/512B Partition Table: unknown Disk Flags: 1.5. Use parted y el subcomando mklabel para definir el esquema de partición GPT. [root@serverb ~]# parted /dev/vdb mklabel gpt Information: You may need to update /etc/fstab. 1.6. Cree la partición de 2 GB. Asígnele el nombre copia de seguridad y establezca su tipo en xfs. Inicie la partición en el sector 2048. [root@serverb ~]# parted /dev/vdb mkpart backup xfs 2048s 2GB Information: You may need to update /etc/fstab. 1.7. Confirme la correcta creación de la nueva partición. [root@serverb ~]# parted /dev/vdb print Model: Virtio Block Device (virtblk) Disk /dev/vdb: 5369MB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number 1 184 Start 1049kB End 2000MB Size 1999MB File system Name backup Flags RH134-RHEL8.2-es-1-20200928 capítulo 6 | Administración de almacenamiento básico 1.8. Ejecute el comando udevadm settle. Este comando espera que el sistema detecte la nueva partición y cree el archivo de dispositivo /dev/vdb1. Sólo regresa cuando finaliza. [root@serverb ~]# udevadm settle [root@serverb ~]# 2. Formatee la partición de 2 GB con un sistema de archivos XFS y móntelo de manera persistente en /backup. 2.1. Use el comandomkfs.xfs para formatear la partición /dev/vbd1. [root@serverb ~]# mkfs.xfs /dev/vdb1 meta-data=/dev/vdb1 isize=512 = sectsz=512 = crc=1 = reflink=1 data = bsize=4096 = sunit=0 naming =version 2 bsize=4096 log =internal log bsize=4096 = sectsz=512 realtime =none extsz=4096 2.2. agcount=4, agsize=121984 blks attr=2, projid32bit=1 finobt=1, sparse=1, rmapbt=0 blocks=487936, imaxpct=25 swidth=0 blks ascii-ci=0, ftype=1 blocks=2560, version=2 sunit=0 blks, lazy-count=1 blocks=0, rtextents=0 Cree el punto de montaje /backup. [root@serverb ~]# mkdir /backup [root@serverb ~]# 2.3. Antes de agregar el nuevo sistema de archivos a /etc/fstab, recupere su UUID. [root@serverb ~]# lsblk --fs /dev/vdb1 NAME FSTYPE LABEL UUID MOUNTPOINT vdb1 xfs a3665c6b-4bfb-49b6-a528-74e268b058dd El UUID en su sistema es probablemente diferente. 2.4. Edite /etc/fstab y defina el nuevo sistema de archivos. [root@serverb ~]# vim /etc/fstab ...output omitted... UUID=a3665c6b-4bfb-49b6-a528-74e268b058dd 2.5. /backup xfs defaults 0 0 Fuerce a systemd para que vuelva a leer el archivo /etc/fstab. [root@serverb ~]# systemctl daemon-reload [root@serverb ~]# 2.6. Monte manualmente /backup para verificar su trabajo. Confirme que el montaje es correcto. RH134-RHEL8.2-es-1-20200928 185 capítulo 6 | Administración de almacenamiento básico [root@serverb ~]# mount /backup [root@serverb ~]# mount | grep /backup /dev/vdb1 on /backup type xfs (rw,relatime,seclabel,attr2,inode64,noquota) En el mismo disco nuevo, cree dos particiones GPT de 512 MB denominadas swap1 y swap2. Un tamaño entre 460 MB y 564 MB es aceptable. Establezca el tipo de sistema de archivos correcto en esas particiones para alojar espacios de intercambio. 3. 3.1. Recupere la posición final de la primera partición visualizando la tabla de particiones actual en /dev/vdb. En el siguiente paso, use ese valor como el inicio de la partición swap1. [root@serverb ~]# parted /dev/vdb print Model: Virtio Block Device (virtblk) Disk /dev/vdb: 5369MB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number 1 3.2. Start 1049kB End 2000MB Size 1999MB File system xfs Name backup Flags Cree la primera partición de 512 MB denominada swap1. Establezca su tipo en linuxswap. Use la posición final de la primera partición como punto de partida. La posición final es 2000 MB + 512 MB = 2512 MB [root@serverb ~]# parted /dev/vdb mkpart swap1 linux-swap 2000MB 2512M Information: You may need to update /etc/fstab. 3.3. Cree la segunda partición de 512 MB denominada swap2. Establezca su tipo en linux-swap. Use la posición final de la partición anterior como punto de partida: 2512M. La posición final es 2512 MB + 512 MB = 3024 MB [root@serverb ~]# parted /dev/vdb mkpart swap2 linux-swap 2512M 3024M Information: You may need to update /etc/fstab. 3.4. Visualice la tabla de particiones para verificar su trabajo. [root@serverb ~]# parted /dev/vdb print Model: Virtio Block Device (virtblk) Disk /dev/vdb: 5369MB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number 1 2 3 186 Start 1049kB 2000MB 2512MB End 2000MB 2512MB 3024MB Size 1999MB 513MB 512MB File system xfs Name backup swap1 swap2 Flags swap swap RH134-RHEL8.2-es-1-20200928 capítulo 6 | Administración de almacenamiento básico 3.5. Ejecute el comando udevadm settle. Este comando espera que el sistema registre las nuevas particiones y cree los archivos de dispositivo. [root@serverb ~]# udevadm settle [root@serverb ~]# 4. Inicialice las dos particiones de 512 MiB como espacios de intercambio y configúrelas para que se activen en el arranque. Establezca el espacio de intercambio en la partición swap2 para que se prefiera sobre el otro. 4.1. Use el comando mkswap para inicializar las particiones de intercambio. [root@serverb ~]# mkswap /dev/vdb2 Setting up swapspace version 1, size = 489 MiB (512749568 bytes) no label, UUID=87976166-4697-47b7-86d1-73a02f0fc803 [root@serverb ~]# mkswap /dev/vdb3 Setting up swapspace version 1, size = 488 MiB (511700992 bytes) no label, UUID=4d9b847b-98e0-4d4e-9ef7-dfaaf736b942 Tome nota de los UUID de los dos espacios de intercambio. Usará esa información en el siguiente paso. Si ya no puede ver la salida mkswap, use el comando lsblk --fs para recuperar los UUID. 4.2. Edite /etc/fstab y defina los nuevos espacios de intercambio. Para configurar el espacio de intercambio en la partición swap2 para ser preferido sobre swap1, otórguele una mayor prioridad con la opción pri. [root@serverb ~]# vim /etc/fstab ...output omitted... UUID=a3665c6b-4bfb-49b6-a528-74e268b058dd UUID=87976166-4697-47b7-86d1-73a02f0fc803 UUID=4d9b847b-98e0-4d4e-9ef7-dfaaf736b942 /backup xfs swap swap swap swap defaults pri=10 pri=20 0 0 0 0 0 0 4.3. Fuerce a systemd para que vuelva a leer el archivo /etc/fstab. [root@serverb ~]# systemctl daemon-reload [root@serverb ~]# 4.4. Use el comando swapon -a para activar los nuevos espacios de intercambio. Use el comando swapon --show para confirmar la correcta activación de los espacios de intercambio. [root@serverb ~]# swapon -a [root@serverb ~]# swapon --show NAME TYPE SIZE USED PRIO /dev/vdb2 partition 489M 0B 10 /dev/vdb3 partition 488M 0B 20 5. Para verificar su trabajo, reinicie serverb. Confirme que el sistema monta automáticamente la primera partición en /backup. Además, confirme que el sistema activa los dos espacios de intercambio. Cuando finalice, cierre sesión en serverb. RH134-RHEL8.2-es-1-20200928 187 capítulo 6 | Administración de almacenamiento básico 5.1. Reinicie serverb. [root@serverb ~]# systemctl reboot [root@serverb ~]# Connection to serverb closed by remote host. Connection to serverb closed. [student@workstation ~]$ 5.2. Espere unos minutos a que se reinicie serverb e inicie sesión como el usuario student. [student@workstation ~]$ ssh student@serverb ...output omitted... [student@serverb ~]$ 5.3. Verifique que el sistema monte automáticamente /dev/vdb1 en /backup. [student@serverb ~]$ mount | grep /backup /dev/vdb1 on /backup type xfs (rw,relatime,seclabel,attr2,inode64,noquota) 5.4. Use el comando swapon --show para confirmar que el sistema activa ambos espacios de intercambio. [student@serverb ~]$ swapon --show NAME TYPE SIZE USED PRIO /dev/vdb2 partition 489M 0B 10 /dev/vdb3 partition 488M 0B 20 5.5. Cierre sesión en serverb. [student@serverb ~]$ exit logout Connection to serverb closed. [student@workstation ~]$ Evaluación En workstation, ejecute el script lab storage-review grade para confirmar que ha realizado correctamente este ejercicio. [student@workstation ~]$ lab storage-review grade Finalizar En workstation, ejecute el script lab storage-review finish para terminar el trabajo de laboratorio. [student@workstation ~]$ lab storage-review finish Esto concluye el trabajo de laboratorio. 188 RH134-RHEL8.2-es-1-20200928 capítulo 6 | Administración de almacenamiento básico Resumen En este capítulo, aprendió lo siguiente: • Usa el comando parted para agregar, modificar y eliminar particiones en discos con esquemas de partición MBR o GPT. • Usa el comando mkfs.xfs para crear sistemas de archivos XFS en particiones de disco. • Necesita agregar comandos de montaje de sistemas de archivos en /etc/fstab para hacer esos montajes persistentes. • Usa el comando mkswap para inicializar espacios de intercambio. RH134-RHEL8.2-es-1-20200928 189 190 RH134-RHEL8.2-es-1-20200928 capítulo 7 Administración de volúmenes lógicos Meta Crear y administrar volúmenes lógicos que contengan sistemas de archivos y espacios de intercambio desde la línea de comandos. Objetivos • Crear y administrar volúmenes lógicos desde dispositivos de almacenamiento y formatearlos con sistemas de archivos o prepararlos con espacios de intercambio. • Agregar y eliminar el almacenamiento asignado a los grupos de volúmenes y ampliar en forma no destructiva el tamaño de un volumen lógico formateado con un sistema de archivos. • Creación de volúmenes lógicos (y ejercicio guiado) • Ampliación de volúmenes lógicos (y ejercicio guiado) Secciones Trabajo de laboratorio RH134-RHEL8.2-es-1-20200928 Administración de volúmenes lógicos 191 capítulo 7 | Administración de volúmenes lógicos Creación de volúmenes lógicos Objetivos Tras finalizar esta sección, usted deberá ser capaz de realizar lo siguiente: • Describir los componentes y conceptos de la administración de volúmenes lógicos. • Implementar almacenamiento del LVM. • Visualizar información de componentes del LVM. Conceptos de la administración de volúmenes lógicos (LVM) Los volúmenes lógicos y la administración de volúmenes lógicos facilitan la administración del espacio del disco. Si un sistema de archivos que aloja un volumen lógico necesita más espacio, se puede asignar a su volumen lógico del espacio libre en su grupo de volúmenes y se puede cambiar el tamaño del sistema de archivos. Si un disco comienza a fallar, se puede registrar un disco de reemplazo como volumen físico con el grupo de volúmenes y las extensiones del volumen lógico se pueden migrar al disco nuevo. Definiciones de LVM Dispositivos físicos Los dispositivos físicos son los dispositivos de almacenamiento usados para guardar los datos almacenados en un volumen lógico. Estos son dispositivos en bloques y podrían ser particiones de discos, discos enteros, arreglos RAID o discos SAN. Un dispositivo debe inicializarse como un volumen físico de LVM para poder ser usado con LVM. Todo el dispositivo se usará como un volumen físico. Volúmenes físicos (PV) Los volúmenes físicos constituyen el almacenamiento "físico" subyacente que se usa con el LVM. Debe inicializar un dispositivo como un volumen físico antes de usarlo en un sistema de LVM. Las herramientas de LVM segmentan volúmenes físicos en extensiones físicas (physical extents, PE); que son pequeños conjuntos de datos que actúan como el bloque de almacenamiento más pequeño en un volumen físico. Grupos de volúmenes (VG) Los grupos de volúmenes son pools (conjuntos) de almacenamiento conformados por uno o más volúmenes físicos. Este es el equivalente funcional de un disco completo en el almacenamiento básico. Un PV solo puede ser asignado a un único VG. Un VG puede constar de espacio sin usar y de cualquier cantidad de volúmenes lógicos. Volúmenes lógicos (LV) Los volúmenes lógicos se crean desde extensiones físicas libres en un grupo de volúmenes y proporcionan el dispositivo de "almacenamiento" usado por aplicaciones, usuarios y el sistema operativo. Los LV son una colección de extensiones lógicas (LE), que se mapean a extensiones físicas, la porción de almacenamiento más pequeña de un PV. De forma predeterminada, cada LE se mapea a una PE. La configuración de opciones de LV específicas cambia este mapeo; por ejemplo, la duplicación hace que cada LE se mapee a dos PE. 192 RH134-RHEL8.2-es-1-20200928 capítulo 7 | Administración de volúmenes lógicos Implementación de almacenamiento del LVM La creación de almacenamiento de LVM requiere varios pasos. El primer paso es determinar qué dispositivos físicos usar. Después de ensamblar un conjunto de dispositivos adecuados, se inicializan como volúmenes físicos para que se reconozcan como pertenecientes a la LVM. Los volúmenes físicos se combinan en un grupo de volúmenes. Esto crea un pool (conjunto) de espacio en disco a partir del cual se pueden asignar volúmenes lógicos. Los volúmenes lógicos creados a partir del espacio disponible en un grupo de volúmenes pueden formatearse con un sistema de archivos, activarse como espacio de intercambio, y montarse o activarse de manera persistente. Figura 7.1: Componentes de la administración de volúmenes lógicos La LVM proporciona un conjunto integral de herramientas de línea de comandos para implementar y administrar almacenamiento de LVM. Estas herramientas de línea de comandos se pueden usar en scripts, lo que las hace más adecuadas para la automatización. Importante En los siguientes ejemplos, se usa el dispositivo vdb y sus particiones para ilustrar comandos LVM. En la práctica, estos ejemplos deberían usar los dispositivos correctos para el disco y las particiones del disco usados por el sistema. Use los comandos lsblk, blkid o cat /proc/partitions para identificar los dispositivos en su sistema. RH134-RHEL8.2-es-1-20200928 193 capítulo 7 | Administración de volúmenes lógicos Creación de un volumen lógico Para crear un volumen lógico, realice los siguientes pasos: Prepare el dispositivo físico. Use parted, gdisk o fdisk para crear una partición para usar con LVM. Configure siempre el tipo de partición en Linux LVM (LVM Linux) en las particiones de LVM; use 0x8e para particiones MBR. Si es necesario, use partprobe para registrar la nueva partición con el kernel. De forma alternativa, use un disco entero, un arreglo RAID o un disco SAN. Solo se necesita preparar un dispositivo físico si no hay ninguno ya preparado, y se requiere un volumen físico nuevo para crear o ampliar un grupo de volúmenes. [root@host ~]# parted -s /dev/vdb mkpart primary 1MiB 769MiB [root@host ~]# parted -s /dev/vdb mkpart primary 770MiB 1026MiB [root@host ~]# parted -s /dev/vdb set 1 lvm on [root@host ~]# parted -s /dev/vdb set 2 lvm on Cree un volumen físico. Use pvcreate para etiquetar la partición (u otro dispositivo físico) como volumen físico. El comando pvcreate divide el volumen físico en extensiones físicas (PE) de un tamaño fijo, por ejemplo, bloques de 4 MiB. Puede etiquetar varios dispositivos al mismo tiempo con nombres de dispositivos delimitados por espacios como argumentos para pvcreate. [root@host ~]# pvcreate /dev/vdb2 /dev/vdb1 Esto etiquetará dispositivos /dev/vdb2 y /dev/vdb1 como PV, listos para la asignación en un grupo de volúmenes. Un PV solo debe crearse si no hay PV libres para crear o ampliar un VG. Cree un grupo de volúmenes. Use vgcreate para recopilar uno o más volúmenes físicos en un grupo de volúmenes. Un grupo de volúmenes es el equivalente funcional de un disco duro; creará volúmenes lógicos a partir del pool (conjunto) de extensiones físicas libres en el grupo de volúmenes. La línea de comandos de vgcreate consiste en un nombre de grupo de volúmenes seguido de uno o más volúmenes físicos para asignar a este grupo de volúmenes. [root@host ~]# vgcreate vg01 /dev/vdb2 /dev/vdb1 Esto crea un VG denominado vg01 que tiene el tamaño combinado, en unidades de PE, de los dos PV: /dev/vdb2 y /dev/vdb1. Un VG solo necesita crearse si no existe ninguno. Se pueden crear más VG por motivos administrativos para administrar el uso de PV y LV. O bien, los VG existentes se pueden ampliar para alojar nuevos LV cuando sea necesario. Cree un volumen lógico. Use lvcreate para crear un nuevo volumen lógico desde las extensiones físicas disponibles en un grupo de volúmenes. Como mínimo, la línea de comandos de lvcreate incluye la opción -n para 194 RH134-RHEL8.2-es-1-20200928 capítulo 7 | Administración de volúmenes lógicos configurar el nombre del LV, la opción -L para establecer el tamaño del LV en bytes o la opción l para establecer el tamaño del LV en extensiones y el nombre del grupo de volúmenes que aloja este volumen lógico. [root@host ~]# lvcreate -n lv01 -L 700M vg01 Esto crea un LV denominado lv01, con un tamaño de 700 MiB, en el VG vg01. Este comando fallará si el grupo de volúmenes no tiene una cantidad suficiente de extensiones físicas libres para el tamaño solicitado. También tenga en cuenta que el tamaño se redondeará a un factor del tamaño de la extensión física si el tamaño no puede coincidir exactamente. Puede especificar el tamaño con la opción -L, que espera tamaños en bytes, mebibytes (megabytes binarios, 1048576 bytes), gibibytes (gigabytes binarios), o similar. O puede usar la opción -l, que espera tamaños especificados como un número de extensiones físicas. En la siguiente lista, se proporcionan algunos ejemplos de creación de LV: • lvcreate -L 128M: Cambia el tamaño del volumen lógico a exactamente 128 MiB. • lvcreate -l 128 : Cambia el tamaño del volumen lógico a exactamente 128 extensiones. El número total de bytes depende del tamaño del bloque de extensiones físicas en el volumen físico subyacente. Importante Diferentes herramientas muestran el nombre del volumen lógico, ya sea usando el nombre tradicional /dev/vgname/lvname o el nombre del mapeador de dispositivos del kernel /dev/mapper/vgname-lvname. Agregue el sistema de archivos. Use mkfs para crear un sistema de archivos XFS en el nuevo volumen lógico. O cree un sistema de archivos basado en su sistema de archivos preferido, por ejemplo, ext4. [root@host ~]# mkfs -t xfs /dev/vg01/lv01 Para hacer que el sistema de archivos esté disponible después de los reinicios, siga los siguientes pasos: • Use mkdir para crear un punto de montaje. [root@host ~]# mkdir /mnt/data • Agregue una entrada al archivo /etc/fstab: /dev/vg01/lv01 /mnt/data xfs defaults 1 2 nota El montaje de un volumen lógico por nombre es equivalente al montaje por UUID porque LVM encuentra sus volúmenes físicos basados en un UUID incluso si inicialmente los agrega al grupo de volúmenes por nombre. RH134-RHEL8.2-es-1-20200928 195 capítulo 7 | Administración de volúmenes lógicos • Ejecute mount /mnt/data para montar el sistema de archivos que acaba de agregar en / etc/fstab. [root@host ~]# mount /mnt/data Eliminación de un volumen lógico Para eliminar todos los componentes del volumen lógico, siga los siguientes pasos: Prepare el sistema de archivos. Traslade todos los datos que se deben conservar a otro sistema de archivos. Use el comando umount para desmontar el sistema de archivos y, luego, eliminar cualquier entrada de /etc/ fstab asociada a este sistema de archivos. [root@host ~]# umount /mnt/data Advertencia Al eliminar un volumen lógico, se destruyen todos los datos almacenados en este. Realice una copia de seguridad de los datos o trasládelos antes de eliminar el volumen lógico. Elimine el volumen lógico. Use lvremove DEVICE_NAME para eliminar un volumen lógico que ya no es necesario. [root@host ~]# lvremove /dev/vg01/lv01 Desmonte el sistema de archivos del LV antes de ejecutar este comando. El comando solicita confirmación antes de eliminar el LV. Las extensiones físicas del LV se liberan y están disponibles para ser asignadas a LV existentes o nuevos en el grupo de volúmenes. Elimine el grupo de volúmenes. Use vgremove VG_NAME para eliminar un grupo de volúmenes que ya no es necesario. [root@host ~]# vgremove vg01 Los volúmenes físicos del VG se liberan y están disponibles para ser asignados a VG existentes o nuevos en el sistema. Elimine los volúmenes físicos. Use pvremove para eliminar volúmenes físicos que ya no son necesarios. Use una lista delimitada por espacios de dispositivos del PV para eliminar más de uno a la vez. Este comando elimina los metadatos del PV de la partición (o disco). Ahora, la partición está libre para una nueva asignación o para ser formateada. [root@host ~]# pvremove /dev/vdb2 /dev/vdb1 196 RH134-RHEL8.2-es-1-20200928 capítulo 7 | Administración de volúmenes lógicos Revisión de la información de estado de LVM Volúmenes físicos Use pvdisplay para visualizar información sobre volúmenes físicos (VP). Para mostrar información sobre todos los volúmenes físicos, use el comando sin argumentos. Para mostrar información sobre un volumen físico específico, pase el nombre de ese dispositivo al comando. [root@host ~]# pvdisplay /dev/vdb1 --- Physical volume --PV Name /dev/vdb1 VG Name vg01 PV Size 768.00 MiB / not usable 4.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 191 Free PE 16 Allocated PE 175 PV UUID JWzDpn-LG3e-n2oi-9Etd-VT2H-PMem-1ZXwP1 PV Name (Nombre de PV) se mapea al nombre del dispositivo. VG Name (Nombre de VG) muestra el grupo de volúmenes donde se encuentra el PV. PV Size (Tamaño de PV) muestra el tamaño físico del PV, incluido todo el espacio no utilizable. PE Size (Tamaño de PE) es el tamaño de la extensión física, que es el tamaño más pequeño a donde puede ser asignado un volumen lógico. Es también el factor de multiplicación que se usa en el cálculo del tamaño de cualquier valor informado en las unidades de PE, como Free PE (PE libre); por ejemplo: 26 PE x 4 MiB (el PE Size [Tamaño de PE]) da 104 MiB de espacio libre. El tamaño de un volumen lógico se redondea a un factor de unidades de PE. LVM establece el tamaño de la PE automáticamente, aunque es posible especificarlo. Free PE (PE libre) muestra cuántas unidades de PE están disponibles para la asignación para nuevos volúmenes lógicos. Grupos de volúmenes Use vgdisplay para visualizar información sobre grupos de volúmenes (GV). Para mostrar información sobre todos los grupos de volúmenes, use el comando sin argumentos. Para mostrar información sobre un grupo de volúmenes específico, pase el nombre del VG al comando. [root@host ~]# vgdisplay vg01 --- Volume group --VG Name vg01 System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 2 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 RH134-RHEL8.2-es-1-20200928 197 capítulo 7 | Administración de volúmenes lógicos Cur PV Act PV VG Size PE Size Total PE Alloc PE / Size Free PE / Size VG UUID 2 2 1016.00 MiB 4.00 MiB 254 175 / 700.00 MiB 79 / 316.00 MiB 3snNw3-CF71-CcYG-Llk1-p6EY-rHEv-xfUSez VG Name (Nombre de VG) es el nombre del grupo de volúmenes. VG Size (Tamaño de VG) es el tamaño total del pool (conjunto) de almacenamiento disponible para la asignación de volúmenes lógicos. Total PE (PE total) es el tamaño total expresado en unidades de PE. Free PE / Size (PE libre/tamaño) muestra cuánto espacio libre hay en el VG para distribuir para nuevos LV o para ampliar los LV existentes. Volúmenes lógicos Use lvdisplay para visualizar información sobre volúmenes lógicos (LV). Si no proporciona ningún argumento al comando muestra información sobre todos los LV, si proporciona el nombre de un dispositivo del LV como un argumento, el comando muestra información sobre ese dispositivo específico. [root@host ~]# lvdisplay /dev/vg01/lv01 --- Logical volume --LV Path /dev/vg01/lv01 LV Name lv01 VG Name vg01 LV UUID 5IyRea-W8Zw-xLHk-3h2a-IuVN-YaeZ-i3IRrN LV Write Access read/write LV Creation host, time host.lab.example.com, 2019-03-28 17:17:47 -0400 LV Status available # open 1 LV Size 700 MiB Current LE 175 Segments 1 Allocation inherit Read ahead sectors auto - current set to 256 Block device 252:0 LV Path (Ruta de LV) muestra el nombre del dispositivo del volumen lógico. Es posible que algunas herramientas informen el nombre del dispositivo como /dev/ mapper/vgname-lvname; ambos representan el mismo LV. VG Name (Nombre de VG) muestra el grupo de volúmenes desde donde se asigna el LV. LV Size (Tamaño de LV) muestra el tamaño total del LV. Use herramientas del sistema de archivos para determinar el espacio libre y el espacio usado para el almacenamiento de datos. Current LE (LE actual) muestra la cantidad de extensiones lógicas usadas por este LV. Una LE generalmente se mapea a una extensión física del VG y, por lo tanto, al volumen físico. 198 RH134-RHEL8.2-es-1-20200928 capítulo 7 | Administración de volúmenes lógicos Referencias páginas de manual lvm(8), pvcreate(8), vgcreate(8), lvcreate(8), pvremove(8), vgremove(8), lvremove(8), pvdisplay(8), vgdisplay(8), lvdisplay(8), fdisk(8), gdisk(8), parted(8), partprobe(8) y mkfs(8) RH134-RHEL8.2-es-1-20200928 199 capítulo 7 | Administración de volúmenes lógicos Ejercicio Guiado Creación de volúmenes lógicos En este trabajo de laboratorio, creará un volumen físico, un grupo de volúmenes, un volumen lógico y un sistema de archivos XFS. También montará de forma persistente el sistema de archivos de volúmenes lógicos. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear volúmenes físicos, grupos de volúmenes y volúmenes lógicos con herramientas de LVM. • Crear nuevos sistemas de archivos en volúmenes lógicos y montarlos de manera persistente. Andes De Comenzar Inicie sesión con el usuario student en workstation con la contraseña student. En workstation, ejecute el comando lab lvm-creating start. Este comando ejecuta un script de inicio que determina si la máquina servera es accesible en la red. También verifica que el almacenamiento esté disponible y que se hayan instalado los paquetes de software apropiados. [student@workstation ~]$ lab lvm-creating start 1. Use el comando ssh para iniciar sesión en servera como el usuario student. Los sistemas se configuran a fin de que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Use el comando sudo -i para cambiar al usuario root. La contraseña del usuario student es student. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 3. Cree los recursos físicos en el dispositivo /dev/vdb. 3.1. 200 Use parted para crear dos particiones de 256 MiB y configúrelas con el tipo Linux LVM. RH134-RHEL8.2-es-1-20200928 capítulo 7 | Administración de volúmenes lógicos [root@servera ~]# parted -s /dev/vdb mklabel gpt [root@servera ~]# parted -s /dev/vdb mkpart primary 1MiB 257MiB [root@servera ~]# parted -s /dev/vdb set 1 lvm on [root@servera ~]# parted -s /dev/vdb mkpart primary 258MiB 514MiB [root@servera ~]# parted -s /dev/vdb set 2 lvm on 3.2. Use udevadm settle para que el sistema registre las nuevas particiones. [root@servera ~]# udevadm settle 4. Use pvcreate para agregar las dos nuevas particiones como PV. [root@servera ~]# pvcreate /dev/vdb1 /dev/vdb2 Physical volume "/dev/vdb1" successfully created. Physical volume "/dev/vdb2" successfully created. 5. Use vgcreate para crear un nuevo VG denominado servera_01_vg compilado a partir de los dos PV. [root@servera ~]# vgcreate servera_01_vg /dev/vdb1 /dev/vdb2 Volume group "servera_01_vg" successfully created 6. Use lvcreate para crear un LV de 400 MiB LV denominado servera_01_lv desde el VG servera_01_vg. [root@servera ~]# lvcreate -n servera_01_lv -L 400M servera_01_vg Logical volume "servera_01_lv" created. Esto crea un dispositivo denominado /dev/servera_01_vg/servera_01_lv pero sin un sistema de archivos. 7. Agregue un sistema de archivos persistente. 7.1. Agregue un sistema de archivos XFS en el LV servera_01_lv con el comando mkfs. [root@servera ~]# mkfs -t xfs /dev/servera_01_vg/servera_01_lv ...output omitted... 7.2. Crear un punto de montaje en /data. [root@servera ~]# mkdir /data 7.3. Agregue la siguiente línea al final de /etc/fstab en servera: /dev/servera_01_vg/servera_01_lv 7.4. /data xfs defaults 1 2 Use systemctl daemon-reload para actualizar systemd con la nueva configuración de /etc/fstab. RH134-RHEL8.2-es-1-20200928 201 capítulo 7 | Administración de volúmenes lógicos [root@servera ~]# systemctl daemon-reload 7.5. Verifique la entrada /etc/fstab y monte el nuevo dispositivo de LV servera_01_lv LV con el comando mount. [root@servera ~]# mount /data 8. Evalúe y revise su trabajo. 8.1. Como prueba final, copie algunos archivos en /data y verifique cuántos se copiaron. [root@servera ~]# cp -a /etc/*.conf /data [root@servera ~]# ls /data | wc -l 34 Verificará que aún tenga la misma cantidad de archivos en el siguiente ejercicio guiado. 8.2. parted/dev/VDB Print enumera las particiones que existen en /dev/VDB. [root@servera ~]# parted /dev/vdb print Model: Virtio Block Device (virtblk) Disk /dev/vdb: 5369MB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number 1 2 Start 1049kB 271MB End 269MB 539MB Size 268MB 268MB File system Name primary primary Flags lvm lvm Observe la columna Número, que contiene los valores 1 y 2. Estos corresponden a /dev/vdb1 y /dev/vdb2, respectivamente. También observe la columna Indicadores, que indica el tipo de partición. 8.3. pvdisplay muestra información sobre cada uno de los volúmenes físicos. De forma opcional, incluya el nombre del dispositivo para limitar detalles a un PV específico. [root@servera ~]# pvdisplay /dev/vdb2 --- Physical volume --PV Name /dev/vdb2 VG Name servera_01_vg PV Size 256.00 MiB / not usable 4.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 63 Free PE 26 Allocated PE 37 PV UUID 2z0Cf3-99YI-w9ny-alEW-wWhL-S8RJ-M2rfZk Esto muestra que el PV está asignado al VG servera_01_vg, tiene un tamaño de 256 MiB (si bien 4 MiB no se pueden usar) y el tamaño de la extensión física (PE Size [Tamaño de PE]) es de 4 MiB (el tamaño de un LV asignable más pequeño). 202 RH134-RHEL8.2-es-1-20200928 capítulo 7 | Administración de volúmenes lógicos Hay 63 PE, de las cuales 26 están libres para la asignación para LV en el futuro y 37 están asignadas actualmente a LV. Esto se traduce a los siguientes valores de MiB: • Un total de 252 MiB (63 PE x 4 MiB); recuerde, 4 MiB no se pueden usar. • 104 MiB libres (26 PE x 4 MiB) • 148 MiB asignados (37 PE x 4 MiB) 8.4. vgdisplay vgname muestran información sobre el grupo de volúmenes denominado vgname. [root@servera ~]# vgdisplay servera_01_vg Verifique los siguientes valores: • El valor de VG Size (Tamaño de VG) es 504,00 MiB. • El valor de Total PE (PE total) es 126. • El valor de Alloc PE / Size (PE asign. / Tamaño) es 100 / 400,00 MiB. • El valor de Free PE / Size (PE libre / Tamaño) es 26 / 104,00 MiB. 8.5. lvdisplay /dev/vgname/lvname muestra información sobre el volumen lógico denominado lvname. [root@servera ~]# lvdisplay /dev/servera_01_vg/servera_01_lv Revise los valores de LV Path (Ruta de LV), LV Name (Nombre de LV), VG Name (Nombre de VG), LV Status (Estado de LV), LV Size (Tamaño de LV) y Current LE (LE actual) (extensiones lógicas, que se mapean a extensiones físicas). 8.6. El comando mount muestra todos los dispositivos montados y cualquier opción de montaje. Debe incluir /dev/servera_01_vg/servera_01_lv. nota Muchas herramientas informan en cambio el nombre del mapeador de dispositivos, /dev/mapper/servera_01_vg-servera_01_lv; es el mismo volumen lógico. [root@servera ~]# mount Debe observar (probablemente, en la última línea) /dev/mapper/ servera_01_vg-servera_01_lv montado en /data y la información de montaje asociada. 8.7. df -h muestra espacio libre legible para el ser humano. De forma opcional, incluya el punto de montaje para limitar detalles a ese sistema de archivos. [root@servera ~]# df -h /data Filesystem /dev/mapper/servera_01_vg-servera_01_lv Size Used Avail Use% Mounted on 395M 24M 372M 6% /data Estos valores, permitidos para metadatos del sistema de archivos, son los esperados. RH134-RHEL8.2-es-1-20200928 203 capítulo 7 | Administración de volúmenes lógicos 9. Cierre sesión en servera. [root@servera ~]# exit logout [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute el script lab lvm-creating finish para terminar este ejercicio. Este script elimina el almacenamiento configurado en servera durante el ejercicio. [student@workstation ~]$ lab lvm-creating finish Esto concluye el ejercicio guiado. 204 RH134-RHEL8.2-es-1-20200928 capítulo 7 | Administración de volúmenes lógicos Ampliación de volúmenes lógicos Objetivos Tras finalizar esta sección, usted deberá ser capaz de realizar lo siguiente: • Ampliar un grupo de volúmenes (VG) con pvcreate y vgextend, y usar vgdisplay para verificar la salida. • Reducir un VG usando pvmove y vgreduce. • Ampliar un volumen lógico (LV) usando lvextend. • Cambiar el tamaño de los sistemas de archivos XFS con xfs_growfs. • Cambiar el tamaño de los sistemas de archivos ext4 con resize2fs. Ampliación y reducción de un grupo de volúmenes Puede agregar más espacio en disco a un grupo de volúmenes mediante la adición de más volúmenes físicos. Esto se denomina ampliación del grupo de volúmenes. Luego, puede asignar las nuevas extensiones físicas desde los volúmenes físicos adicionales a volúmenes lógicos. Puede eliminar los volúmenes físicos no usados de un grupo de volúmenes. Esto se denomina reducción del grupo de volúmenes. Primero, use el comando pvmove para trasladar datos desde extensiones de un volumen físico hasta extensiones de otros volúmenes físicos en el grupo de volúmenes. De esta manera, se puede agregar un nuevo disco a un grupo de volúmenes existentes, se pueden trasladar los datos desde un disco más antiguo o más lento hacia el disco nuevo y se puede eliminar el disco viejo del grupo de volúmenes. Puede hacer esto mientras los volúmenes lógicos del grupo de volúmenes están en uso. Importante En los siguientes ejemplos, se usa el dispositivo vdb y sus particiones para ilustrar comandos LVM. En la práctica, use los dispositivos apropiados para el disco y las particiones de disco en su propio sistema. Ampliación de un grupo de volúmenes Para ampliar un grupo de volúmenes, realice los siguientes pasos: Prepare el dispositivo físico y cree el volumen físico.. Al igual que en la creación de un nuevo grupo de volúmenes, debe crear y preparar una nueva partición para usar como volumen físico si no hay ninguna ya preparada. [root@host ~]# parted -s /dev/vdb mkpart primary 1027MiB 1539MiB [root@host ~]# parted -s /dev/vdb set 3 lvm on [root@host ~]# pvcreate /dev/vdb3 Un PV solo debe crearse si no hay PV libres para ampliar el VG. RH134-RHEL8.2-es-1-20200928 205 capítulo 7 | Administración de volúmenes lógicos Amplíe un grupo de volúmenes. Use vgextend para agregar el nuevo volumen físico al grupo de volúmenes. Use el nombre del VG y el nombre del dispositivo del PV como argumentos para vgextend. [root@host ~]# vgextend vg01 /dev/vdb3 Esto amplía el VG vg01 al tamaño del PV /dev/vdb3. Verifique que el nuevo espacio esté disponible. Use vgdisplay para confirmar que las extensiones físicas adicionales estén disponibles. Revise el Free PE / Size (PE libre/tamaño) en la salida. No debe ser cero. [root@host ~]# vgdisplay vg01 --- Volume group --VG Name vg01 ...output omitted... Free PE / Size 178 / 712.00 MiB ...output omitted... Reducción de un grupo de volúmenes Para reducir un grupo de volúmenes, realice los siguientes pasos: Traslade las extensiones físicas. Use pvmove PV_DEVICE_NAME para reubicar cualquier extensión física del volumen físico que desee eliminar a otros volúmenes físicos en el grupo de volúmenes. Los otros volúmenes físicos deben tener una cantidad suficiente de extensiones libres para aceptar este traslado. Esto solo es posible si hay suficientes extensiones libres en el VG y si todas corresponden a otros PV. [root@host ~]# pvmove /dev/vdb3 Este comando traslada las PE desde /dev/vdb3 a otros PV con PE libres en el mismo VG. Advertencia Antes de usar pvmove, efectúe una copia de seguridad de los datos en los volúmenes lógicos del grupo de volúmenes. Una pérdida de energía imprevista durante la operación puede hacer que el grupo de volúmenes quede en un estado incoherente. Esto provocaría la pérdida de datos en volúmenes lógicos en el grupo de volúmenes. Reduzca el grupo de volúmenes. Use vgreduce VG_NAME PV_DEVICE_NAME para quitar un volumen físico de un grupo de volúmenes. [root@host ~]# vgreduce vg01 /dev/vdb3 Esto elimina el PV /dev/vdb3 del VG vg01 y ahora puede agregarse a otro VG. O se puede usar pvremove para dejar de usar el dispositivo como un PV de forma permanente. 206 RH134-RHEL8.2-es-1-20200928 capítulo 7 | Administración de volúmenes lógicos Ampliación de un volumen lógico y el sistema de archivos XFS Uno de los beneficios de los volúmenes lógicos es la capacidad para aumentar su tamaño sin experimentar tiempo de inactividad. Las extensiones físicas libres en un grupo de volúmenes se pueden agregar a un volumen lógico para ampliar su capacidad, que, luego, se puede usar para ampliar el sistema de archivos que contiene. Ampliación de un volumen lógico Para ampliar un volumen lógico, realice los siguientes pasos: Verifique que el grupo de volúmenes tenga espacio disponible. Use vgdisplay para verificar que haya suficientes extensiones físicas disponibles: [root@host ~]# vgdisplay vg01 --- Volume group --VG Name vg01 ...output omitted... Free PE / Size 178 / 712.00 MiB ...output omitted... Revise el Free PE / Size (PE libre/tamaño) en la salida. Confirme que el grupo de volúmenes tenga suficiente espacio libre para la extensión del LV. Si no hay suficiente espacio disponible, amplíe el grupo de volúmenes como corresponda. Consulte “Ampliación y reducción de un grupo de volúmenes”. Amplíe el volumen lógico. Use lvextendLV_DEVICE_NAME para ampliar el volumen lógico a un nuevo tamaño. [root@host ~]# lvextend -L +300M /dev/vg01/lv01 Esto aumenta el tamaño del volumen lógico lv01 en 300 MiB. Observe el signo "(+)" delante del tamaño: significa agregar este valor al tamaño existente; de lo contrario, el valor define el tamaño final del LV. Al igual que con lvcreate, existen diferentes métodos para especificar el tamaño: la opción l espera la cantidad de extensiones físicas como argumento. La opción -L espera tamaños en bytes, mebibytes, gibibytes y similares. En la siguiente lista, se proporcionan algunos ejemplos de ampliación de LV. Ampliación de ejemplos de LV Comando Resultados lvextend -l 128 Cambia el tamaño del volumen lógico a exactamente 128 extensiones. lvextend -l +128 Agrega 128 extensiones al tamaño actual del volumen lógico. lvextend -L 128M Cambia el tamaño del volumen lógico a exactamente 128 MiB. RH134-RHEL8.2-es-1-20200928 207 capítulo 7 | Administración de volúmenes lógicos Comando Resultados lvextend -L +128M Agrega 128 MiB al tamaño actual del volumen lógico. lvextend -l +50%FREE Agrega el 50% del espacio libre actual en el VG al LV. Amplíe el sistema de archivos. Use xfs_growfs mountpoint para ampliar el sistema de archivos para que ocupe el LV ampliado. El sistema de archivos de destino se debe montar cuando use el comando xfs_growfs. Puede seguir usando el sistema de archivos mientras se está cambiando el tamaño. [root@host ~]# xfs_growfs /mnt/data nota Un error común es ejecutar lvextend y olvidarse de ejecutar xfs_growfs. Una alternativa a ejecutar estos pasos de forma consecutiva es incluir la opción -r con el comando lvextend. Esto modifica el tamaño del sistema de archivos después de que el LV se amplíe, usando fsadm(8). Funciona con varios sistemas de archivos diferentes. Verifique el nuevo tamaño del sistema de archivos montado. [root@host ~]# df -h /mountpoint Ampliación de un volumen lógico y el sistema de archivos ext4 Los pasos para ampliar un volumen lógico basado en ext4 son básicamente los mismos que para un LV basado en XFS, excepto por el paso para cambiar el tamaño del sistema de archivos. Revise “Ampliación de un volumen lógico y el sistema de archivos XFS”. Verifique que el grupo de volúmenes tenga espacio disponible. Use vgdisplay VGNAME para verificar que el grupo de volúmenes tenga una cantidad suficiente de extensiones físicas disponibles. Amplíe el volumen lógico. Use lvextend -l +extents /dev/vgname/lvname para ampliar el volumen lógico /dev/ vgname/lvname en el valor de las extensiones. Amplíe el sistema de archivos. Use resize2fs /dev/vgname/lvname para ampliar el sistema de archivos para que ocupe el nuevo LV ampliado. El sistema de archivos se puede montar y usar mientras se ejecuta el comando de extensión. Puede incluir la opción -p para monitorear el progreso de la operación de cambio de tamaño. [root@host ~]# resize2fs /dev/vg01/lv01 208 RH134-RHEL8.2-es-1-20200928 capítulo 7 | Administración de volúmenes lógicos nota La principal diferencia entre xfs_growfs y resize2fs es el argumento que se pasó para identificar el sistema de archivos. xfs_growfs toma el punto de montaje y resize2fs toma el nombre del volumen lógico. Ampliar un volumen lógico y el espacio de intercambio Los volúmenes lógicos formateados como espacio de intercambio también se pueden ampliar; sin embargo, el proceso es diferente al de la ampliación de un sistema de archivos, como ext4 o XFS. Los volúmenes lógicos formateados con un sistema de archivos pueden ampliarse dinámicamente sin tiempo de inactividad. Los volúmenes lógicos formateados con espacio de intercambio se deben desconectar para ampliarse. Verifique que el grupo de volúmenes tenga espacio disponible. Use vgdisplay vgname para verificar que haya una cantidad suficiente de extensiones físicas disponibles. Desactive el espacio de intercambio. Use swapoff -v /dev/vgname/lvname para desactivar el espacio de intercambio en el volumen lógico. Advertencia Su sistema debe tener suficiente espacio libre en la memoria o en el espacio de intercambio para aceptar cualquier cosa que deba paginar cuando el espacio de intercambio en el volumen lógico está desactivado. Amplíe el volumen lógico. lvextend -l +extents /dev/vgname/lvname amplía el volumen lógico /dev/vgname/ lvname en el valor de las extensiones. Formatee el volumen lógico como espacio de intercambio. mkswap /dev/vgname/lvname formatea todo el volumen lógico como espacio de intercambio. Active el espacio de intercambio. Use swapon -va /dev/vgname/lvname para activar el espacio de intercambio en el volumen lógico. Referencias Páginas del manual: lvm(8), pvcreate(8), pvmove(8), vgdisplay(8), vgextend(8), vgreduce(8), vgdisplay(8), vgextend(8), vgreduce(8), lvextend(8), fdisk(8), gdisk(8), parted(8), partprobe(8), xfs_growfs(8) y resize2fs(8) swapoff(8) swapon(8) mkswap(8) RH134-RHEL8.2-es-1-20200928 209 capítulo 7 | Administración de volúmenes lógicos Ejercicio Guiado Ampliación de volúmenes lógicos En este trabajo de laboratorio, ampliará el volumen lógico agregado en el ejercicio de práctica anterior. Resultados Usted deberá ser capaz de realizar lo siguiente: • Ampliar el grupo de volúmenes para incluir un volumen físico adicional. • Cambiar el tamaño del volumen lógico mientras el sistema de archivos aún está montado y en uso. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab lvm-extending start. Este comando ejecuta un script de inicio que determina si el host servera es accesible en la red y garantiza que el almacenamiento del ejercicio guiado anterior esté disponible. [student@workstation ~]$ lab lvm-extending start 1. Use el comando ssh para iniciar sesión en servera como el usuario student. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Use el comando sudo -i para cambiar a root en el prompt de shell. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 3. Use vgdisplay para determinar si el VG tiene suficiente espacio libre para ampliar el LV hasta un tamaño total de 700 MiB. [root@servera ~]# vgdisplay servera_01_vg --- Volume group --VG Name servera_01_vg System ID Format lvm2 ...output omitted... VG Size 504.00 MiB PE Size 4.00 MiB 210 RH134-RHEL8.2-es-1-20200928 capítulo 7 | Administración de volúmenes lógicos Total PE Alloc PE / Size Free PE / Size VG UUID 126 100 / 400.00 MiB 26 / 104.00 MiB OBBAtU-2nBS-4SW1-khmF-yJzi-z7bD-DpCrAV Hay solo 104 MiB disponibles (26 PE x extensiones de 4 MiB) y necesita al menos 300 MiB para tener 700 MiB en total. Necesita ampliar el VG. Para una posterior comparación, use df para registrar el espacio libre en el disco actual: [root@servera ~]# df -h /data Filesystem /dev/mapper/servera_01_vg-servera_01_lv Size 395M Used Avail Use% Mounted on 24M 372M 6% /data 4. Cree el recurso físico. 4.1. Use parted para crear una partición adicional de 512 MiB y configúrela con el tipo Linux LVM. [root@servera ~]# parted -s /dev/vdb mkpart primary 515MiB 1027MiB [root@servera ~]# parted -s /dev/vdb set 3 lvm on 4.2. Use udevadm settle para que el sistema registre la nueva partición. [root@servera ~]# udevadm settle 5. Use pvcreate para agregar la nueva partición como un PV. [root@servera ~]# pvcreate /dev/vdb3 Physical volume "/dev/vdb3" successfully created. 6. Amplíe un grupo de volúmenes. 6.1. Use vgextend para ampliar el VG denominado servera_01_vg, mediante el nuevo PV /dev/vdb3. [root@servera ~]# vgextend servera_01_vg /dev/vdb3 Volume group "servera_01_vg" successfully extended 6.2. Use vgdisplay para inspeccionar el espacio libre del VG servera_01_vg nuevamente. Ahora, debe haber suficiente espacio libre. [root@servera ~]# vgdisplay servera_01_vg --- Volume group --VG Name servera_01_vg System ID Format lvm2 ...output omitted... VG Size 1012.00 MiB PE Size 4.00 MiB Total PE 253 RH134-RHEL8.2-es-1-20200928 211 capítulo 7 | Administración de volúmenes lógicos Alloc PE / Size Free PE / Size VG UUID 100 / 400.00 MiB 153 / 612.00 MiB OBBAtU-2nBS-4SW1-khmF-yJzi-z7bD-DpCrAV Hay 612 MiB de espacio libre disponible (153 PE x extensiones de 4 MiB). 7. Use lvextend para ampliar el LV existente a 700 MiB. [root@servera ~]# lvextend -L 700M /dev/servera_01_vg/servera_01_lv Size of logical volume servera_01_vg/servera_01_lv changed from 400.00 MiB (100 extents) to 700.00 MiB (175 extents). Logical volume servera_01_vg/servera_01_lv successfully resized. nota El ejemplo especifica el tamaño exacto para crear el LV final, pero podría haber especificado la cantidad de espacio adicional deseada: • -L +300M para agregar el nuevo espacio usando el tamaño en MiB. • -l 175 para especificar el número total de extensiones (175 PE x 4 MiB). • -l +75 para agregar las extensiones adicionales necesarias. 8. Use xfs_growfs para ampliar el sistema de archivos XFS hasta el resto del espacio libre del LV. [root@servera ~]# xfs_growfs /data meta-data=/dev/mapper/servera_01_vg-servera_01_lv isize=512 agsize=25600 blks ...output omitted... agcount=4, 9. Use df y ls | wc para revisar el nuevo tamaño del sistema de archivos y verifique que los archivos existentes anteriormente aún estén presentes. [root@servera ~]# df -h /data Filesystem /dev/mapper/servera_01_vg-servera_01_lv [root@servera ~]# ls /data | wc -l 34 Size 695M Used Avail Use% Mounted on 26M 670M 4% /data Los archivos aún existen y el sistema de archivos se aproxima al tamaño especificado. 10. Cierre sesión en servera. [root@servera ~]# exit logout [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ 212 RH134-RHEL8.2-es-1-20200928 capítulo 7 | Administración de volúmenes lógicos Finalizar En workstation, ejecute el comando lab lvm-extending finish para terminar este ejercicio. Este script elimina el almacenamiento configurado en servera durante el ejercicio. [student@workstation ~]$ lab lvm-extending finish Esto concluye el ejercicio guiado. RH134-RHEL8.2-es-1-20200928 213 capítulo 7 | Administración de volúmenes lógicos Trabajo de laboratorio Administración de volúmenes lógicos Lista de verificación de rendimiento En este trabajo de laboratorio, modificará el tamaño de un volumen lógico existente, agregará recursos de LVM según sea necesario y, luego, agregará un nuevo volumen lógico con un sistema de archivos XFS montado de manera persistente en este. Resultados Usted deberá ser capaz de realizar lo siguiente: • Cambiar el tamaño del volumen lógico serverb_01_lv a 768 MiB. • Crear un nuevo volumen lógico de 128 MiB denominado serverb_02_lv con un sistema de archivos XFS, montado de forma persistente en /storage/data2. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab lvm-review start. Este comando ejecuta un script de inicio que determina si la máquina serverb es accesible en la red. También prepara el almacenamiento en serverb para el ejercicio. [student@workstation ~]$ lab lvm-review start En serverb, un volumen lógico denominado serverb_01_lv montado en /storage/data1 se está quedando sin espacio en disco y se le ha solicitado que amplíe su tamaño a 768 MiB. Debe asegurarse de que serverb_01_lv permanece montado de forma persistente en /storage/ data1. También se le ha solicitado que cree un nuevo volumen lógico de 128 MiB denominado serverb_02_lv, montado en /storage/data2. Se le ha indicado que formatee el nuevo volumen lógico con el sistema de archivos XFS. El grupo de volúmenes serverb_01_vg contiene los volúmenes lógicos. Desafortunadamente, no tiene espacio suficiente para ampliar el volumen lógico existente y agregar el nuevo. Se creó una partición de 512 MiB previamente en /dev/vdb. Se le ha indicado que use 512 MiB adicionales en /dev/vdb. Debe crear la nueva partición. 1. Cree una partición de 512 MiB en /dev/vdb; inicialícela como un volumen físico y amplíe el grupo de volúmenes serverb_01_vg con esta. 2. Amplíe el volumen lógico serverb_01_lv a 768 MiB, que incluye el sistema de archivos. 3. En el grupo de volúmenes existente, cree un nuevo volumen lógico denominado serverb_02_lv con un tamaño de 128 MiB. Agregue un sistema de archivos XFS y móntelo de forma persistente en /storage/data2. 4. Cuando haya finalizado, reinicie su máquina serverb y, luego, ejecute el comando lab lvm-review grade desde su máquina workstation para verificar su trabajo. 214 RH134-RHEL8.2-es-1-20200928 capítulo 7 | Administración de volúmenes lógicos Espere hasta que serverb está completamente encendido y luego proceda a ejecutar la evaluación. Evaluación En workstation, ejecute el script lab lvm-review grade para confirmar que ha realizado correctamente este ejercicio. [student@workstation ~]$ lab lvm-review grade Finalizar En workstation, ejecute el script lab lvm-review finish para terminar el trabajo de laboratorio. [student@workstation ~]$ lab lvm-review finish Esto concluye el trabajo de laboratorio. RH134-RHEL8.2-es-1-20200928 215 capítulo 7 | Administración de volúmenes lógicos Solución Administración de volúmenes lógicos Lista de verificación de rendimiento En este trabajo de laboratorio, modificará el tamaño de un volumen lógico existente, agregará recursos de LVM según sea necesario y, luego, agregará un nuevo volumen lógico con un sistema de archivos XFS montado de manera persistente en este. Resultados Usted deberá ser capaz de realizar lo siguiente: • Cambiar el tamaño del volumen lógico serverb_01_lv a 768 MiB. • Crear un nuevo volumen lógico de 128 MiB denominado serverb_02_lv con un sistema de archivos XFS, montado de forma persistente en /storage/data2. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab lvm-review start. Este comando ejecuta un script de inicio que determina si la máquina serverb es accesible en la red. También prepara el almacenamiento en serverb para el ejercicio. [student@workstation ~]$ lab lvm-review start En serverb, un volumen lógico denominado serverb_01_lv montado en /storage/data1 se está quedando sin espacio en disco y se le ha solicitado que amplíe su tamaño a 768 MiB. Debe asegurarse de que serverb_01_lv permanece montado de forma persistente en /storage/ data1. También se le ha solicitado que cree un nuevo volumen lógico de 128 MiB denominado serverb_02_lv, montado en /storage/data2. Se le ha indicado que formatee el nuevo volumen lógico con el sistema de archivos XFS. El grupo de volúmenes serverb_01_vg contiene los volúmenes lógicos. Desafortunadamente, no tiene espacio suficiente para ampliar el volumen lógico existente y agregar el nuevo. Se creó una partición de 512 MiB previamente en /dev/vdb. Se le ha indicado que use 512 MiB adicionales en /dev/vdb. Debe crear la nueva partición. Cree una partición de 512 MiB en /dev/vdb; inicialícela como un volumen físico y amplíe el grupo de volúmenes serverb_01_vg con esta. 1. 1.1. Inicie sesión en serverb como el usuario student. [student@workstation ~]$ ssh student@serverb ...output omitted... [student@serverb ~]$ 216 RH134-RHEL8.2-es-1-20200928 capítulo 7 | Administración de volúmenes lógicos Use el comando sudo -i para cambiar al usuario root. La contraseña del usuario student es student. 1.2. [student@serverb ~]$ sudo -i [sudo] password for student: student [root@serverb ~]# Use parted para crear una partición de 512 MiB y configúrela con el tipo Linux LVM. 1.3. [root@serverb ~]# parted -s /dev/vdb mkpart primary 514MiB 1026MiB [root@serverb ~]# parted -s /dev/vdb set 2 lvm on Use udevadm settle para que el sistema registre la nueva partición. 1.4. [root@servera ~]# udevadm settle Use pvcreate para inicializar la partición como un PV. 1.5. [root@serverb ~]# pvcreate /dev/vdb2 Physical volume "/dev/vdb2" successfully created. Use vgextend para ampliar el VG denominado serverb_01_vg, mediante el nuevo PV /dev/vdb2. 1.6. [root@serverb ~]# vgextend serverb_01_vg /dev/vdb2 Volume group "serverb_01_vg" successfully extended 2. Amplíe el volumen lógico serverb_01_lv a 768 MiB, que incluye el sistema de archivos. Use lvextend para ampliar el LV serverb_01_lv a 768 MiB. 2.1. [root@serverb ~]# lvextend -L 768M /dev/serverb_01_vg/serverb_01_lv Size of logical volume serverb_01_vg/serverb_01_lv changed from 256.00 MiB (64 extents) to 768.00 MiB (192 extents). Logical volume serverb_01_vg/serverb_01_lv successfully resized. nota O podría haber usado la opción -L +512M para cambiar el tamaño del LV. 2.2. Use xfs_growfs para ampliar el sistema de archivos XFS hasta el resto del espacio libre del LV. [root@serverb ~]# xfs_growfs /storage/data1 meta-data=/dev/mapper/serverb_01_vg-serverb_01_lv isize=512 agsize=16384 blks ...output omitted... RH134-RHEL8.2-es-1-20200928 agcount=4, 217 capítulo 7 | Administración de volúmenes lógicos nota En este ejemplo, se muestra el paso xfs_growfs para ampliar el sistema de archivos. Una alternativa hubiese sido agregar la opción -r al comando lvextend. 3. En el grupo de volúmenes existente, cree un nuevo volumen lógico denominado serverb_02_lv con un tamaño de 128 MiB. Agregue un sistema de archivos XFS y móntelo de forma persistente en /storage/data2. 3.1. Use lvcreate para crear un LV de 128 MiB denominado serverb_02_lv desde el VG serverb_01_vg. [root@serverb ~]# lvcreate -n serverb_02_lv -L 128M serverb_01_vg Logical volume "serverb_02_lv" created 3.2. Use mkfs para colocar un sistema de archivos xfs en el LV serverb_02_lv. Use el nombre del dispositivo LV. [root@serverb ~]# mkfs -t xfs /dev/serverb_01_vg/serverb_02_lv meta-data=/dev/serverb_01_vg/serverb_02_lv isize=512 agcount=4, agsize=8192 blks ...output omitted... 3.3. Use mkdir para crear un punto de montaje en /storage/data2. [root@serverb ~]# mkdir /storage/data2 3.4. Agregue la siguiente línea al final de /etc/fstab en serverb: /dev/serverb_01_vg/serverb_02_lv 3.5. /storage/data2 xfs defaults 1 2 Use systemctl daemon-reload para actualizar systemd con la nueva configuración de /etc/fstab. [root@servera ~]# systemctl daemon-reload 3.6. Use mount para verificar la entrada /etc/fstab y monte el nuevo dispositivo del LV serverb_02_lv. [root@serverb ~]# mount /storage/data2 Cuando haya finalizado, reinicie su máquina serverb y, luego, ejecute el comando lab lvm-review grade desde su máquina workstation para verificar su trabajo. 4. [root@serverb ~]# systemctl reboot Espere hasta que serverb está completamente encendido y luego proceda a ejecutar la evaluación. 218 RH134-RHEL8.2-es-1-20200928 capítulo 7 | Administración de volúmenes lógicos Evaluación En workstation, ejecute el script lab lvm-review grade para confirmar que ha realizado correctamente este ejercicio. [student@workstation ~]$ lab lvm-review grade Finalizar En workstation, ejecute el script lab lvm-review finish para terminar el trabajo de laboratorio. [student@workstation ~]$ lab lvm-review finish Esto concluye el trabajo de laboratorio. RH134-RHEL8.2-es-1-20200928 219 capítulo 7 | Administración de volúmenes lógicos Resumen En este capítulo, aprendió lo siguiente: • LVM le permite crear un almacenamiento flexible al asignar espacio en múltiples dispositivos de almacenamiento. • Los volúmenes físicos, los grupos de volúmenes y los volúmenes lógicos se administran mediante diversas herramientas, como pvcreate, vgreduce y lvextend. • Los volúmenes lógicos se pueden formatear con un sistema de archivos o espacio de intercambio, y se pueden montar de forma persistente. • Se puede agregar almacenamiento adicional a los grupos de volúmenes y los volúmenes lógicos pueden ampliarse de forma dinámica. 220 RH134-RHEL8.2-es-1-20200928 capítulo 8 Implementación de funciones avanzadas de almacenamiento Meta Administrar el almacenamiento con el sistema de administración de almacenamiento local Stratis y usar los volúmenes VDO para optimizar el espacio de almacenamiento en uso. Objetivos • Administrar múltiples capas de almacenamiento con la administración de almacenamiento local Stratis. • Optimizar el uso del espacio de almacenamiento con VDO para comprimir y desduplicar datos en dispositivos de almacenamiento. • Gestión de almacenamiento en capas con Stratis (y ejercicio guiado) • Compresión y desduplicación de almacenamiento con VDO (y ejercicio guiado) Secciones Trabajo de laboratorio RH134-RHEL8.2-es-1-20200928 Implementación de funciones avanzadas de almacenamiento 221 capítulo 8 | Implementación de funciones avanzadas de almacenamiento Gestión de almacenamiento en capas con Stratis Objetivos Tras completar esta sección, debería ser capaz de administrar múltiples capas de almacenamiento con la administración de almacenamiento local Stratis. Descripción de la arquitectura de Stratis Stratis es una nueva solución de gestión de almacenamiento local para Linux. Stratis está diseñado para facilitar la configuración inicial del almacenamiento, realizar cambios en la configuración del almacenamiento y utilizar funciones avanzadas de almacenamiento. Importante Stratis está disponible como preestreno tecnológico. Para obtener información sobre el alcance de soporte de Red Hat para funciones de vista previa de la tecnología, consulte el documento Alcance del soporte de las prestaciones de tecnología [https://access.redhat.com/support/offerings/techpreview]. Se recomienda a los clientes que implementen Stratis que envíen sus comentarios a Red Hat. Stratis se ejecuta como un servicio que administra pools (conjuntos) de dispositivos de almacenamiento físico, y crea y administra de forma transparente los volúmenes para los sistemas de archivos recién creados. En Stratis, los sistemas de archivos se compilan desde los conjuntos de dispositivos de disco compartidos utilizando un concepto conocido como aprovisionamiento ligero. En lugar de asignar inmediatamente espacio físico de almacenamiento al sistema de archivos cuando se crea, Stratis dinámicamente asigna ese espacio del conjunto a medida que el sistema de archivos almacena más datos. Por lo tanto, puede parecer que el sistema de archivos tiene un tamaño de 1 TiB, pero solo puede tener 100 GiB de almacenamiento real, que se le asignó realmente desde el conjunto. Puede crear múltiples conjuntos con diferentes dispositivos de almacenamiento. Desde cada pool (conjunto), puede crear uno o más sistemas de archivos. Actualmente, puedes crear hasta 224 sistemas de archivos por pool (conjunto). Los componentes que conforman un sistema de archivos administrado por Stratis se crean a partir de componentes estándar de Linux. Internamente, Stratis se implementa mediante el uso de la infraestructura del asignador de dispositivos que también se usa para implementar LVM, y los sistemas de archivos gestionados por Stratis se formatean con XFS. En el siguiente diagrama, se ilustra cómo se ensamblan los elementos de la solución de administración de almacenamiento Stratis. Los dispositivos de almacenamiento de bloques, como discos duros o SSD, se asignan a grupos, cada uno de los cuales contribuye a un almacenamiento físico en el conjunto. Los sistemas de archivos se crean a partir de los conjuntos, y el almacenamiento físico se asigna a cada sistema de archivos según sea necesario. 222 RH134-RHEL8.2-es-1-20200928 capítulo 8 | Implementación de funciones avanzadas de almacenamiento Figura 8.1: Elementos de Stratis Trabajo con Stratis Storage Para gestionar los sistemas de archivos con la solución de administración de almacenamiento Stratis, instale los paquetes stratis-cli y stratisd. El paquete stratis-cli proporciona el comando stratis, que envía solicitudes de reconfiguración al daemon del sistema stratisd. El paquete stratisd proporciona el servicio stratisd, que maneja los pedidos de reconfiguración y administra y monitorea los dispositivos de bloque, los conjuntos y los sistemas de archivos que utiliza Stratis. Advertencia Los sistemas de archivos creados por Stratis solo deben volver a configurarse con herramientas y comandos de Stratis. Stratis usa metadatos almacenados para reconocer pools (conjuntos) administrados, volúmenes y sistemas de archivos. La configuración manual de los sistemas de archivos Stratis con comandos que no son de Stratis podría causar la pérdida de esos metadatos e impedir que Stratis reconozca los sistemas de archivos que ha creado. Instalación y habilitación de Stratis Para usar Stratis, asegúrese de que el software esté instalado y de que el servicio stratisd se esté ejecutando. • Instale stratis-cli y stratisd con el comando yum install. RH134-RHEL8.2-es-1-20200928 223 capítulo 8 | Implementación de funciones avanzadas de almacenamiento [root@host ~]# yum install stratis-cli stratisd ...output omitted... Is this ok [y/N]: y ...output omitted... Complete! • Active el servicio stratisd con el comando systemctl. [root@host ~]# systemctl enable --now stratisd Montaje de almacenamiento de bloques en grupos de Stratis Las siguientes son operaciones de administración comunes realizadas con la solución de administración de almacenamiento Stratis. • Crear pools (conjuntos) de uno o más dispositivos de bloque con el comando stratis pool create. [root@host ~]# stratis pool create pool1 /dev/vdb Cada pool (conjunto) es un subdirectorio en el directorio /stratis. • Usar el comando stratis pool list para ver la lista de pools (conjuntos) disponibles. [root@host ~]# stratis pool list Name Total Physical Size Total Physical Used pool1 5 GiB 52 MiB Advertencia El comando stratis pool list es muy importante porque le muestra cuánto espacio de almacenamiento está en uso (y, por lo tanto, cuánto aún está disponible) en los conjuntos. Si un conjunto se queda sin almacenamiento, los datos escritos en los sistemas de archivos que pertenecen a ese conjunto se pierden en silencio. • Usar el comando stratis pool add-data para agregar dispositivos de bloque adicionales a un pool (conjunto). [root@host ~]# stratis pool add-data pool1 /dev/vdc • Usar el comando stratis blockdev list para ver los dispositivos de bloque de un pool (conjunto). [root@host ~]# stratis blockdev list pool1 Pool Name Device Node Physical Size State pool1 /dev/vdb 5 GiB In-use pool1 /dev/vdc 5 GiB In-use 224 Tier Data Data RH134-RHEL8.2-es-1-20200928 capítulo 8 | Implementación de funciones avanzadas de almacenamiento Administración de sistemas de archivos de Stratis • Usar el comando stratis filesystem create para crear un sistema de archivos de un conjunto. [root@host ~]# stratis filesystem create pool1 fs1 Los enlaces a los sistemas de archivos Stratis están en el directorio /stratis/pool1. • Usar el comando stratis filesystem list para ver la lista de sistemas de archivos disponibles. [root@host ~]# stratis filesystem list Pool Name Name Used Created pool1 fs1 546 MiB Sep 23 2020 13:11 Device /stratis/pool1/fs1 UUID 31b9363badd... Advertencia El comando df informará que los nuevos sistemas de archivos XFS administrados por Stratis tienen un tamaño de 1 TiB, independientemente de la cantidad de almacenamiento físico que esté actualmente asignada al sistema de archivos. Debido a que el sistema de archivos se aprovisiona de forma ligera, es posible que el conjunto no tenga suficiente almacenamiento real para hacer una copia de seguridad de todo el sistema de archivos, especialmente si otros sistemas de archivos en el conjunto utilizan todo el almacenamiento disponible. Por lo tanto, es posible utilizar todo el espacio en el grupo de almacenamiento, mientras que df aún informa que el sistema de archivos tiene espacio disponible. Si el conjunto no tiene almacenamiento disponible para el sistema de archivos, es posible que se produzca un error al intentar escribir en ese sistema de archivos, lo que provocará la pérdida de datos. Utilice stratis pool list para monitorear el almacenamiento real restante disponible para los conjuntos de Stratis. • Puede crear una snapshot de un sistema de archivos administrado por Stratis con el comando stratis filesystem snapshot. Las capturas de instantáneas son independientes de los sistemas de archivos de origen. [root@host ~]# stratis filesystem snapshot pool1 fs1 snapshot1 Montaje de forma persistente de sistemas de archivos de Stratis Para asegurarse de que los sistemas de archivos Stratis se monten de forma persistente, edite /etc/fstab y especifique los detalles del sistema de archivos. En el siguiente comando, se muestra el UUID del sistema de archivos que debe usar en /etc/fstab para identificar el sistema de archivos. [root@host ~]# lsblk --output=UUID /stratis/pool1/fs1 UUID 31b9363b-add8-4b46-a4bf-c199cd478c55 RH134-RHEL8.2-es-1-20200928 225 capítulo 8 | Implementación de funciones avanzadas de almacenamiento La siguiente es una entrada de ejemplo en el archivo /etc/fstab para montar de forma persistente un sistema de archivos Stratis. Esta entrada de ejemplo es una sola línea extensa en el archivo. UUID=31b9363b-add8-4b46-a4bf-c199cd478c55 /dir1 xfs defaults,xsystemd.requires=stratisd.service 0 0 La opción de montaje x-systemd.requires=stratisd.service retrasa el montaje del sistema de archivos hasta después de que systemd inicia stratisd.service durante el proceso de arranque. Importante Si no incluye la opción de montaje x-systemd.requires=stratisd.service en /etc/fstab para cada sistema de archivos Stratis, la máquina no se iniciará correctamente y se abortará en caso de emergencia.target la próxima vez que se reinicie. Referencias Para obtener más información, consulte el capítulo Gestión de almacenamiento local en capas con Stratis de la Guía de configuración y administración de sistemas de archivos con Red Hat Enterprise Linux 8 en https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/htmlsingle/configuring_and_managing_file_systems/ Almacenamiento de Stratis https://stratis-storage.github.io/ Lecciones que Stratis aprendió de ZFS, Btrfs y Linux Volume Manager https://opensource.com/article/18/4/stratis-lessons-learned 226 RH134-RHEL8.2-es-1-20200928 capítulo 8 | Implementación de funciones avanzadas de almacenamiento Ejercicio Guiado Gestión de almacenamiento en capas con Stratis En este ejercicio, usará Stratis para crear sistemas de archivos a partir de grupos de almacenamiento provistos por dispositivos de almacenamiento físicos. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear un sistema de archivos con aprovisionamiento ligero (thin provisioned) con la solución de administración de almacenamiento Stratis. • Verificar que los volúmenes Stratis crezcan dinámicamente para admitir crecimiento de datos en tiempo real. • Acceder a los datos desde la instantánea de un sistema de archivos con aprovisionamiento ligero (thin provisioned). Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation , ejecute lab advstorage-stratis start para iniciar el ejercicio. Este script configura el entorno correctamente y garantiza que los discos adicionales en servera estén limpios. [student@workstation ~]$ lab advstorage-stratis start 1. Desde workstation, abra una sesión de SSH en servera como student. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Cambie al usuario root. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 3. Instale los paquetes stratisd y stratis-cli con el comando yum. RH134-RHEL8.2-es-1-20200928 227 capítulo 8 | Implementación de funciones avanzadas de almacenamiento [root@servera ~]# yum install stratisd stratis-cli ...output omitted... Is this ok [y/N]: y ...output omitted... Complete! 4. Active el servicio stratisd con el comando systemctl. [root@servera ~]# systemctl enable --now stratisd 5. Asegúrese de que el pool (conjunto) de Stratis stratispool1 existe con el dispositivo de bloque /dev/vdb. 5.1. Cree un pool (conjunto) de Stratis denominado stratispool1 con el comando stratis pool create. [root@servera ~]# stratis pool create stratispool1 /dev/vdb 5.2. Verifique la disponibilidad de stratispool1 con el comando stratis pool list. [root@servera ~]# stratis pool list Name Total Physical stratispool1 5 GiB / 37.63 MiB / 4.96 GiB Observe el tamaño del pool (conjunto) en la salida anterior. 6. Amplíe la capacidad de stratispool1 con el dispositivo de bloque /dev/vdc. 6.1. Agregue el dispositivo de bloque /dev/vdc a stratispool1 con el comando stratis pool add-data. [root@servera ~]# stratis pool add-data stratispool1 /dev/vdc 6.2. Verifique el tamaño de stratispool1 con el comando stratis pool list. [root@servera ~]# stratis pool list Name Total Physical stratispool1 10 GiB / 41.63 MiB / 9.96 GiB Como se muestra arriba, el tamaño del pool (conjunto) stratispool1 aumentó cuando agregó el dispositivo de bloque. 6.3. Verifique los dispositivos de bloque que son actualmente miembros de stratispool1 con el comando stratis blockdev list. [root@servera ~]# stratis blockdev list stratispool1 Pool Name Device Node Physical Size Tier stratispool1 /dev/vdb 5 GiB Data stratispool1 /dev/vdc 5 GiB Data 228 RH134-RHEL8.2-es-1-20200928 capítulo 8 | Implementación de funciones avanzadas de almacenamiento 7. Agregue un sistema de archivos con aprovisionamiento ligero (thin provisioned) denominado stratis-filesystem1 en el pool (conjunto) stratispool1. Monte el sistema de archivos en /stratisvol. Cree un archivo en el sistema de archivos stratisfilesystem1 denominado file1 que contenga el texto Hello World!. 7.1. Cree el sistema de archivos con aprovisionamiento ligero (thin provisioned) stratis-filesystem1 en stratispool1 con el comando stratis filesystem create. Puede tardar hasta un minuto para que se complete el comando. [root@servera ~]# stratis filesystem create stratispool1 stratis-filesystem1 7.2. Verifique la disponibilidad de stratis-filesystem1 con el comando stratis filesystem list. [root@servera ~]# stratis filesystem list Pool Name Name Used Created UUID stratispool1 stratis-filesystem1 546 MiB Mar 29 2019 07:48 stratispool1/stratis-filesystem1 8714...e7db Device /stratis/ Observe el uso actual de stratis-filesystem1. Este uso del sistema de archivos aumenta a pedido en los siguientes pasos. 7.3. Cree un directorio denominado /stratisvol con el comando mkdir. [root@servera ~]# mkdir /stratisvol 7.4. Monte stratis-filesystem1 en /stratisvol con el comando mount. [root@servera ~]# mount /stratis/stratispool1/stratis-filesystem1 /stratisvol 7.5. Verifique que el volumen stratis-filesystem1 esté montado n /stratisvol con el comando mount. [root@servera ~]# mount ...output omitted... /dev/mapper/stratis-1-5c0e...12b9-thin-fs-8714...e7db on /stratisvol type xfs (rw,relatime,seclabel,attr2,inode64,sunit=2048,swidth=2048,noquota) 7.6. Cree un archivo de texto /stratisvol/file1 con el comando echo. [root@servera ~]# echo "Hello World!" > /stratisvol/file1 8. Verifique que el sistema de archivos con aprovisionamiento ligero (thin provisioned) stratis-filesystem1 crece dinámicamente a medida que crecen los datos en el sistema de archivos. 8.1. Vea el uso actual de stratis-filesystem1 con el comando stratis filesystem list. RH134-RHEL8.2-es-1-20200928 229 capítulo 8 | Implementación de funciones avanzadas de almacenamiento [root@servera ~]# stratis filesystem list Pool Name Name Used Created UUID stratispool1 stratis-filesystem1 546 MiB Mar 29 2019 07:48 stratispool1/stratis-filesystem1 8714...e7db 8.2. Device /stratis/ Cree un archivo de 2 GiB en stratis-filesystem1 con el comando dd. Puede tardar hasta un minuto para que se complete el comando. [root@servera ~]# dd if=/dev/urandom of=/stratisvol/file2 bs=1M count=2048 8.3. Verifique el uso de stratis-filesystem1 con el comando stratis filesystem list. [root@servera ~]# stratis filesystem list Pool Name Name Used Created UUID stratispool1 stratis-filesystem1 2.53 GiB Mar 29 2019 07:48 stratispool1/stratis-filesystem1 8714...e7db Device /stratis/ La salida anterior muestra que aumentó el uso de stratis-filesystem1. El aumento en el uso confirma que el sistema de archivos con aprovisionamiento ligero (thin provisioned) se amplió dinámicamente para alojar el crecimiento de datos en tiempo real que causó al crear /stratisvol/file2. 9. Cree una instantánea de stratis-filesystem1 denominada stratis-filesystem1snap. La instantánea le proporcionará acceso a cualquier archivo que se elimine de stratis-filesystem1. 9.1. Cree una instantánea de stratis-filesystem1 con el comando stratis filesystem snapshot. Puede tardar hasta un minuto para que se complete el comando. El siguiente comando es muy extenso y debe ingresarse en una sola línea. [root@servera ~]# stratis filesystem snapshot stratispool1 stratis-filesystem1 stratis-filesystem1-snap 9.2. Verifique la disponibilidad de la instantánea con el comando stratis filesystem list. [root@servera ~]# stratis filesystem list ...output omitted... stratispool1 stratis-filesystem1-snap 2.53 GiB Mar 29 2019 10:28 stratispool1/stratis-filesystem1-snap 291d...8a16 9.3. /stratis/ Elimine el archivo /stratisvol/file1. [root@servera ~]# rm /stratisvol/file1 rm: remove regular file '/stratisvol/file1'? y 230 RH134-RHEL8.2-es-1-20200928 capítulo 8 | Implementación de funciones avanzadas de almacenamiento 9.4. Cree el directorio /stratisvol-snap con el comando mkdir. [root@servera ~]# mkdir /stratisvol-snap 9.5. Monte la instantánea stratis-filesystem1-snap en /stratisvol-snap con el comando mount. El siguiente comando es muy extenso y debe ingresarse en una sola línea. [root@servera ~]# mount /stratis/stratispool1/stratis-filesystem1-snap / stratisvol-snap 9.6. Confirme que aún puede acceder al archivo que eliminó de stratis-filesystem1 con la instantánea stratis-filesystem1-snap. [root@servera ~]# cat /stratisvol-snap/file1 Hello World! 10. Desmonte /stratisvol y /stratisvol-Snap con el comando umount. [root@servera ~]# umount /stratisvol-snap [root@servera ~]# umount /stratisvol 11. Elimine el sistema de archivos con aprovisionamiento ligero (thin provisioned) stratisfilesystem1 y su instantánea stratis-filesystem1-snap del sistema. 11.1. Destruya stratis-filesystem1-snap con el comando stratis filesystem destroy. [root@servera ~]# stratis filesystem destroy stratispool1 stratis-filesystem1-snap 11.2. Destruya stratis-filesystem1 con el comando stratis filesystem destroy. [root@servera ~]# stratis filesystem destroy stratispool1 stratis-filesystem1 11.3. Salga de la shell del usuario root y cierre sesión en servera. [root@servera ~]# exit logout [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute el comando lab advstorage-stratis finish para terminar este ejercicio. Este script elimina las particiones y los archivos creados durante el ejercicio para garantizar que el entorno quede limpio. RH134-RHEL8.2-es-1-20200928 231 capítulo 8 | Implementación de funciones avanzadas de almacenamiento [student@workstation ~]$ lab advstorage-stratis finish Esto concluye el ejercicio guiado. 232 RH134-RHEL8.2-es-1-20200928 capítulo 8 | Implementación de funciones avanzadas de almacenamiento Compresión y desduplicación de almacenamiento con VDO Objetivos Tras completar esta sección, debería ser capaz de optimizar el uso del espacio de almacenamiento con VDO para comprimir y desduplicar datos en dispositivos de almacenamiento. Descripción del optimizador de datos virtual Red Hat Enterprise Linux 8 incluye el controlador del optimizador de datos virtual (VDO), que optimiza la huella de datos en dispositivos de bloque. VDO es un controlador de asignación de dispositivos Linux que reduce el uso de espacio en disco en dispositivos de bloque y minimiza la replicación de datos, lo que ahorra espacio en disco e incluso aumenta el rendimiento de datos. VDO incluye dos módulos de kernel, el módulo kvdo para controlar la compresión de datos de forma transparente y el módulo uds para la desduplicación. La capa de VDO se coloca encima de un dispositivo de almacenamiento de bloque existente, como un dispositivo RAID o un disco local. Esos dispositivos de bloque también pueden ser dispositivos cifrados. Las capas de almacenamiento, como los volúmenes lógicos LVM y los sistemas de archivos, se colocan sobre un dispositivo VDO. En el siguiente diagrama, se muestra la ubicación de VDO en una infraestructura que consiste en máquinas virtuales KVM que utilizan dispositivos de almacenamiento optimizados. Figura 8.2: Máquinas virtuales basadas en VDO VDO aplica tres fases a los datos en el siguiente orden para reducir la huella en los dispositivos de almacenamiento: 1. La eliminación de bloque cero filtra los bloques de datos que contienen solo ceros (0) y registra la información de esos bloques solo en los metadatos. Los bloques de datos distintos de cero se pasan a la siguiente fase de procesamiento. Esta fase habilita la función de aprovisionamiento ligero (thin provisioning) en los dispositivos de VDO. 2. La desduplicación elimina los bloques de datos redundantes. Cuando crea múltiples copias de los mismos datos, VDO detecta los bloques de datos duplicados y actualiza los metadatos para usar esos bloques duplicados como referencias al bloque de datos original sin crear bloques de datos redundantes. El módulo del kernel del servicio de desduplicación universal RH134-RHEL8.2-es-1-20200928 233 capítulo 8 | Implementación de funciones avanzadas de almacenamiento (UDS) comprueba la redundancia de los datos a través de los metadatos que mantiene. Este módulo de kernel se envía como parte del VDO. 3. La compresión es la última fase. El módulo de kernel kvdo comprime los bloques de datos con la compresión LZ4 y los agrupa en bloques de 4 KB. Implementación del optimizador de datos virtual Los dispositivos lógicos que crea con VDO se denominan volúmenes de VDO. Los volúmenes de VDO son similares a las particiones de disco; puede formatear los volúmenes con el tipo de sistema de archivos deseado y montarlo como un sistema de archivos regular. También puede usar un volumen de VDO como un volumen físico de LVM. Para crear un volumen de VDO, especifique un dispositivo de bloque y el nombre del dispositivo lógico que VDO presenta al usuario. O puede especificar el tamaño lógico del volumen de VDO. El tamaño lógico del volumen de VDO puede ser mayor que el tamaño físico del dispositivo de bloque real. Dado que los volúmenes de VDO se aprovisionan de forma ligera (thin provisioned), los usuarios solo pueden ver el espacio lógico en uso y desconocen el espacio físico real disponible. Si no especifica el tamaño lógico al crear el volumen, VDO asume el tamaño físico real como el tamaño lógico del volumen. Esta relación 1:1 entre la asignación del tamaño lógico y el tamaño físico proporciona un mejor rendimiento, pero también un uso menos eficiente del espacio de almacenamiento. De acuerdo con los requisitos de su infraestructura, debe priorizar el rendimiento o la eficiencia del espacio. Cuando el tamaño lógico de un volumen de VDO es mayor que el tamaño físico real, debe monitorear de forma proactiva las estadísticas del volumen para ver el uso real con el comando vdostats --verbose. Habilitación de VDO Instale los paquetes vdo y kmod-kvdo para habilitar VDO en el sistema. [root@host ~]# yum install vdo kmod-kvdo ...output omitted... Is this ok [y/N]: y ...output omitted... Complete! Creación de un volumen de VDO Para crear un volumen de VDO, ejecute el comando vdo create. [root@host ~]# vdo create --name=vdo1 --device=/dev/vdd --vdoLogicalSize=50G ...output omitted... Si omite el tamaño lógico, el volumen de VDO resultante tiene el mismo tamaño que su dispositivo físico. Cuando el volumen de VDO está en su lugar, puede formatearlo con el tipo de sistema de archivos deseado y montarlo conforme a la jerarquía del sistema de archivos en su sistema. 234 RH134-RHEL8.2-es-1-20200928 capítulo 8 | Implementación de funciones avanzadas de almacenamiento Análisis de un volumen de VDO Para analizar un volumen de VDO, ejecute el comando vdo status. Este comando muestra un informe sobre el sistema de VDO y el estado del volumen de VDO en formato YAML. También muestra los atributos del volumen de VDO. Use la opción --name= para especificar el nombre de un volumen específico. Si omite el nombre del volumen específico, la salida del comando vdo status muestra el estado de todos los volúmenes de VDO. [root@host ~]# vdo status --name=vdo1 ...output omitted... El comando vdo list muestra la lista de volúmenes de VDO que se han iniciado actualmente. Puede iniciar y detener un volumen de VDO con los comandos vdo start y vdo stop, respectivamente. Referencias Para obtener más información, consulte el capítulo Cómo empezar con VDO de la Guía de desduplicación y compresión de almacenamiento de Red Hat Enterprise Linux 8 en https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/htmlsingle/deduplicating_and_compressing_storage/ Introducción al optimizador de datos virtual https://rhelblog.redhat.com/2018/04/11/introducing-virtual-data-optimizer-toreduce-cloud-and-on-premise-storage-costs/ RH134-RHEL8.2-es-1-20200928 235 capítulo 8 | Implementación de funciones avanzadas de almacenamiento Ejercicio Guiado Compresión y desduplicación de almacenamiento con VDO En este ejercicio, creará un volumen de VDO, lo formateará con un sistema de archivos, lo montará, almacenará datos en él e investigará el impacto de la compresión y la desduplicación en el espacio de almacenamiento realmente usado. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear un volumen con el optimizador de datos virtual, formatearlo con un tipo de sistema de archivos y montar un sistema de archivos en él. • Investigar el impacto de la desduplicación y compresión de datos en un volumen del optimizador de datos virtual. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute lab advstorage-vdo start para iniciar el ejercicio. Este script garantiza que no haya particiones en el disco /dev/vdd y configura el entorno correctamente. [student@workstation ~]$ lab advstorage-vdo start 1. Desde workstation, abra una sesión de SSH en servera como student. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Cree el volumen de VDO vdo1, con el dispositivo /dev/vdd. Establezca su tamaño lógico en 50 GB. 2.1. Cambie al usuario root. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 2.2. Confirme que el paquete vdo esté instalado con el comando yum. [root@servera ~]# yum list installed vdo Installed Packages vdo.x86_64 6.2.2.117-13.el8 236 @rhel-8-for-x86_64-baseos-rpms RH134-RHEL8.2-es-1-20200928 capítulo 8 | Implementación de funciones avanzadas de almacenamiento 2.3. Cree el volumen vdo1 con el comando vdo create. [root@servera ~]# vdo create --name=vdo1 \ --device=/dev/vdd --vdoLogicalSize=50G ...output omitted... 2.4. Verifique la disponibilidad del volumen vdo1 con el comando vdo list. [root@servera ~]# vdo list vdo1 3. Verifique que el volumen vdo1 tenga las funciones de compresión y desduplicación habilitadas. Use grep para buscar las líneas que contienen la cadena Deduplication y Compression en la salida del comando vdo status --name=vdo1. [root@servera ~]# vdo status --name=vdo1 \ | grep -E 'Deduplication|Compression' Compression: enabled Deduplication: enabled 4. Asigne al volumen vdo1 el formato de tipo de sistema de archivos XFS y móntelo en /mnt/ vdo1. 4.1. Use el comando udevadm para verificar que se haya creado el nuevo archivo de dispositivo VDO. [root@servera ~]# udevadm settle 4.2. Asigne al volumen vdo1 el formato del sistema de archivos XFS con el comando mkfs. [root@servera ~]# mkfs.xfs -K /dev/mapper/vdo1 ...output omitted... La opción -K en el comando mkfs.xfs anterior evita que los bloques no usados en el sistema de archivos se desechen inmediatamente, lo que permite que el comando regrese más rápidamente. 4.3. Cree un directorio /mnt/vdo1 con el comando mkdir. [root@servera ~]# mkdir /mnt/vdo1 4.4. Monte el volumen vdo1 en /mnt/vdo1 con el comando mount. [root@servera ~]# mount /dev/mapper/vdo1 /mnt/vdo1 4.5. Verifique que el volumen vdo1 esté correctamente montado con el comando mount. RH134-RHEL8.2-es-1-20200928 237 capítulo 8 | Implementación de funciones avanzadas de almacenamiento [root@servera ~]# mount ...output omitted... /dev/mapper/vdo1 on /mnt/vdo1 type xfs (rw,relatime,seclabel,attr2,inode64,noquota) 5. Cree tres copias del mismo archivo denominado /root/install.img en el volumen vdo1. Compare las estadísticas del volumen para verificar la desduplicación y la compresión de datos que tienen lugar en el volumen. La salida anterior puede variar en su sistema. 5.1. Vea las estadísticas iniciales y el estado del volumen con el comando vdostats. [root@servera ~]# vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/vdo1 5.0G 3.0G 2.0G 60% 99% Observe que 3 GB del volumen ya están en uso porque cuando se crea, el volumen VDO reserva 3-4 GB para sí mismo. También observe que el valor 99% en el campo Space saving% (% de ahorro de espacio) indica que no ha creado ningún contenido hasta el momento en el volumen, lo que contribuye a todo el espacio del volumen guardado. 5.2. Copie /root/install.img en /mnt/vdo1/install.img.1 y verifique las estadísticas del volumen. Puede tardar hasta un minuto para copiar el archivo. [root@servera ~]# cp /root/install.img /mnt/vdo1/install.img.1 [root@servera ~]# vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/vdo1 5.0G 3.4G 1.6G 68% 5% Observe que el valor del campo Used (Usado) aumentó de 3,0G a 3,4G porque copió un archivo en el volumen, y eso ocupa un poco de espacio. Además, observe que el valor del campo Space saving% (% de ahorro de espacio) disminuyó de 99% a 5% porque inicialmente no había contenido en el volumen, lo que contribuía al poco uso del espacio del volumen y al gran ahorro de espacio del volumen hasta que creó un archivo. El ahorro de espacio del volumen es considerablemente bajo porque creó una copia única del archivo en el volumen y no hay nada que desduplicar. 5.3. Copie /root/install.img en /mnt/vdo1/install.img.2 y verifique las estadísticas del volumen. Puede tardar hasta un minuto para copiar el archivo. [root@servera ~]# cp /root/install.img /mnt/vdo1/install.img.2 [root@servera ~]# vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/vdo1 5.0G 3.4G 1.6G 68% 51% Observe que el espacio de volumen usado no cambió, en su lugar, el porcentaje del espacio de volumen guardado aumentó, lo que demuestra que se produjo la desduplicación de datos para reducir el consumo de espacio para las copias redundantes del mismo archivo. El valor de Space saving% (% de ahorro de espacio) en la salida anterior puede variar en su sistema. 5.4. 238 Salga de la shell del usuario root y cierre sesión en servera. RH134-RHEL8.2-es-1-20200928 capítulo 8 | Implementación de funciones avanzadas de almacenamiento [root@servera ~]# exit logout [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecutelab advstorage-vdo finish para terminar este ejercicio. Este script elimina los archivos creados durante el ejercicio para garantizar que el entorno quede limpio. [student@workstation ~]$ lab advstorage-vdo finish Esto concluye el ejercicio guiado. RH134-RHEL8.2-es-1-20200928 239 capítulo 8 | Implementación de funciones avanzadas de almacenamiento Trabajo de laboratorio Implementación de funciones avanzadas de almacenamiento En este ejercicio, utilizará la solución de administración de almacenamiento Stratis para crear sistemas de archivos que crecen para adaptarse a las crecientes demandas de datos, y el optimizador de datos virtual para crear volúmenes para la utilización eficiente del espacio de almacenamiento. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear un sistema de archivos con aprovisionamiento ligero (thin provisioned) utilizando la solución de administración de almacenamiento Stratis. • Verificar que los volúmenes Stratis crezcan dinámicamente para admitir crecimiento de datos en tiempo real. • Acceder a los datos desde la instantánea de un sistema de archivos con aprovisionamiento ligero (thin provisioned). • Crear un volumen con el optimizador de datos virtual y montarlo en un sistema de archivos. • Investigar el impacto de la desduplicación y compresión de datos en un volumen del optimizador de datos virtual. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute lab advstorage-review start para iniciar el ejercicio. Este script configura el entorno correctamente y garantiza que los discos adicionales en serverb estén limpios. [student@workstation ~]$ lab advstorage-review start 1. Desde workstation, abra una sesión de SSH en serverb como student. 2. Cambie al usuario root. 3. Instale los paquetes stratisd y stratis-cli con yum. 4. Inicie y habilite el servicio stratisd con el comando systemctl. 5. Cree un pool (conjunto) de Stratis labpool que contiene el dispositivo de bloque /dev/ vdb. 6. Amplíe la capacidad de labpool con el disco /dev/vdc disponible en el sistema. 7. Cree un sistema de archivos con aprovisionamiento ligero (thin provisioned) denominado labfs en el pool (conjunto) labpool. Monte este sistema de archivos en / 240 RH134-RHEL8.2-es-1-20200928 capítulo 8 | Implementación de funciones avanzadas de almacenamiento labstratisvol para que persista tras los reinicios. Cree un archivo denominado labfile1 que contenga el textoHello World! en el sistema de archivos labfs. No olvide usar la opción de montaje x-systemd. requires=stratisd.service en /etc/fstab. 8. Verifique que el sistema de archivos con aprovisionamiento ligero (thin provisioned) labfs crece dinámicamente a medida que crecen los datos en el sistema de archivos agregando labfile2 de 2 GiB. 9. Cree una instantánea denominada labfs-snap del sistema de archivos labfs. La instantánea le permite acceder a cualquier archivo que se elimina de labfs. 10. Cree el volumen de VDO labvdo con el dispositivo /dev/vdd. Establezca su tamaño lógico en 50 GB. 11. Monte el volumen labvdo en /labvdovol con el sistema de archivos XFS para que persista tras los reinicios. No olvide usar la opción de montaje xsystemd.requires=vdo.service en /etc/fstab. 12. Cree tres copias del mismo archivo denominado /root/install.img en el volumen labvdo. Compare las estadísticas del volumen para verificar la desduplicación y la compresión de datos que tienen lugar en el volumen. 13. Reinicie serverb. Verifique que el volumen labvdo esté montado en /labvdovol después de que el sistema se inicie nuevamente. Evaluación En workstation, ejecute el comando lab advstorage-review grade para confirmar que ha realizado correctamente este ejercicio. [student@workstation ~]$ lab advstorage-review grade Finalizar En workstation, ejecutelab advstorage-review finish para terminar este ejercicio. Este script elimina las particiones y los archivos creados durante el ejercicio para garantizar que el entorno quede limpio. [student@workstation ~]$ lab advstorage-review finish Esto concluye el trabajo de laboratorio. RH134-RHEL8.2-es-1-20200928 241 capítulo 8 | Implementación de funciones avanzadas de almacenamiento Solución Implementación de funciones avanzadas de almacenamiento En este ejercicio, utilizará la solución de administración de almacenamiento Stratis para crear sistemas de archivos que crecen para adaptarse a las crecientes demandas de datos, y el optimizador de datos virtual para crear volúmenes para la utilización eficiente del espacio de almacenamiento. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear un sistema de archivos con aprovisionamiento ligero (thin provisioned) utilizando la solución de administración de almacenamiento Stratis. • Verificar que los volúmenes Stratis crezcan dinámicamente para admitir crecimiento de datos en tiempo real. • Acceder a los datos desde la instantánea de un sistema de archivos con aprovisionamiento ligero (thin provisioned). • Crear un volumen con el optimizador de datos virtual y montarlo en un sistema de archivos. • Investigar el impacto de la desduplicación y compresión de datos en un volumen del optimizador de datos virtual. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute lab advstorage-review start para iniciar el ejercicio. Este script configura el entorno correctamente y garantiza que los discos adicionales en serverb estén limpios. [student@workstation ~]$ lab advstorage-review start Desde workstation, abra una sesión de SSH en serverb como student. 1. [student@workstation ~]$ ssh student@serverb ...output omitted... [student@serverb ~]$ Cambie al usuario root. 2. [student@serverb ~]$ sudo -i [sudo] password for student: student [root@serverb ~]# 242 RH134-RHEL8.2-es-1-20200928 capítulo 8 | Implementación de funciones avanzadas de almacenamiento 3. Instale los paquetes stratisd y stratis-cli con yum. [root@serverb ~]# yum install stratisd stratis-cli ...output omitted... Is this ok [y/N]: y ...output omitted... Complete! 4. Inicie y habilite el servicio stratisd con el comando systemctl. [root@serverb ~]# systemctl enable --now stratisd 5. Cree un pool (conjunto) de Stratis labpool que contiene el dispositivo de bloque /dev/ vdb. 5.1. Cree el pool (conjunto) de Stratis labpool con el comando stratis pool create. [root@serverb ~]# stratis pool create labpool /dev/vdb 5.2. Verifique la disponibilidad de labpool con el comando stratis pool list. [root@serverb ~]# stratis pool list Name Total Physical labpool 5 GiB / 37.63 MiB / 4.96 GiB Observe el tamaño del pool (conjunto) en la salida anterior. 6. Amplíe la capacidad de labpool con el disco /dev/vdc disponible en el sistema. 6.1. Agregue el dispositivo de bloque /dev/vdc a labpool con el comando stratis pool add-data. [root@serverb ~]# stratis pool add-data labpool /dev/vdc 6.2. Verifique el tamaño de labpool con el comando stratis pool list. [root@serverb ~]# stratis pool list Name Total Physical labpool 10 GiB / 41.63 MiB / 9.96 GiB La salida anterior muestra que el tamaño de labpool ha aumentado después de agregar un nuevo disco al pool (conjunto). 6.3. Use el comando stratis blockdev list para mostrar los dispositivos de bloque que ahora son miembros de labpool. [root@serverb ~]# stratis blockdev list labpool Pool Name Device Node Physical Size Tier labpool /dev/vdb 5 GiB Data labpool /dev/vdc 5 GiB Data 7. Cree un sistema de archivos con aprovisionamiento ligero (thin provisioned) denominado labfs en el pool (conjunto) labpool. Monte este sistema de archivos en / RH134-RHEL8.2-es-1-20200928 243 capítulo 8 | Implementación de funciones avanzadas de almacenamiento labstratisvol para que persista tras los reinicios. Cree un archivo denominado labfile1 que contenga el textoHello World! en el sistema de archivos labfs. No olvide usar la opción de montaje x-systemd. requires=stratisd.service en /etc/fstab. 7.1. Cree el sistema de archivos con aprovisionamiento ligero (thin provisioned) denominado labfs en labpool con el comando stratis filesystem create. Puede tardar hasta un minuto para que se complete el comando. [root@serverb ~]# stratis filesystem create labpool labfs 7.2. Verifique la disponibilidad de labfs con el comando stratis filesystem list. [root@serverb ~]# stratis filesystem list Pool Name Name Used UUID labpool labfs 546 MiB Mar 29 2019 07:48 Created Device /stratis/labpool/labfs 9825...d6ca Observe el uso actual de labfs. Este uso del sistema de archivos aumenta a pedido en los siguientes pasos. 7.3. Determine el UUID de labfs con el comando lsblk. [root@serverb ~]# lsblk --output=UUID /stratis/labpool/labfs UUID 9825e289-fb08-4852-8290-44d1b8f0d6ca 7.4. Edite /etc/fstab para que el sistema de archivos con aprovisionamiento ligero (thin provisioned)labfs se monte en el momento de arranque. Use el UUID que determinó en el paso anterior. A continuación se muestra la línea que debe agregar a /etc/ fstab. Puede usar el comando vi /etc/fstab para editar el archivo. UUID=9825...d6ca /labstratisvol 0 0 7.5. xfs defaults,x-systemd.requires=stratisd.service Cree un directorio denominado /labstratisvol con el comando mkdir. [root@serverb ~]# mkdir /labstratisvol 7.6. Monte el sistema de archivos con aprovisionamiento ligero (thin provisioned) labfs con el comando mount para confirmar que el archivo /etc/fstab contiene las entradas correspondientes. [root@serverb ~]# mount /labstratisvol Si el comando anterior produce algún error, revise el archivo /etc/fstab y asegúrese de que contenga las entradas correspondientes. 7.7. Cree un archivo de texto denominado /labstratisvol/labfile1 con el comando echo. [root@serverb ~]# echo "Hello World!" > /labstratisvol/labfile1 244 RH134-RHEL8.2-es-1-20200928 capítulo 8 | Implementación de funciones avanzadas de almacenamiento 8. Verifique que el sistema de archivos con aprovisionamiento ligero (thin provisioned) labfs crece dinámicamente a medida que crecen los datos en el sistema de archivos agregando labfile2 de 2 GiB. 8.1. Vea el uso actual de labfs con el comando stratis filesystem list. [root@serverb ~]# stratis filesystem list Pool Name Name Used UUID labpool labfs 546 MiB Mar 29 2019 07:48 8.2. Created Device /stratis/labpool/labfs 9825...d6ca Cree un archivo de 2 GiB en labfs con el comando dd. Puede tardar hasta un minuto para que se complete el comando. [root@serverb ~]# dd if=/dev/urandom of=/labstratisvol/labfile2 bs=1M count=2048 8.3. Verifique que el uso de labfs ha aumentado con el comando stratis filesystem list. [root@serverb ~]# stratis filesystem list Pool Name Name Used UUID labpool labfs 2.53 GiB Mar 29 2019 07:48 9. Created Device /stratis/labpool/labfs 9825...d6ca Cree una instantánea denominada labfs-snap del sistema de archivos labfs. La instantánea le permite acceder a cualquier archivo que se elimina de labfs. 9.1. Cree una instantánea de labfs con el comando stratis filesystem snapshot. Puede tardar hasta un minuto para que se complete el comando. [root@serverb ~]# stratis filesystem snapshot labpool \ labfs labfs-snap 9.2. Verifique la disponibilidad de la instantánea con el comando stratis filesystem list. [root@serverb ~]# stratis filesystem list ...output omitted... labpool labfs-snap 2.53 GiB Mar 29 2019 10:28 291d...8a16 9.3. /stratis/labpool/labfs-snap Elimine el archivo /labstratisvol/labfile1. [root@serverb ~]# rm /labstratisvol/labfile1 rm: remove regular file '/labstratisvol/labfile1'? y 9.4. Cree el directorio /labstratisvol-snap con el comando mkdir. [root@serverb ~]# mkdir /labstratisvol-snap RH134-RHEL8.2-es-1-20200928 245 capítulo 8 | Implementación de funciones avanzadas de almacenamiento 9.5. Monte la instantánea labfs-snap en /labstratisvol-snap con el comando mount. [root@serverb ~]# mount /stratis/labpool/labfs-snap \ /labstratisvol-snap 9.6. Confirme que aún puede acceder al archivo que eliminó labfs con la instantánea labfs-snap. [root@serverb ~]# cat /labstratisvol-snap/labfile1 Hello World! 10. Cree el volumen de VDO labvdo con el dispositivo /dev/vdd. Establezca su tamaño lógico en 50 GB. 10.1. Cree el volumen labvdo con el comando vdo create. [root@serverb ~]# vdo create --name=labvdo --device=/dev/vdd --vdoLogicalSize=50G ...output omitted... 10.2. Verifique la disponibilidad del volumen labvdo con el comando vdo list. [root@serverb ~]# vdo list labvdo Monte el volumen labvdo en /labvdovol con el sistema de archivos XFS para que persista tras los reinicios. No olvide usar la opción de montaje xsystemd.requires=vdo.service en /etc/fstab. 11. 11.1. Formatee el volumen labvdo con el sistema de archivos XFS con el comando mkfs. [root@serverb ~]# mkfs.xfs -K /dev/mapper/labvdo ...output omitted... 11.2. Use el comando udevadm para registrar el nuevo nodo de dispositivo. [root@serverb ~]# udevadm settle 11.3. Cree un directorio /labvdovol con el comando mkdir. [root@serverb ~]# mkdir /labvdovol 11.4. Determine el UUID de labvdo con el comando lsblk. [root@serverb ~]# lsblk --output=UUID /dev/mapper/labvdo UUID ef8cce71-228a-478d-883d-5732176b39b1 11.5. 246 Edite /etc/fstab para que labvdo se monte en el momento de arranque. Use el UUID del volumen que determinó en el paso anterior. A continuación, se muestra la RH134-RHEL8.2-es-1-20200928 capítulo 8 | Implementación de funciones avanzadas de almacenamiento línea que debe agregar a /etc/fstab. Puede usar el comando vi /etc/fstab para editar el archivo. UUID=ef8c...39b1 /labvdovol xfs defaults,x-systemd.requires=vdo.service 0 0 11.6. Monte el volumen labvdo con el comando mount para confirmar que el archivo /etc/ fstab contiene las entradas correspondientes. [root@serverb ~]# mount /labvdovol Si el comando anterior produce algún error, revise el archivo /etc/fstab y asegúrese de que contenga las entradas correspondientes. 12. Cree tres copias del mismo archivo denominado /root/install.img en el volumen labvdo. Compare las estadísticas del volumen para verificar la desduplicación y la compresión de datos que tienen lugar en el volumen. 12.1. Vea las estadísticas iniciales y el estado del volumen con el comando vdostats. [root@serverb ~]# vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/labvdo 5.0G 3.0G 2.0G 60% 99% Observe que 3 GB del volumen ya están en uso porque cuando se crea, el volumen VDO reserva 3-4 GB para sí mismo. También observe que el valor 99% en el campo Space saving% (% de ahorro de espacio) indica que no ha creado ningún contenido hasta el momento en el volumen, lo que contribuye a todo el espacio del volumen guardado. 12.2. Copie /root/install.img en /labvdovol/install.img.1 y verifique las estadísticas del volumen. Puede tardar hasta un minuto para copiar el archivo. [root@serverb ~]# cp /root/install.img /labvdovol/install.img.1 [root@serverb ~]# vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/labvdo 5.0G 3.4G 1.6G 68% 5% Observe que el valor del campo Used (Usado) aumentó de 3,0G a 3,4G porque copió un archivo en el volumen, y eso ocupa un poco de espacio. Además, observe que el valor del campo Space saving% (% de ahorro de espacio) disminuyó de 99% a 5% porque inicialmente no había contenido en el volumen, lo que contribuía al poco uso del espacio del volumen y al gran ahorro de espacio del volumen hasta que creó un archivo allí. El ahorro de espacio del volumen es bastante bajo porque creó una copia única del archivo en el volumen y no hay nada que desduplicar. 12.3. Copie /root/install.img en /labvdovol/install.img.2 y verifique las estadísticas del volumen. Puede tardar hasta un minuto para copiar el archivo. [root@serverb ~]# cp /root/install.img /labvdovol/install.img.2 [root@serverb ~]# vdostats --human-readable Device Size Used Available Use% Space saving% /dev/mapper/labvdo 5.0G 3.4G 1.6G 68% 51% Observe que el espacio del volumen utilizado no cambió. En cambio, el porcentaje del espacio de volumen guardado aumentó, lo que demuestra que se produjo RH134-RHEL8.2-es-1-20200928 247 capítulo 8 | Implementación de funciones avanzadas de almacenamiento la desduplicación de datos para reducir el consumo de espacio para las copias redundantes del mismo archivo. El valor de Space saving% (% de ahorro de espacio) en la salida anterior puede variar en su sistema. 13. Reinicie serverb. Verifique que el volumen labvdo esté montado en /labvdovol después de que el sistema se inicie nuevamente. 13.1. Reinicie la máquina serverb. [root@serverb ~]# systemctl reboot nota Nota: Si en un reinicio, serverb no arranca con un prompt de inicio de sesión regular, sino que indica "Dar la contraseña root para mantenimiento (o presione Control-D para continuar):" es probable que haya cometido un error en /etc/ fstab. Después de proporcionar la contraseña root de redhat , tendrá que volver a montar el sistema de archivos raíz como lectura/escritura con: [root@serverb ~]# mount -o remount,rw / Verifique que /etc/fstab se configure correctamente como se especifica en las soluciones. Preste especial atención a las opciones de montaje para las líneas relacionadas con /labstratisvol y /labvdovol. Evaluación En workstation, ejecute el comando lab advstorage-review grade para confirmar que ha realizado correctamente este ejercicio. [student@workstation ~]$ lab advstorage-review grade Finalizar En workstation, ejecutelab advstorage-review finish para terminar este ejercicio. Este script elimina las particiones y los archivos creados durante el ejercicio para garantizar que el entorno quede limpio. [student@workstation ~]$ lab advstorage-review finish Esto concluye el trabajo de laboratorio. 248 RH134-RHEL8.2-es-1-20200928 capítulo 8 | Implementación de funciones avanzadas de almacenamiento Resumen En este capítulo, aprendió lo siguiente: • La solución de administración de almacenamiento Stratis implementa sistemas de archivos flexibles que crecen dinámicamente con datos. • La solución de administración de almacenamiento Stratis es compatible con el aprovisionamiento ligero (thin provisioning), la creación de instantáneas y el monitoreo. • El optimizador de datos virtual (VDO) tiene como objetivo reducir el costo de almacenamiento de datos. • El optimizador de datos virtuales aplica la eliminación de bloque cero, la desduplicación de datos y la compresión de datos para optimizar la eficiencia del espacio en disco. RH134-RHEL8.2-es-1-20200928 249 250 RH134-RHEL8.2-es-1-20200928 capítulo 9 Acceso al almacenamiento conectado a la red Meta Acceder al almacenamiento conectado a la red con el protocolo NFS. Objetivos • Montar, usar y desmontar una exportación de NFS desde la línea de comandos y en el momento del arranque. • Configurar el servicio de automontaje con mapas directos e indirectos para montar automáticamente un sistema de archivos NFS a pedido, y desmontarlo cuando ya no esté en uso. • Montaje de almacenamiento conectado a la red con NFS (y ejercicio guiado) • Montaje automático de almacenamiento conectado a la red (y ejercicio guiado) Secciones Trabajo de laboratorio RH134-RHEL8.2-es-1-20200928 Acceso al almacenamiento conectado a la red 251 capítulo 9 | Acceso al almacenamiento conectado a la red Montaje de almacenamiento conectado a la red con NFS Objetivos Tras finalizar esta sección, usted deberá ser capaz de realizar lo siguiente: • Identificar la información de uso compartido de NFS. • Crear un directorio para usarlo como punto de montaje. • Montar un recurso compartido de NFS con el comando mount o configurando el archivo /etc/ fstab. • Desmontar un recurso compartido de NFS con el comando umount. Montaje y desmontaje de recursos compartidos de NFS NFS, el sistema de archivos de red, es un protocolo estándar de Internet usado por Linux, UNIX y sistemas operativos similares como su sistema de archivos de red nativo. Es una norma abierta que aún se mejora activamente y que admite características nativas de sistemas de archivos y permisos de Linux. La versión predeterminada de NFS en Red Hat Enterprise Linux 8 es 4.2. Se admiten las versiones principales de NFSv4 y NFSv3. NFSv2 ya no se admite. NFSv4 usa solo el protocolo TCP para comunicarse con el servidor; las versiones anteriores de NFS podían usar TCP o UDP. Los servidores NFS exportan recursos compartidos (directorios). Los clientes NFS montan un recurso compartido exportado a un punto de montaje local (directorio), que debe existir. Los recursos compartidos de NFS se pueden montar de diversas maneras: • Manualmente, con el comando mount. • Automáticamente en el momento de arranque con las entradas /etc/fstab. • A pedido, con el servicio autofs o la función systemd.automount. Montaje de recursos compartidos de NFS Para montar un recurso compartido de NFS, siga estos tres pasos: 1. Identificar: El administrador del sistema cliente de NFS puede identificar los recursos compartidos de NFS disponibles de diversas maneras: El administrador del servidor NFS puede proporcionar detalles de exportación, incluidos los requisitos de seguridad. Como alternativa, el administrador del cliente puede identificar los recursos compartidos de NFSv4 al montar el directorio root del servidor NFS y al explorar los directorios exportados. Haga esto como usuario root. El acceso a recursos compartidos que usan Kerberos será denegado, pero el nombre del recurso compartido (directorio) estará visible. Otros directorios compartidos se podrán explorar. 252 RH134-RHEL8.2-es-1-20200928 capítulo 9 | Acceso al almacenamiento conectado a la red [user@host ~]$ sudo mkdir mountpoint [user@host ~]$ sudo mount serverb:/ mountpoint [user@host ~]$ sudo ls mountpoint 2. Punto de montaje: Use mkdir para crear un punto de montaje en una ubicación adecuada. [user@host ~]$ mkdir -p mountpoint 3. Montar: Al igual que con los sistemas de archivos en particiones, los recursos compartidos de NFS deben montarse para estar disponibles. Para montar un recurso compartido de NFS, seleccione una de las siguientes opciones. En cada caso, debe ejecutar estos comandos como superusuario, ya sea iniciando sesión como root o con el comando sudo. • Montar temporalmente: monte el recurso compartido de NFS con el comando mount: [user@host ~]$ sudo mount -t nfs -o rw,sync serverb:/share mountpoint La opción -t nfs es el tipo de sistema de archivos para recursos compartidos de NFS (no es estrictamente obligatorio; se muestra para ofrecer una visión completa). La opción -o sync indica a mount sincronizar inmediatamente las operaciones de escritura con el servidor NFS (el valor predeterminado es asincrónico). Este comando monta el recurso compartido de forma inmediata, pero no persistente; la próxima vez que se inicie el sistema, este recurso compartido de NFS no estará disponible. Esto es útil para acceder una sola vez a los datos. También es útil para la prueba de montaje de un recurso compartido de NFS antes de que el recurso compartido esté disponible de forma persistente. • Montar de forma persistente: para asegurarse de que el recurso compartido de NFS se monte en el momento del arranque, edite el archivo /etc/fstab para agregar la entrada de montaje. [user@host ~]$ sudo vim /etc/fstab ... serverb:/share /mountpoint nfs rw,soft 0 0 Luego, monte el recurso compartido de NFS: [user@host ~]$ sudo mount /mountpoint Debido a que el servidor de NFS y las opciones de montaje se encuentran en el archivo /etc/fstab por el servicio de cliente NFS, no es necesario especificarlos en la línea de comandos. Desmontaje de recursos compartidos de NFS Como el usuario root (o con sudo), desmonte un recurso compartido de NFS con el comando umount. [user@host ~]$ sudo umount mountpoint RH134-RHEL8.2-es-1-20200928 253 capítulo 9 | Acceso al almacenamiento conectado a la red nota Desmontar un recurso compartido no elimina su entrada /etc/fstab. A menos que elimine o comente la entrada, el recurso compartido de NFS se volverá a montar en el próximo inicio del sistema o cuando se reinicie el servicio de cliente NFS. Referencias Páginas del manual mount(8), umount(8), fstab(5), mount.nfs(8) y nfsconf(8) 254 RH134-RHEL8.2-es-1-20200928 capítulo 9 | Acceso al almacenamiento conectado a la red Ejercicio Guiado Administración de almacenamiento conectado a la red con NFS Lista de verificación de rendimiento En este ejercicio, modificará el archivo /etc/fstab para montar de forma persistente una exportación de NFS en el momento del arranque. Resultados Usted deberá ser capaz de realizar lo siguiente: • Probar un servidor NFS con el comando mount. • Configurar recursos compartidos de NFS en el archivo de configuración /etc/fstab para guardar los cambios incluso después de reiniciar el sistema. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab netstorage-nfs start. Este comando ejecuta un script de inicio que determina si las máquinas servera y serverb son accesibles en la red. El script le avisará si no están disponibles. El script de inicio configura serverb como servidor NFSv4, configura los permisos y exporta los directorios. Crea los usuarios y grupos necesarios en servera y serverb. [student@workstation ~]$ lab netstorage-nfs start Una empresa de transporte usa un servidor central, serverb, para alojar una serie de documentos y directorios compartidos. Los usuarios de servera, que son todos miembros del grupo admin, necesitan acceso al recurso compartido NFS montado de forma persistente. Información importante: • serverb comparte el directorio /shares/public, que contiene algunos archivos de texto. • Los miembros del grupo admin (admin1, sysmanager1) tienen acceso de lectura y escritura al directorio compartido /shares/public. • El punto de montaje principal para servera es /public. • Todas las contraseñas de usuario están configuradas en redhat. 1. Inicie sesión en servera como el usuario student y cambie al usuario root. 1.1. Inicie sesión en servera con el usuario student. RH134-RHEL8.2-es-1-20200928 255 capítulo 9 | Acceso al almacenamiento conectado a la red [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 1.2. Use el comando sudo -i para cambiar al usuario root. La contraseña del usuario student es student. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 2. Pruebe el servidor NFS en serverb con servera como cliente NFS. 2.1. Cree el punto de montaje /public en servera. [root@servera ~]# mkdir /public 2.2. En servera, use el comando mount para verificar que el recurso compartido NFS /share/public exportado por serverb se monta correctamente en el punto de montaje /public. [root@servera ~]# mount -t nfs \ serverb.lab.example.com:/shares/public /public 2.3. Liste el contenido del recurso compartido NFS montado. [root@servera ~]# ls -l /public total 16 -rw-r--r--. 1 root admin 42 Apr -rw-r--r--. 1 root admin 46 Apr -rw-r--r--. 1 root admin 20 Apr -rw-r--r--. 1 root admin 27 Apr 2.4. 8 22:36 Delivered.txt 8 22:36 NOTES.txt 8 22:36 README.txt 8 22:36 Trackings.txt Explore las opciones de comando mount para el recurso compartido NFS montado. [root@servera ~]# mount | grep public serverb.lab.example.com:/shares/public on /public type nfs4 (rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255,sync ,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.25.250.10, local_lock=none,addr=172.25.250.11) 2.5. Desmonte el recurso compartido NFS. [root@servera ~]# umount /public 3. Configure servera para garantizar que el recurso compartido usado anteriormente se monta de forma persistente. 3.1. 256 Abra el archivo /etc/fstab para editarlo. RH134-RHEL8.2-es-1-20200928 capítulo 9 | Acceso al almacenamiento conectado a la red [root@servera ~]# vim /etc/fstab Agregue la línea siguiente al final del archivo: serverb.lab.example.com:/shares/public 3.2. /public nfs rw,sync 0 0 Use el comando mount para montar el directorio compartido. [root@servera ~]# mount /public 3.3. Enumere el contenido del directorio compartido. [root@servera ~]# ls -l /public total 16 -rw-r--r--. 1 root admin 42 Apr -rw-r--r--. 1 root admin 46 Apr -rw-r--r--. 1 root admin 20 Apr -rw-r--r--. 1 root admin 27 Apr 3.4. 8 22:36 Delivered.txt 8 22:36 NOTES.txt 8 22:36 README.txt 8 22:36 Trackings.txt Reinicie la máquina servera. [root@servera ~]# systemctl reboot 4. Una vez que servera haya finalizado el reinicio, inicie sesión en servera con el usuario admin1 y pruebe el recurso compartido NFS montado de forma persistente. 4.1. Inicie sesión en servera con el usuario admin1. [student@workstation ~]$ ssh admin1@servera [admin1@servera ~]$ 4.2. Pruebe el recurso compartido NFS montado en /public. [admin1@servera ~]$ ls -l /public total 16 -rw-r--r--. 1 root admin 42 Apr 8 22:36 Delivered.txt -rw-r--r--. 1 root admin 46 Apr 8 22:36 NOTES.txt -rw-r--r--. 1 root admin 20 Apr 8 22:36 README.txt -rw-r--r--. 1 root admin 27 Apr 8 22:36 Trackings.txt [admin1@servera ~]$ cat /public/NOTES.txt ###In this file you can log all your notes### [admin1@servera ~]$ echo "This is a test" > /public/Test.txt [admin1@servera ~]$ cat /public/Test.txt This is a test 4.3. Cierre sesión en servera. RH134-RHEL8.2-es-1-20200928 257 capítulo 9 | Acceso al almacenamiento conectado a la red [admin1@servera ~]$ exit logout Connection to servera closed. Finalizar En workstation, ejecute el script lab netstorage-nfs finish para terminar este ejercicio. [student@workstation ~]$ lab netstorage-nfs finish Esto concluye el ejercicio guiado. 258 RH134-RHEL8.2-es-1-20200928 capítulo 9 | Acceso al almacenamiento conectado a la red Montaje automático de almacenamiento conectado a la red Objetivos Tras finalizar esta sección, usted deberá ser capaz de realizar lo siguiente: • Describir los beneficios de usar el servicio de automontaje. • Crear un automontaje de los recursos compartidos de NFS usando asignaciones directas e indirectas, incluidos comodines. Montaje de recursos compartidos de NFS con el servicio de automontaje El servicio de automontaje es un servicio (autofs) que monta automáticamente recursos compartidos de NFS "a pedido", y desmontará automáticamente recursos compartidos de NFS cuando ya no se usen. Beneficios del servicio de automontaje • Los usuarios no necesitan tener privilegios root para ejecutar los comandos mount y umount • Los recursos compartidos de NFS configurados en el servicio de automontaje están disponibles para todos los usuarios de la máquina, sujetos a los permisos de acceso. • Los recursos compartidos de NFS no están conectados permanentemente como las entradas en /etc/fstab, lo que libera recursos de red y sistemas. • El servicio de automontaje se configura del lado del cliente; no se requiere configuración del lado del servidor. • El servicio de automontaje usa las mismas opciones que el comando mount, incluidas las opciones de seguridad. • El servicio de automontaje admite la asignación directa e indirecta de puntos de montaje, lo que proporciona flexibilidad en las ubicaciones de los puntos de montaje. • autofs crea y elimina puntos de montaje indirectos, lo que elimina la gestión manual. • NFS es el sistema de archivos de red predeterminado del servicio de automontaje, pero otros sistemas de archivos de red pueden montarse automáticamente. • autofs es un servicio que se administra como otros servicios del sistema. Crear un automontaje La configuración de un automontaje es un proceso de varios pasos: 1. Instale el paquete autofs. [user@host ~]$ sudo yum install autofs RH134-RHEL8.2-es-1-20200928 259 capítulo 9 | Acceso al almacenamiento conectado a la red Este paquete contiene todo lo necesario para usar el servicio de automontaje para recursos compartidos de NFS. 2. Agregue un archivo de asignación maestra en /etc/auto.master.d. Este archivo identifica el directorio de base usado para puntos de montaje e identifica el archivo de asignación usado para crear los automontajes. [user@host ~]$ sudo vim /etc/auto.master.d/demo.autofs El nombre del archivo de asignación maestra es arbitrario (aunque suele tener un sentido), pero debe tener una extensión de .autofs para que el subsistema lo reconozca. Puede colocar varias entradas en un solo archivo de asignación maestra; como alternativa, puede crear varios archivos de asignación maestra, cada uno con sus propias entradas agrupadas de forma lógica. Agregue la entrada de asignación maestra, en este caso, para montajes asignados indirectamente: /shares /etc/auto.demo Esta entrada usa el directorio /shares como la base para futuros automontajes indirectos. El archivo /etc/auto.demo contiene los detalles de montaje. Use un nombre de archivo absoluto. El archivo auto.demo debe crearse antes de comenzar el servicio autofs. 3. Cree los archivos de asignación. Cada archivo de asignación identifica el punto de montaje, las opciones de montaje y la ubicación de origen que se montará para un conjunto de automontajes. [user@host ~]$ sudo vim /etc/auto.demo La convención de nomenclatura de archivos de asignación es /etc/auto.name, dónde el nombre refleja el contenido de la asignación. work -rw,sync serverb:/shares/work El formato de una entrada es punto de montaje, opciones de montaje y ubicación de origen. En este ejemplo, se muestra una entrada de asignación indirecta básica. Las asignaciones directas y las asignaciones indirectas que usan comodines se tratan más adelante en esta sección. • Conocido como la "clave" en las páginas del manual, el punto de montaje se crea y elimina automáticamente con el servicio autofs. En este caso, el punto de montaje totalmente calificado es /shares/work (consulte el archivo de asignación maestra). El directorio / shares y el directorio /shares/work se crean y eliminan según sea necesario mediante el servicio autofs. En este ejemplo, el punto de montaje local refleja la estructura de directorios del servidor, pero esto no es necesario; el punto de montaje local puede tener cualquier nombre. El servicio autofs no impone una estructura de nombres específica en el cliente. • Las opciones de montaje comienzan con un carácter de guión (-) y se separan por comas sin espacios en blanco. Las opciones de montaje disponibles para el montaje manual de un sistema de archivos están disponibles al realizar el montaje automático. En este 260 RH134-RHEL8.2-es-1-20200928 capítulo 9 | Acceso al almacenamiento conectado a la red ejemplo, el servicio de automontaje monta el recurso compartido con acceso de lectura y escritura (opción rw), y el servidor se sincroniza inmediatamente durante las operaciones de escritura (opción sync). Algunas opciones útiles específicas del servicio de automontaje son -fstype= y -strict. Use fstype para especificar el tipo de sistema de archivos, por ejemplo nfs4 o xfs, y use strict para tratar errores como fatales cuando monte sistemas de archivos. • La ubicación de origen para los recursos compartidos de NFS sigue el patrón host:/ pathname; en este ejemplo, serverb:/shares/work. Para que este montaje automático tenga éxito, el servidor NFS, serverb, debe exportar el directorio con acceso de lectura y escritura, y el usuario que solicita el acceso debe tener permisos de archivo estándar de Linux en el directorio. Si serverb exporta el directorio con acceso de solo lectura, entonces el cliente obtendrá acceso de solo lectura a pesar de que solicitó acceso de lectura/escritura. 4. Inicie y habilite el servicio de automontaje. Use systemctl para iniciar y para habilitar el servicio autofs. [user@host ~]$ sudo systemctl enable --now autofs Created symlink /etc/systemd/system/multi-user.target.wants/autofs.service → /usr/ lib/systemd/system/autofs.service. Asignaciones directas Las asignaciones directas se usan para asignar un recurso compartido de NFS a un punto de montaje de ruta absoluta existente. Para usar puntos de montaje asignados directamente, el archivo de asignación maestra puede tener la siguiente apariencia: /- /etc/auto.direct Todas las entradas de asignación directa usan /- como el directorio de base. En este caso, el archivo de asignación que contiene los detalles de montaje es /etc/auto.direct. El contenido del archivo /etc/auto.direct puede verse de la siguiente forma: /mnt/docs -rw,sync serverb:/shares/docs El punto de montaje (o clave) es siempre una ruta absoluta. El resto del archivo de asignación usa la misma estructura. En este ejemplo, el directorio /mnt existe y no lo administra autofs. El servicio autofs creará y eliminará automáticamente el directorio completo /mnt/docs. Asignaciones indirectas de comodines Cuando un servidor NFS exporta varios subdirectorios dentro de un directorio, el servicio de automontaje se puede configurar para acceder a cualquiera de esos subdirectorios usando una única entrada de asignación. RH134-RHEL8.2-es-1-20200928 261 capítulo 9 | Acceso al almacenamiento conectado a la red Para continuar con el ejemplo anterior, si serverb:/shares exporta dos o más subdirectorios y se puede acceder a estos usando las mismas opciones de montaje, el contenido del archivo /etc/ auto.demo podría verse del siguiente modo: * -rw,sync serverb:/shares/& El punto de montaje (o clave) es un carácter de asterisco (*) y el subdirectorio en la ubicación de origen es el carácter de ampersand (&). Todo lo demás en la entrada es igual. Cuando un usuario intenta acceder a /shares/work, la clave * (que es work en este ejemplo) reemplaza el símbolo & en la ubicación de origen y serverb:/shares/work se monta. Al igual que con el ejemplo indirecto, autofs crea y elimina automáticamente el directorio work. Referencias Páginas del manual: autofs(5), automount(8), auto.master(5) y mount.nfs(8) 262 RH134-RHEL8.2-es-1-20200928 capítulo 9 | Acceso al almacenamiento conectado a la red Ejercicio Guiado Montaje automático de almacenamiento conectado a la red Lista de verificación de rendimiento En este ejercicio, creará puntos de montaje de asignación directa y de asignación indirecta administrados por automontaje que montan sistemas de archivos NFS. Resultados Usted deberá ser capaz de realizar lo siguiente: • Instalar los paquetes necesarios para el servicio de automontaje. • Configurar asignaciones directas e indirectas de automontaje con recursos de un servidor NFSv4 preconfigurado. • Comprender la diferencia entre las asignaciones directas e indirectas de automontaje. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab netstorage-autofs start. Este script de inicio determina si servera y serverb son accesibles en la red. El script le avisará si no están disponibles. El script de inicio configura serverb como servidor NFSv4, configura los permisos y exporta los directorios. También crea los usuarios y grupos necesarios en servera y serverb. [student@workstation ~]$ lab netstorage-autofs start Un proveedor de servicios de Internet usa un servidor central, serverb, para alojar directorios compartidos que contienen documentos importantes que deben estar disponibles a pedido. Cuando los usuarios inician sesión en servera necesitan acceso a los directorios compartidos montados automáticamente. Información importante: • serverb exporta como un recurso compartido de NFS el directorio /shares/indirect, que a su vez contiene los subdirectorios west , central y east. • serverb también exporta como un recurso compartido de NFS el directorio /shares/ direct/external. • El grupo operators está compuesto por los usuarios operator1 y operator2. Tienen acceso de lectura y escritura a los directorios compartidos /shares/indirect/west, / shares/indirect/central y /shares/indirect/east. • El grupo contractors está compuesto por los usuarios contractor1 y contractor2. Tienen acceso de lectura y escritura al directorio compartido /shares/direct/external. RH134-RHEL8.2-es-1-20200928 263 capítulo 9 | Acceso al almacenamiento conectado a la red • Los puntos de montaje esperados para servera son /external y /internal. • El directorio compartido /shares/direct/external debe montarse automáticamente en servera con una asignación directa en /external. • El directorio compartido /shares/indirect/west debe montarse automáticamente en servera con una asignación indirecta en /internal/west. • El directorio compartido /shares/indirect/central debe montarse automáticamente en servera con una asignación indirecta en /internal/central. • El directorio compartido /shares/indirect/east debe montarse automáticamente en servera con una asignación indirecta en /internal/east. • Todas las contraseñas de usuario están configuradas en redhat. 1. Inicie sesión en servera e instale los paquetes requeridos. 1.1. Inicie sesión en servera con el usuario student. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 1.2. Use el comando sudo -i para cambiar al usuario root. La contraseña del usuario student es student. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 1.3. Instale el paquete autofs. [root@servera ~]# yum install autofs ...output omitted... Is this ok [y/N]: y ...output omitted... 2. Configure una asignación directa de montaje automático en servera con los recursos compartidos de serverb. Cree la asignación directa con los archivos denominados /etc/ auto.master.d/direct.autofs para la asignación maestra y /etc/auto.direct para el archivo de asignación. Use el directorio /external como el punto de montaje principal en servera. 2.1. Pruebe el servidor NFS y comparta antes de proceder con la configuración del servicio de automontaje. [root@servera ~]# mount -t nfs \ serverb.lab.example.com:/shares/direct/external /mnt [root@servera ~]# ls -l /mnt total 4 -rw-r--r--. 1 root contractors 22 Apr 7 23:15 README.txt [root@servera ~]# umount /mnt 264 RH134-RHEL8.2-es-1-20200928 capítulo 9 | Acceso al almacenamiento conectado a la red 2.2. Cree un archivo de asignación maestra llamado /etc/auto.master.d/ direct.autofs, inserte el siguiente contenido y guarde los cambios. /- /etc/auto.direct 2.3. Cree un archivo de asignación directa llamado /etc/auto.direct, inserte el siguiente contenido y guarde los cambios. /external -rw,sync,fstype=nfs4 serverb.lab.example.com:/shares/direct/external 3. Configure una asignación indirecta de montaje automático en servera con los recursos compartidos de serverb. Cree la asignación indirecta con los archivos denominados /etc/auto.master.d/indirect.autofs para la asignación maestra y /etc/ auto.indirect para el archivo de asignación. Use el directorio /internal como el punto de montaje principal en servera. 3.1. Pruebe el servidor NFS y comparta antes de proceder con la configuración del servicio de automontaje. [root@servera ~]# mount -t nfs \ serverb.lab.example.com:/shares/indirect /mnt [root@servera ~]# ls -l /mnt total 0 drwxrws---. 2 root operators 24 Apr 7 23:34 central drwxrws---. 2 root operators 24 Apr 7 23:34 east drwxrws---. 2 root operators 24 Apr 7 23:34 west [root@servera ~]# umount /mnt 3.2. Cree un archivo de asignación maestra llamado /etc/auto.master.d/ indirect.autofs, inserte el siguiente contenido y guarde los cambios. /internal /etc/auto.indirect 3.3. Cree un archivo de asignación indirecta llamado /etc/auto.indirect, inserte el siguiente contenido y guarde los cambios. * -rw,sync,fstype=nfs4 serverb.lab.example.com:/shares/indirect/& 4. Inicie el servicio autofs en servera y habilítelo para que se inicie automáticamente durante el proceso de arranque. Reinicie servera para determinar si el servicio autofs se inicia automáticamente. 4.1. Inicie y habilite el servicio autofs en servera. [root@servera ~]# systemctl enable --now autofs Created symlink /etc/systemd/system/multi-user.target.wants/autofs.service → /usr/ lib/systemd/system/autofs.service. 4.2. Reinicie la máquina servera. RH134-RHEL8.2-es-1-20200928 265 capítulo 9 | Acceso al almacenamiento conectado a la red [root@servera ~]# systemctl reboot 5. Pruebe la asignación directa de automontaje con el usuario contractor1. Cuando haya terminado, salga de la sesión de usuario contractor1 en servera. 5.1. Después de que la máquina servera haya terminado de arrancar, inicie sesión en servera con el usuario student. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 5.2. Cambie al usuario contractor1. [student@servera ~]$ su - contractor1 Password: redhat 5.3. Enumere el punto de montaje /external. [contractor1@servera ~]$ ls -l /external total 4 -rw-r--r--. 1 root contractors 22 Apr 7 23:34 README.txt 5.4. Revise el contenido y pruebe el acceso del punto de montaje /external. [contractor1@servera ~]$ cat /external/README.txt ###External Folder### [contractor1@servera ~]$ echo testing-direct > /external/testing.txt [contractor1@servera ~]$ cat /external/testing.txt testing-direct 5.5. Salga de la sesión de usuario contractor1. [contractor1@servera ~]$ exit logout [student@servera ~]$ 6. Pruebe la asignación indirecta de montaje automático como el usuario operator1. Cuando finalice, cierre sesión en servera. 6.1. Cambie al usuario operator1. [student@servera ~]$ su - operator1 Password: redhat 6.2. Enumere el punto de montaje /internal. [operator1@servera ~]$ ls -l /internal total 0 266 RH134-RHEL8.2-es-1-20200928 capítulo 9 | Acceso al almacenamiento conectado a la red nota Notará que en una asignación indirecta de automontaje, incluso si se encuentra en el punto de montaje asignado, debe llamar a cada uno de los subdirectorios o archivos compartidos a pedido para obtener acceso a ellos. En una asignación directa del servicio de automontaje, después de abrir el punto de montaje asignado, obtendrá acceso a los directorios y al contenido configurado en el directorio compartido. 6.3. Pruebe el acceso a directorio compartido del servicio de automontaje /internal/ west. [operator1@servera ~]$ ls -l /internal/west/ total 4 -rw-r--r--. 1 root operators 18 Apr 7 23:34 README.txt [operator1@servera ~]$ cat /internal/west/README.txt ###West Folder### [operator1@servera ~]$ echo testing-1 > /internal/west/testing-1.txt [operator1@servera ~]$ cat /internal/west/testing-1.txt testing-1 [operator1@servera ~]$ ls -l /internal total 0 drwxrws---. 2 root operators 24 Apr 7 23:34 west 6.4. Pruebe el acceso a directorio compartido del servicio de automontaje /internal/ central. [operator1@servera ~]$ ls -l /internal/central total 4 -rw-r--r--. 1 root operators 21 Apr 7 23:34 README.txt [operator1@servera ~]$ cat /internal/central/README.txt ###Central Folder### [operator1@servera ~]$ echo testing-2 > /internal/central/testing-2.txt [operator1@servera ~]$ cat /internal/central/testing-2.txt testing-2 [operator1@servera ~]$ ls -l /internal total 0 drwxrws---. 2 root operators 24 Apr 7 23:34 central drwxrws---. 2 root operators 24 Apr 7 23:34 west 6.5. Pruebe el acceso a directorio compartido del servicio de automontaje /internal/ east. [operator1@servera ~]$ ls -l /internal/east total 4 -rw-r--r--. 1 root operators 18 Apr 7 23:34 README.txt [operator1@servera ~]$ cat /internal/east/README.txt ###East Folder### [operator1@servera ~]$ echo testing-3 > /internal/east/testing-3.txt [operator1@servera ~]$ cat /internal/east/testing-3.txt testing-3 [operator1@servera ~]$ ls -l /internal RH134-RHEL8.2-es-1-20200928 267 capítulo 9 | Acceso al almacenamiento conectado a la red total 0 drwxrws---. 2 root operators 24 Apr drwxrws---. 2 root operators 24 Apr drwxrws---. 2 root operators 24 Apr 7 23:34 central 7 23:34 east 7 23:34 west 6.6. Pruebe el acceso a directorio compartido del servicio de automontaje /external. [operator1@servera ~]$ ls -l /external ls: cannot open directory '/external': Permission denied 6.7. Cierre sesión en servera. [operator1@servera ~]$ exit logout [student@servera ~]$ exit logout Connection to servera closed. Finalizar En workstation, ejecute el script lab netstorage-autofs finish para terminar este ejercicio. [student@workstation ~]$ lab netstorage-autofs finish Esto concluye el ejercicio guiado. 268 RH134-RHEL8.2-es-1-20200928 capítulo 9 | Acceso al almacenamiento conectado a la red Trabajo de laboratorio Acceso al almacenamiento conectado a la red Lista de verificación de rendimiento En este trabajo de laboratorio, configurará el servicio de automontaje con una asignación indirecta, usando recursos compartidos de un servidor NFSv4. Resultados Usted deberá ser capaz de realizar lo siguiente: • Instalar los paquetes necesarios para configurar el servicio de automontaje. • Configurar la asignación indirecta del servicio de automontaje con recursos de un servidor NFSv4 preconfigurado. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab netstorage-review start. Este script de inicio determina si los sistemas servera y serverb son accesibles en la red. El script de inicio configura serverb como servidor NFSv4, configura los permisos y exporta los directorios. También crea los usuarios y grupos necesarios en los sistemas servera y serverb. [student@workstation ~]$ lab netstorage-review start Una empresa de soporte de TI usa un servidor central, serverb, para alojar algunos directorios compartidos en /remote/shares para sus grupos y usuarios. Los usuarios deben ser capaces de iniciar sesión y tener sus directorios compartidos montados a pedido y listos para usar, en el directorio /shares en servera. Información importante: • serverb comparte el directorio /shares, que a su vez contiene los subdirectorios management , production y operation. • El grupo managers está compuesto por los usuarios manager1 y manager2. Tienen acceso de lectura y escritura al directorio compartido /shares/management. • El grupo production está compuesto por los usuarios dbuser1 y sysadmin1. Tienen acceso de lectura y escritura al directorio compartido /shares/production. • El grupo operators está compuesto por los usuarios contractor1 y consultant1. Tienen acceso de lectura y escritura al directorio compartido /shares/operation. • El punto de montaje principal para servera es el directorio /remote. RH134-RHEL8.2-es-1-20200928 269 capítulo 9 | Acceso al almacenamiento conectado a la red • El directorio compartido /shares/management debe montarse automáticamente en / remote/management en servera. • El directorio compartido /shares/production debe montarse automáticamente en / remote/production en servera. • El directorio compartido /shares/operation debe montarse automáticamente en / remote/operation en servera. • Todas las contraseñas de usuario están configuradas en redhat. 1. Inicie sesión en servera e instale los paquetes requeridos. 2. Configure una asignación indirecta de montaje automático en servera con los recursos compartidos de serverb. Cree una asignación indirecta con los archivos denominados / etc/auto.master.d/shares.autofs para la asignación maestra y /etc/auto.shares para el archivo de asignación. Use el directorio /remote como el punto de montaje principal en servera. Reinicie servera para determinar si el servicio autofs se inicia automáticamente. 3. Pruebe la configuración de autofs con los distintos usuarios. Cuando finalice, cierre sesión en servera. Evaluación En workstation, ejecute el comando lab netstorage-review grade para confirmar que ha realizado correctamente este ejercicio. [student@workstation ~]$ lab netstorage-review grade Finalizar En workstation, ejecute el comando lab netstorage-review finish para terminar este ejercicio. [student@workstation ~]$ lab netstorage-review finish Esto concluye el trabajo de laboratorio. 270 RH134-RHEL8.2-es-1-20200928 capítulo 9 | Acceso al almacenamiento conectado a la red Solución Acceso al almacenamiento conectado a la red Lista de verificación de rendimiento En este trabajo de laboratorio, configurará el servicio de automontaje con una asignación indirecta, usando recursos compartidos de un servidor NFSv4. Resultados Usted deberá ser capaz de realizar lo siguiente: • Instalar los paquetes necesarios para configurar el servicio de automontaje. • Configurar la asignación indirecta del servicio de automontaje con recursos de un servidor NFSv4 preconfigurado. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab netstorage-review start. Este script de inicio determina si los sistemas servera y serverb son accesibles en la red. El script de inicio configura serverb como servidor NFSv4, configura los permisos y exporta los directorios. También crea los usuarios y grupos necesarios en los sistemas servera y serverb. [student@workstation ~]$ lab netstorage-review start Una empresa de soporte de TI usa un servidor central, serverb, para alojar algunos directorios compartidos en /remote/shares para sus grupos y usuarios. Los usuarios deben ser capaces de iniciar sesión y tener sus directorios compartidos montados a pedido y listos para usar, en el directorio /shares en servera. Información importante: • serverb comparte el directorio /shares, que a su vez contiene los subdirectorios management , production y operation. • El grupo managers está compuesto por los usuarios manager1 y manager2. Tienen acceso de lectura y escritura al directorio compartido /shares/management. • El grupo production está compuesto por los usuarios dbuser1 y sysadmin1. Tienen acceso de lectura y escritura al directorio compartido /shares/production. • El grupo operators está compuesto por los usuarios contractor1 y consultant1. Tienen acceso de lectura y escritura al directorio compartido /shares/operation. • El punto de montaje principal para servera es el directorio /remote. RH134-RHEL8.2-es-1-20200928 271 capítulo 9 | Acceso al almacenamiento conectado a la red • El directorio compartido /shares/management debe montarse automáticamente en / remote/management en servera. • El directorio compartido /shares/production debe montarse automáticamente en / remote/production en servera. • El directorio compartido /shares/operation debe montarse automáticamente en / remote/operation en servera. • Todas las contraseñas de usuario están configuradas en redhat. Inicie sesión en servera e instale los paquetes requeridos. 1. 1.1. Inicie sesión en servera con el usuario student. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 1.2. Use el comando sudo -i para cambiar al usuario root. La contraseña del usuario student es student. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 1.3. Instale el paquete autofs. [root@servera ~]# yum install autofs ...output omitted... Is this ok [y/N]: y ...output omitted... Configure una asignación indirecta de montaje automático en servera con los recursos compartidos de serverb. Cree una asignación indirecta con los archivos denominados / etc/auto.master.d/shares.autofs para la asignación maestra y /etc/auto.shares para el archivo de asignación. Use el directorio /remote como el punto de montaje principal en servera. Reinicie servera para determinar si el servicio autofs se inicia automáticamente. 2. 2.1. Pruebe el servidor NFS antes de proceder con la configuración del servicio de automontaje. [root@servera ~]# mount -t nfs serverb.lab.example.com:/shares /mnt [root@servera ~]# ls -l /mnt total 0 drwxrwx---. 2 root managers 25 Apr 4 01:13 management drwxrwx---. 2 root operators 25 Apr 4 01:13 operation drwxrwx---. 2 root production 25 Apr 4 01:13 production [root@servera ~]# umount /mnt 2.2. 272 Cree un archivo de asignación maestra llamado /etc/auto.master.d/ shares.autofs, inserte el siguiente contenido y guarde los cambios. RH134-RHEL8.2-es-1-20200928 capítulo 9 | Acceso al almacenamiento conectado a la red [root@servera ~]# vim /etc/auto.master.d/shares.autofs /remote /etc/auto.shares 2.3. Cree un archivo de asignación indirecta llamado /etc/auto.shares, inserte el siguiente contenido y guarde los cambios. [root@servera ~]# vim /etc/auto.shares * -rw,sync,fstype=nfs4 serverb.lab.example.com:/shares/& 2.4. Inicie y habilite el servicio autofs en servera. [root@servera ~]# systemctl enable --now autofs Created symlink /etc/systemd/system/multi-user.target.wants/autofs.service → /usr/ lib/systemd/system/autofs.service. 2.5. Reinicie la máquina servera. [root@servera ~]# systemctl reboot 3. Pruebe la configuración de autofs con los distintos usuarios. Cuando finalice, cierre sesión en servera. 3.1. Después de que la máquina servera haya terminado de arrancar, inicie sesión en servera con el usuario student. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 3.2. Use el comando su - manager1 para cambiar al usuario manager1 y probar el acceso. [student@servera ~]$ su - manager1 Password: redhat [manager1@servera ~]$ ls -l /remote/management/ total 4 -rw-r--r--. 1 root managers 46 Apr 4 01:13 Welcome.txt [manager1@servera ~]$ cat /remote/management/Welcome.txt ###Welcome to Management Folder on SERVERB### [manager1@servera ~]$ echo TEST1 > /remote/management/Test.txt [manager1@servera ~]$ cat /remote/management/Test.txt TEST1 [manager1@servera ~]$ ls -l /remote/operation/ ls: cannot open directory '/remote/operation/': Permission denied [manager1@servera ~]$ ls -l /remote/production/ ls: cannot open directory '/remote/production/': Permission denied [manager1@servera ~]$ exit logout [student@servera ~]$ 3.3. Cambie al usuario dbuser1 y pruebe el acceso. RH134-RHEL8.2-es-1-20200928 273 capítulo 9 | Acceso al almacenamiento conectado a la red [student@servera ~]$ su - dbuser1 Password: redhat [dbuser1@servera ~]$ ls -l /remote/production/ total 4 -rw-r--r--. 1 root production 46 Apr 4 01:13 Welcome.txt [dbuser1@servera ~]$ cat /remote/production/Welcome.txt ###Welcome to Production Folder on SERVERB### [dbuser1@servera ~]$ echo TEST2 > /remote/production/Test.txt [dbuser1@servera ~]$ cat /remote/production/Test.txt TEST2 [dbuser1@servera ~]$ ls -l /remote/operation/ ls: cannot open directory '/remote/operation/': Permission denied [dbuser1@servera ~]$ ls -l /remote/management/ ls: cannot open directory '/remote/management/': Permission denied [dbuser1@servera ~]$ exit logout [student@servera ~]$ 3.4. Cambie al usuario contractor1 y pruebe el acceso. [student@servera ~]$ su - contractor1 Password: redhat [contractor1@servera ~]$ ls -l /remote/operation/ total 4 -rw-r--r--. 1 root operators 45 Apr 4 01:13 Welcome.txt [contractor1@servera ~]$ cat /remote/operation/Welcome.txt ###Welcome to Operation Folder on SERVERB### [contractor1@servera ~]$ echo TEST3 > /remote/operation/Test.txt [contractor1@servera ~]$ cat /remote/operation/Test.txt TEST3 [contractor1@servera ~]$ ls -l /remote/management/ ls: cannot open directory '/remote/management/': Permission denied [contractor1@servera ~]$ ls -l /remote/production/ ls: cannot open directory '/remote/production/': Permission denied [contractor1@servera ~]$ exit logout [student@servera ~]$ 3.5. Explore las opciones de mount para el recurso compartido NFS montado automáticamente. [student@servera ~]$ mount | grep nfs rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime) serverb.lab.example.com:/shares/management on /remote/management type nfs4 (rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255, sync,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.25.250.10, local_lock=none,addr=172.25.250.11) serverb.lab.example.com:/shares/operation on /remote/operation type nfs4 (rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255, sync,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.25.250.10, local_lock=none,addr=172.25.250.11) serverb.lab.example.com:/shares/production on /remote/production type nfs4 274 RH134-RHEL8.2-es-1-20200928 capítulo 9 | Acceso al almacenamiento conectado a la red (rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255, sync,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.25.250.10, local_lock=none,addr=172.25.250.11) 3.6. Cierre sesión en servera. [student@servera ~]$ exit logout [student@workstation ~]$ Evaluación En workstation, ejecute el comando lab netstorage-review grade para confirmar que ha realizado correctamente este ejercicio. [student@workstation ~]$ lab netstorage-review grade Finalizar En workstation, ejecute el comando lab netstorage-review finish para terminar este ejercicio. [student@workstation ~]$ lab netstorage-review finish Esto concluye el trabajo de laboratorio. RH134-RHEL8.2-es-1-20200928 275 capítulo 9 | Acceso al almacenamiento conectado a la red Resumen En este capítulo, aprendió cómo hacer lo siguiente: • Montar y desmontar una exportación de NFS desde la línea de comandos. • Configurar una exportación de NFS para montarse automáticamente en el inicio. • Configurar el servicio de automontaje con asignaciones directas e indirectas, así como describir sus diferencias. 276 RH134-RHEL8.2-es-1-20200928 capítulo 10 Control del proceso de arranque Meta Administrar el proceso de arranque para controlar los servicios ofrecidos y para solucionar y reparar problemas. Objetivos • Describir el proceso de arranque de Red Hat Enterprise Linux, configurar el objetivo predeterminado que se usa en el arranque e iniciar un sistema con un objetivo no predeterminado. • Iniciar sesión en un sistema y cambiar la contraseña de root cuando la actual se haya perdido. • Reparar manualmente la configuración del sistema de archivos o problemas de daños que detengan el proceso de arranque. • Selección del objetivo de arranque (y ejercicio guiado) • Restablecimiento de la contraseña de root (y ejercicio guiado) • Reparación de problemas de sistemas de archivos en el arranque (y ejercicio guiado) Secciones Trabajo de laboratorio RH134-RHEL8.2-es-1-20200928 Control del proceso de arranque 277 capítulo 10 | Control del proceso de arranque Selección del objetivo de arranque Objetivos Tras finalizar esta sección, usted deberá ser capaz de realizar lo siguiente: • Describir el proceso de arranque de Red Hat Enterprise Linux. • Establecer el objetivo predeterminado usado en el arranque. • Arrancar un sistema con un objetivo no predeterminado. Descripción del proceso de arranque de Red Hat Enterprise Linux 8 Los sistemas de computación modernos son combinaciones complejas de hardware y software. Desde un estado de apagado no definido hasta un sistema de ejecución con un prompt de inicio de sesión, se requiere una gran cantidad de piezas de hardware y software que funcionen en conjunto. En la siguiente lista, se proporciona una descripción general de alto nivel de las tareas de arranque de un sistema físico x86_64 de Red Hat Enterprise Linux 8. La lista de máquinas virtuales x86_64 es prácticamente la misma, pero el hipervisor maneja algunos de los pasos específicos del hardware en el software. • La máquina se enciende. El firmware del sistema (UEFI moderno o BIOS anterior) ejecuta una prueba automática de encendido (Power On Self Test, POST) y comienza a inicializar parte del hardware. Se ajusta por medio de las pantallas de configuración de BIOS o UEFI del sistema, a las cuales se llega típicamente al presionar una determinada combinación de teclas (p. ej., F2) al principio del proceso de arranque. • El firmware del sistema busca un dispositivo con capacidad de arranque, ya sea configurado en el firmware de arranque UEFI o al buscar un Master Boot Record (MBR) en todos los discos, en el orden configurado en el BIOS. Se ajusta por medio de las pantallas de configuración de BIOS o UEFI del sistema, a las cuales se llega típicamente al presionar una determinada combinación de teclas (p. ej., F2) al principio del proceso de arranque. • El firmware del sistema lee un cargador de arranque desde el disco, luego pasa el control del sistema al cargador de arranque. En un sistema de Red Hat Enterprise Linux 8, el cargador de arranque es GRand Unified Bootloader versión 2 (GRUB2). Se configura con el comando grub2-install, el cual instala GRUB2 como el cargador de arranque en el disco. • GRUB2 carga su configuración desde el archivo /boot/grub2/grub.cfg y muestra un menú donde puede seleccionar qué kernel arrancar. Se configura por medio del directorio /etc/grub.d/, el archivo /etc/default/grub y el comando grub2-mkconfig para generar el archivo /boot/grub2/grub.cfg. 278 RH134-RHEL8.2-es-1-20200928 capítulo 10 | Control del proceso de arranque • Después de seleccionar un kernel, o después de que el tiempo de espera finaliza, el cargador de arranque carga el kernel e initramfs desde el disco y los coloca en la memoria. Un initramfs es una colección de archivos que contiene módulos del kernel para todo el hardware necesario en el arranque, scripts de inicialización y más. En Red Hat Enterprise Linux 8, initramfs contiene un sistema totalmente usable por sí solo. Se configura por medio del directorio /etc/dracut.conf.d/, el comando dracut y el comando lsinitrd para inspeccionar el archivo initramfs. • El cargador de arranque pasa el control al kernel, y detalla todas las opciones especificadas en la línea de comandos del kernel en el cargador de arranque, y la ubicación del initramfs en la memoria. Se configura por medio del directorio /etc/grub.d/, el archivo /etc/default/grub y el comando grub2-mkconfig para generar el archivo /boot/grub2/grub.cfg. • El kernel inicializa todo el hardware para el que puede encontrar un controlador en initramfs y, luego, ejecuta /sbin/init desde initramfs como PID 1. En Red Hat Enterprise Linux 8, / sbin/init es un enlace a systemd. Se configura por medio del parámetro de la línea de comandos init= del kernel. • La instancia systemd desde initramfs ejecuta todas las unidades para el objetivo initrd.target. Esto incluye el montaje del sistema de archivos root en el disco en el directorio /sysroot. Se configura por medio de /etc/fstab • El kernel cambia (articula) el sistema de archivos root desde initramfs al sistema de archivos root en /sysroot. A continuación, systemd vuelve a ejecutarse usando la copia de systemd instalada en el disco. • systemd busca un objetivo predeterminado, ya sea especificado desde la línea de comandos del kernel o configurado en el sistema; luego, inicia (y detiene) unidades para cumplir con la configuración para ese objetivo, y resuelve dependencias entre unidades automáticamente. Básicamente, un objetivo systemd es un conjunto de unidades que el sistema debe activar para alcanzar un estado deseado. Por lo general, estos objetivos inician una pantalla de inicio de sesión basado en texto o inicio de sesión gráfico. Se configura por medio de /etc/systemd/system/default.target y /etc/systemd/ system/. Reinicio y apagado Para apagar o reiniciar un sistema en ejecución desde la línea de comandos, puede usar el comando systemctl. systemctl poweroff detiene todos los servicios en ejecución, desmonta todos los sistemas de archivos (o vuelve a montarlos como solo lectura cuando no se puedan desmontar) y, luego, apaga el sistema. systemctl reboot detiene todos los servicios en ejecución, desmonta todos los sistemas de archivos y, luego, reinicia el sistema. También puede usar el atajo de estos comandos, poweroff y reboot, que son enlaces simbólicos a sus equivalentes de systemctl. RH134-RHEL8.2-es-1-20200928 279 capítulo 10 | Control del proceso de arranque nota systemctl halt y halt también están disponibles para detener el sistema, pero a diferencia de poweroff, estos comandos no apagan el sistema, sino que lo llevan hasta un punto donde es seguro apagarlo manualmente. Selección de un objetivo de Systemd Un objetivo de systemd es un conjunto de unidades de systemd que el sistema debe iniciar para alcanzar un estado deseado. En la siguiente tabla, se detallan los objetivos más importantes. Objetivos que se usan normalmente Objetivo Propósito graphical.target El sistema admite varios usuarios, e inicios de sesión gráficos y basados en texto. multi-user.target El sistema admite varios usuarios y solo inicios de sesión basados en texto. rescue.target Prompt sulogin, inicialización del sistema básica finalizada. emergency.target Prompt sulogin, cambio de initramfs completo y root de sistema montado en / con acceso de solo lectura. Un objetivo puede ser parte de otro objetivo. Por ejemplo, graphical.target incluye multiuser.target, que a su vez depende de basic.target y otros. Puede ver estas dependencias con el siguiente comando. [user@host ~]$ systemctl list-dependencies graphical.target | grep target graphical.target * └─multi-user.target * ├─basic.target * │ ├─paths.target * │ ├─slices.target * │ ├─sockets.target * │ ├─sysinit.target * │ │ ├─cryptsetup.target * │ │ ├─local-fs.target * │ │ └─swap.target ...output omitted... Para enumerar los objetivos disponibles, use el siguiente comando. [user@host ~]$ systemctl list-units --type=target --all UNIT LOAD ACTIVE SUB DESCRIPTION --------------------------------------------------------------------------basic.target loaded active active Basic System cryptsetup.target loaded active active Local Encrypted Volumes emergency.target loaded inactive dead Emergency Mode getty-pre.target loaded inactive dead Login Prompts (Pre) 280 RH134-RHEL8.2-es-1-20200928 capítulo 10 | Control del proceso de arranque getty.target graphical.target ...output omitted... loaded loaded active active Login Prompts inactive dead Graphical Interface Selección de un objetivo en el tiempo de ejecución En un sistema en ejecución, los administradores pueden cambiar a un objetivo diferente usando el comando systemctl isolate. [root@host ~]# systemctl isolate multi-user.target Si aísla un objetivo, detiene todos los servicios no requeridos por ese objetivo (y sus dependencias), e inicia todos los servicios requeridos que aún no se hayan iniciado. No todos los objetivos se pueden aislar. Solo puede aislar objetivos que tengan AllowIsolate=yes establecido en sus archivos de unidad. Por ejemplo, puede aislar el objetivo gráfico, pero no el objetivo cryptsetup. [user@host ~]$ systemctl cat graphical.target # /usr/lib/systemd/system/graphical.target ...output omitted... [Unit] Description=Graphical Interface Documentation=man:systemd.special(7) Requires=multi-user.target Wants=display-manager.service Conflicts=rescue.service rescue.target After=multi-user.target rescue.service rescue.target display-manager.service AllowIsolate=yes [user@host ~]$ systemctl cat cryptsetup.target # /usr/lib/systemd/system/cryptsetup.target ...output omitted... [Unit] Description=Local Encrypted Volumes Documentation=man:systemd.special(7) Configuración de un objetivo predeterminado Cuando el sistema se inicia, systemd activa el objetivo default.target. Normalmente, el objetivo predeterminado en /etc/systemd/system/ es un enlace simbólico a graphical.target o multi-user.target. En lugar de editar este enlace simbólico manualmente, el comando systemctl viene con dos subcomandos para administrar este enlace: get-default y set-default. [root@host ~]# systemctl get-default multi-user.target [root@host ~]# systemctl set-default graphical.target Removed /etc/systemd/system/default.target. Created symlink /etc/systemd/system/default.target -> /usr/lib/systemd/system/ graphical.target. [root@host ~]# systemctl get-default graphical.target RH134-RHEL8.2-es-1-20200928 281 capítulo 10 | Control del proceso de arranque Selección de un objetivo diferente en el momento del arranque Para seleccionar un objetivo diferente en el momento del arranque, agregue la opción systemd.unit=target.target a la línea de comandos del kernel desde el cargador de arranque. Por ejemplo, para iniciar el sistema en una shell de recuperación donde pueda cambiar la configuración del sistema sin casi ningún servicio en ejecución, agregue la siguiente opción a la línea de comandos del kernel desde el cargador de arranque. systemd.unit=rescue.target Este cambio de configuración solo afecta a un único arranque, lo que hace que sea una herramienta útil para la solución de problemas en el proceso de arranque. Para usar este método de selección de un objetivo diferente, use el siguiente procedimiento: 1. Arranque o reinicie el sistema. 2. Interrumpa la cuenta regresiva del menú del cargador de arranque presionando cualquier tecla (excepto Enter que iniciaría un arranque normal). 3. Mueva el cursor hasta la entrada del kernel que desea iniciar. 4. Presione e para editar la entrada actual. 5. Mueva el cursor hasta la línea que comienza con linux. Esta es la línea de comandos del kernel. 6. Anexe systemd.unit=target.target. Por ejemplo, systemd.unit=emergency.target. 7. Presione Ctrl+x para realizar el arranque con estos cambios. Referencias info grub2 (Manual GNU GRUB) Páginas del manual: bootup(7), dracut.bootup(7), lsinitrd(1), systemd.target(5), systemd.special(7), sulogin(8) y systemctl(1) Para obtener más información, consulte el capítulo Administración de servicios con systemd en la Guía de configuración básica de sistemas en https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/htmlsingle/configuring_basic_system_settings/#managing-services-with-systemd 282 RH134-RHEL8.2-es-1-20200928 capítulo 10 | Control del proceso de arranque Ejercicio Guiado Selección del objetivo de arranque En este ejercicio, determinará el objetivo predeterminado en el que se inicia un sistema, y arrancará ese sistema en otros objetivos. Resultados Debe ser capaz de actualizar el objetivo predeterminado del sistema y usar un objetivo temporal desde el cargador de arranque. Andes De Comenzar Inicie sesión con el usuario student en workstation con la contraseña student. En workstation, ejecute el comando lab boot-selecting start. Este comando ejecuta un script de inicio que prepara a workstation para el ejercicio. [student@workstation ~]$ lab boot-selecting start 1. En workstation, abra una terminal y confirme que el objetivo predeterminado sea graphical.target. [student@workstation ~]$ systemctl get-default graphical.target 2. En workstation, cambie al objetivo multi-user manualmente sin reiniciar. Use el comando sudo y, si se le solicita, use student como la contraseña. [student@workstation ~]$ sudo systemctl isolate multi-user.target [sudo] password for student: student 3. Acceda a una consola basada en texto. Use la secuencia de teclas Ctrl+Alt+F1 por medio de la entrada del menú o el botón relevantes. Inicie sesión como root con redhat como contraseña. nota Recordatorio: si está utilizando el terminal a través de una página web, puede hacer clic en el ícono Mostrar teclado debajo de la barra de URL de su navegador web y luego a la derecha de la dirección IP de la máquina. workstation login: root Password: redhat [root@workstation ~]# RH134-RHEL8.2-es-1-20200928 283 capítulo 10 | Control del proceso de arranque 4. Configure workstation para que arranque automáticamente en el objetivo multi-user y, luego, reinicie workstation para verificarlo. Cuando haya finalizado, cambie el objetivo systemd predeterminado al objetivo gráfico nuevamente. 4.1. Use el comando systemctl set-default para establecer el objetivo predeterminado. [root@workstation ~]# systemctl set-default multi-user.target Removed /etc/systemd/system/default.target. Created symlink /etc/systemd/system/default.target -> /usr/lib/systemd/system/ multi-user.target. 4.2. Reinicie workstation. [root@workstation ~]# systemctl reboot Tenga en cuenta que, después del reinicio, el sistema presenta una consola basada en texto, no un inicio de sesión gráfico. 4.3. Inicie sesión como root con redhat como contraseña. workstation login: root Password: redhat Last login: Thu Mar 28 14:50:53 on tty1 [root@workstation ~]# 4.4. Configure el objetivo systemd predeterminado nuevamente al objetivo gráfico. [root@workstation ~]# systemctl set-default graphical.target Removed /etc/systemd/system/default.target. Created symlink /etc/systemd/system/default.target -> /usr/lib/systemd/system/ graphical.target. Esto concluye la primera parte del ejercicio donde practica la configuración del objetivo systemd predeterminado. 5. En esta segunda parte del ejercicio, practicará el modo de recuperación para recuperar el sistema. Reinicie workstation nuevamente para acceder al cargador de arranque. Desde el menú del cargador de arranque, arranque en el objetivo rescue (recuperación). 5.1. Active el reinicio. [root@workstation ~]# systemctl reboot 284 5.2. Cuando el menú del cargador de arranque aparezca, presione cualquier tecla (excepto Enter que iniciaría un arranque normal) para interrumpir la cuenta regresiva. 5.3. Use las teclas de dirección para destacar la entrada del cargador de arranque predeterminada. 5.4. Presione e para editar la entrada actual. RH134-RHEL8.2-es-1-20200928 capítulo 10 | Control del proceso de arranque 5.5. Con las teclas de dirección, navegue hacia la línea que comienza con linux. 5.6. Presione End (Fin) para mover el cursor hasta el final de la línea. 5.7. Agregue systemd.unit=rescue.target en el final de la línea. 5.8. Presione Ctrl+x para realizar el arranque con la configuración modificada. 5.9. Inicie sesión en el modo de recuperación. La contraseña root es redhat Es posible que tenga que presionar Enter (Intro) para obtener un prompt limpio. Give root password for maintenance (or press Control-D to continue): redhat [root@workstation ~]# 6. Confirme que, en el modo de recuperación, el sistema de archivos root se encuentre en el modo de lectura/escritura. [root@workstation ~]# mount ...output omitted... /dev/vda3 on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota) ...output omitted... 7. Presione Ctrl+d para continuar con el proceso de arranque. El sistema presenta un inicio de sesión gráfico. Inicie sesión como student usando student como contraseña. Finalizar En workstation, ejecute el script lab boot-selecting finish para terminar este ejercicio. [student@workstation ~]$ lab boot-selecting finish Esto concluye el ejercicio guiado. RH134-RHEL8.2-es-1-20200928 285 capítulo 10 | Control del proceso de arranque Restablecimiento de la contraseña de root Objetivos Tras finalizar esta sección, usted deberá ser capaz de iniciar sesión en un sistema y cambiar la contraseña root cuando la contraseña root actual se haya perdido. Restablecer la contraseña de root desde el cargador de arranque. Una tarea que todos los administradores de sistemas deben ser capaces de realizar es restablecer una contraseña root perdida. Si el administrador aún tiene la sesión iniciada, ya sea como usuario sin privilegios, pero con acceso sudo completo, o como root, esta tarea es sencilla. Cuando el administrador no ha iniciado sesión, esta tarea es un poco más complicada. Existen muchos métodos para establecer una nueva contraseña root. Un administrador de sistemas podría, por ejemplo, arrancar el sistema usando un CD Live, montar el sistema de archivos root desde allí y editar /etc/shadow. En esta sección, exploramos un método que no requiere el uso de medios externos. nota En Red Hat Enterprise Linux 6 y en las versiones anteriores, los administradores pueden arrancar el sistema en el nivel de ejecución 1 para obtener un prompt de root. Los análogos más cercanos al nivel de ejecución 1 en una máquina Red Hat Enterprise Linux 8 son los objetivos de recuperación y emergencia, y ambos requieren la contraseña root para iniciar sesión. En Red Hat Enterprise Linux 8, es posible tener scripts que se ejecuten desde la pausa de initramfs en ciertos puntos, proporcionar una shell root y, luego, continuar cuando esa shell se cierre. Esto se suele realizar principalmente para depuraciones, pero también se puede usar para restablecer una contraseña root perdida. Para acceder a la shell root, siga estos pasos: 1. Reinicie el sistema. 2. Interrumpa la cuenta regresiva del cargador de arranque presionando cualquier tecla (excepto Enter). 3. Mueva el cursor hasta la entrada del kernel que debe iniciarse. 4. Presione e para editar la entrada seleccionada. 5. Mueva el cursor hasta la línea de comandos del kernel (la línea que empieza con linux). 6. Agregue rd.break. Con esa opción, se produce un quiebre en el sistema antes de que el control se entregue de initramfs al sistema real. 7. Presione Ctrl+x para realizar el arranque con los cambios. 286 RH134-RHEL8.2-es-1-20200928 capítulo 10 | Control del proceso de arranque En este punto, se presenta una shell root, con el sistema de archivos root real en el disco montado para solo lectura en /sysroot. Debido a que la solución de problemas suele exigir modificaciones en el sistema de archivos root, debe cambiar el sistema de archivos root para que su acceso sea de lectura-escritura. En el siguiente paso, se muestra cómo la opción remount,rw del comando mount vuelve a montar el sistema de archivos con la opción nueva, (rw), configurada. nota Es posible que las imágenes compiladas previamente coloquen múltiples argumentos console= en el kernel para respaldar una amplia variedad de situaciones de implementación. Estos argumentos console= indican los dispositivos que se deben usar para la salida por consola. La advertencia con rd.break es que si bien el sistema envía los mensajes del kernel a todas las consolas, el prompt usará en última instancia la última consola. Si no recibe el prompt, es posible que desee reordenar temporalmente los argumentos console= cuando edite la línea de comandos del kernel desde el cargador de arranque. Importante El sistema aún no ha habilitado SELinux, por lo que cualquier archivo que cree no tiene un contexto SELinux. Algunas herramientas, como el comando passwd, primero crean un archivo temporal, y, luego, lo trasladan al lugar del archivo que intentan editar; y se crea así de manera efectiva un nuevo archivo sin un contexto SELinux. Por este motivo, cuando usa el comando passwd con rd.break, el archivo /etc/shadow no tiene un contexto SELinux. Para restablecer la contraseña root desde este punto, realice el siguiente procedimiento: 1. Vuelva a montar /sysroot con acceso de lectura-escritura. switch_root:/# mount -o remount,rw /sysroot 2. Cambie a jail de chroot, donde /sysroot se trata como la root de un árbol de sistemas de archivos. switch_root:/# chroot /sysroot 3. Establezca una nueva contraseña root. sh-4.4# passwd root 4. Asegúrese de que todos los archivos no etiquetados, incluido /etc/shadow en este punto, obtengan una nueva etiqueta durante el arranque. sh-4.4# touch /.autorelabel 5. Ingrese exit dos veces. El primer comando saldrá del jail de chroot y el segundo comando saldrá de la shell de depuración de initramfs. RH134-RHEL8.2-es-1-20200928 287 capítulo 10 | Control del proceso de arranque En este punto, el sistema continúa con el arranque, realiza un nuevo etiquetado de SELinux completo y, luego, realiza el arranque nuevamente. Inspección de registros Puede ser útil mirar los registros de arranques anteriores que fallaron. Si los diarios (journals) del sistema son persistentes durante los reinicios, puede usar la herramienta journalctl para inspeccionar esos registros. Recuerde que, de manera predeterminada, los diarios (journals) del sistema se almacenan en el directorio /run/log/journal, lo que significa que se borran cuando se reinicia el sistema. Para almacenar diarios (journals) en el directorio /var/log/journal, que no se borra en los reinicios, configure el parámetro Storage en persistent (persistente) en /etc/systemd/ journald.conf. [root@host ~]# vim /etc/systemd/journald.conf ...output omitted... [Journal] Storage=persistent ...output omitted... [root@host ~]# systemctl restart systemd-journald.service Para inspeccionar los registros de un arranque anterior, use la opción -b de journalctl. Sin ningún argumento, la opción -b solo muestra mensajes desde el último arranque. Si el argumento es un número negativo, se muestran los registros de los arranques anteriores. [root@host ~]# journalctl -b -1 -p err Este comando muestra todos los mensajes calificados como error o peor del arranque anterior. Reparación de problemas de arranque de Systemd Para solucionar problemas de inicio del servicio en el momento del arranque, Red Hat Enterprise Linux 8 ofrece las siguientes estrategias. Habilitar la shell de depuración temprana Al habilitar el servicio debug-shell con systemctl enable debug-shell.service, el sistema genera una shell root en TTY9 (Ctrl+Alt+F9) al principio de la secuencia de arranque. Esta shell inicia sesión automáticamente como root, de modo que los administradores pueden depurar el sistema mientras el sistema operativo aún está arrancando. Advertencia No olvide deshabilitar el servicio debug-shell.service cuando haya finalizado la depuración, ya que deja una shell root no autenticada abierta a cualquier usuario con acceso a la consola local. Usar los objetivos de emergencia y recuperación Al agregar systemd.unit=rescue.target o systemd.unit=emergency.target delante de la línea de comandos del kernel desde el cargador de arranque, el sistema indica una shell de emergencia o recuperación en lugar de iniciarse normalmente. Estas dos shells requieren la contraseña root. 288 RH134-RHEL8.2-es-1-20200928 capítulo 10 | Control del proceso de arranque El objetivo de emergencia mantiene el sistema de archivos root montado con solo lectura; mientras que el objetivo de recuperación espera que sysinit.target se complete, para que una mayor parte del sistema se inicie (p. ej., servicio de inicio de sesión o sistemas de archivos). El usuario root en este punto no puede hacer cambios a /etc/fstab hasta que la unidad se vuelva a montar en un estado de lectura/escritura mount -o remount,rw / Los administradores pueden usar estas shells para corregir problemas que impiden que el sistema arranque normalmente; por ejemplo, un bucle de dependencia entre servicios o una entrada incorrecta en /etc/fstab. Cuando se sale de estas shells, continúa el proceso de arranque regular. Identificar trabajos atascados Durante el inicio, systemd inicia una cantidad de trabajos. Si alguno de estos trabajos no se puede completar, impide que otros trabajos se ejecuten. Para inspeccionar la lista de trabajos actual, los administradores pueden usar el comando systemctl list-jobs. Todos los trabajos detallados como en ejecución deben completarse para que los trabajos detallados como en espera puedan continuar. Referencias Páginas del manual: dracut.cmdline(7), systemd-journald(8), journald.conf(5), journalctl(1) y systemctl(1) RH134-RHEL8.2-es-1-20200928 289 capítulo 10 | Control del proceso de arranque Ejercicio Guiado Restablecimiento de la contraseña de root En este ejercicio, restablecerá la contraseña root en un sistema. Resultados Deberá ser capaz de restablecer una contraseña root perdida. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab boot-resetting start. Este comando ejecuta un script de inicio que determina si la máquina servera es accesible en la red. También restablece la contraseña root a una cadena aleatoria y establece un tiempo de espera mayor para el menú de GRUB2. [student@workstation ~]$ lab boot-resetting start 1. Vuelva a arrancar servera e interrumpa la cuenta regresiva en el menú del cargador de arranque. 1.1. Localice el icono de la consola de servera, según corresponda para el entorno del aula. Abra la consola. Envíe Ctrl+Alt+Del a su sistema usando la entrada del menú o el botón relevantes. 1.2. 2. Cuando el menú del cargador de arranque aparezca, presione cualquier tecla (excepto Enter) para interrumpir la cuenta regresiva. Edite la entrada del cargador de arranque predeterminada (en la memoria) para anular el proceso de arranque después de que todos los sistemas de archivos hayan sido montados por el kernel, pero antes de que el control se entregue a systemd. 2.1. Use las teclas de dirección para destacar la entrada del cargador de arranque predeterminada. 2.2. Presione e para editar la entrada actual. 2.3. Use las teclas de dirección para navegar hacia la línea que comienza con linux. 2.4. Presione End (Fin) para mover el cursor hasta el final de la línea. 2.5. Agregue rd.break en el final de la línea. 2.6. Presione Ctrl+x para realizar el arranque con la configuración modificada. 3. En el prompt switch_root, vuelva a montar el sistema de archivos /sysroot con acceso de lectura-escritura y, luego, use chroot para ir a un jail chroot en /sysroot. 290 RH134-RHEL8.2-es-1-20200928 capítulo 10 | Control del proceso de arranque switch_root:/# mount -o remount,rw /sysroot switch_root:/# chroot /sysroot 4. Cambie la contraseña de root nuevamente a redhat. sh-4.4# passwd root Changing password for user root. New password: redhat BAD PASSWORD: The password is shorter than 8 characters Retype new password: redhat passwd: all authentication tokens updated successfully. 5. Configure el sistema para que realice automáticamente un etiquetado nuevo de SELinux completo después del arranque. Esto es necesario porque el comando passwd recrea el archivo /etc/shadow sin un contexto SELinux. sh-4.4# touch /.autorelabel 6. Escriba exit dos veces para continuar reiniciando su sistema de forma normal. El sistema ejecuta un nuevo etiquetado SELinux y, luego, vuelve a arrancar nuevamente por sí solo. Cuando el sistema esté funcionando, verifique su trabajo al iniciar sesión como root en la consola. Use redhat como la contraseña. Finalizar En workstation, ejecute el script lab boot-resetting finish para terminar este ejercicio. [student@workstation ~]$ lab boot-resetting finish Esto concluye el ejercicio guiado. RH134-RHEL8.2-es-1-20200928 291 capítulo 10 | Control del proceso de arranque Reparación de problemas del sistema de archivos en el arranque Objetivos Tras finalizar esta sección, usted deberá ser capaz de reparar manualmente la configuración del sistema de archivos o problemas de daños que detengan el proceso de arranque. Diagnosticar y corregir problemas del sistema de archivos Los errores en sistemas de archivos dañados y en /etc/fstab pueden impedir que un sistema arranque. En la mayoría de los casos, systemd cae a una shell de reparación que requiere la contraseña de root. En la siguiente tabla, se detallan algunos errores comunes y sus resultados. Problemas comunes del sistema de archivos Problema Resultado Sistema de archivos dañado systemd intenta reparar el sistema de archivos. Si el problema es demasiado grave y no admite una corrección automática, el sistema pasa al usuario a una shell de emergencia. Dispositivo no existente o UUID mencionado en /etc/ fstab systemd espera un tiempo establecido a que el dispositivo esté disponible. Si el dispositivo no aparece como disponible, el sistema pasa al usuario a una shell de emergencia después del tiempo de espera. Punto de montaje no existente en /etc/fstab El sistema pasa al usuario a una shell de emergencia. Opción de montaje incorrecta especificada en /etc/fstab El sistema pasa al usuario a una shell de emergencia. En todos los casos, los administradores también pueden usar el objetivo de emergencia para diagnosticar y corregir el problema, dado que ningún sistema de archivos se monta antes de que se muestre la shell de emergencia. nota Cuando use la shell de emergencia para resolver problemas del sistema de archivos, no olvide ejecutar systemctl daemon-reload después de editar /etc/fstab. Sin esta recarga, systemd puede continuar usando la versión anterior. La opción nofail en una entrada en el archivo /etc/fstab permite que el sistema arranque, incluso si el montaje de ese sistema de archivos no se ejecuta de forma correcta. No use esta opción en circunstancias normales. Con nofail, una aplicación se puede iniciar sin el almacenamiento y generar posibles consecuencias graves. 292 RH134-RHEL8.2-es-1-20200928 capítulo 10 | Control del proceso de arranque Referencias Páginas del manual: systemd-fsck(8), systemd-fstab-generator(8) y systemd.mount(5) RH134-RHEL8.2-es-1-20200928 293 capítulo 10 | Control del proceso de arranque Ejercicio Guiado Reparación de problemas del sistema de archivos en el arranque En este ejercicio, recuperará un sistema de una configuración incorrecta en /etc/fstab que hace que el proceso de arranque falle. Resultados Debe ser capaz de diagnosticar problemas de /etc/fstab y usar el modo de emergencia para recuperar el sistema. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab boot-repairing start. Este comando ejecuta un script de inicio que determina si la máquina servera es accesible en la red. También introduce un problema del sistema de archivos, establece un tiempo de espera mayor para el menú de GRUB2 y reinicia servera. [student@workstation ~]$ lab boot-repairing start 1. Acceda a la consola de servera y observe que el proceso de arranque no se ejecuta correctamente desde el principio. 1.1. Localice el icono de la consola de servera, según corresponda para el entorno del aula. Abra la consola. Advierta que, al parecer, un trabajo de inicio no se ejecuta por completo. Tómese un momento para especular sobre la posible causa de este comportamiento. 1.2. Para reiniciar, envíe Ctrl+Alt+Del a su sistema usando la entrada del menú o el botón relevantes. En el caso de este problema de arranque en particular, esta secuencia de teclas puede no detener inmediatamente el trabajo en ejecución, y es posible que tenga que esperar a que finalice el tiempo de espera antes de que el sistema se reinicie. Si espera a que la tarea finalice el tiempo de espera sin enviar Ctrl+Alt+Del, el sistema eventualmente genera por su cuenta una shell de emergencia. 1.3. 2. 294 Cuando el menú del cargador de arranque aparezca, presione cualquier tecla (excepto Enter) para interrumpir la cuenta regresiva. Si observa el error que tuvo en el arranque anterior, parece que al menos ciertas partes del sistema aún están funcionando. Puesto que sabe la contraseña de root (redhat), intente un arranque de emergencia. 2.1. Use las teclas de dirección para destacar la entrada del cargador de arranque predeterminada. 2.2. Presione e para editar la entrada actual. RH134-RHEL8.2-es-1-20200928 capítulo 10 | Control del proceso de arranque 3. 2.3. Use las teclas de dirección para navegar hacia la línea que comienza con linux. 2.4. Presione End (Fin) para mover el cursor hasta el final de la línea. 2.5. Agregue systemd.unit=emergency.target en el final de la línea. 2.6. Presione Ctrl+x para realizar el arranque con la configuración modificada. Inicie sesión en el modo de emergencia. La contraseña de root es redhat. Give root password for maintenance (or press Control-D to continue): redhat [root@servera ~]# 4. Determine qué sistemas de archivos están montados actualmente. [root@servera ~]# mount ...output omitted... /dev/vda1 on / type xfs (ro,relatime,seclabel,attr2,inode64,noquota) ...output omitted... Tenga en cuenta que el sistema de archivos root se monta con acceso de solo lectura. 5. Vuelva a montar el sistema de archivos root con acceso de lectura-escritura. [root@servera ~]# mount -o remount,rw / 6. Use el comando mount -a para intentar montar todos los demás sistemas de archivos. Con la opción --all (-a), el comando monta todos los sistemas de archivos detallados en /etc/fstab que todavía no están montados. [root@servera ~]# mount -a mount: /RemoveMe: mount point does not exist. 7. Edite /etc/fstab para corregir el problema. 7.1. Elimine o comente la línea incorrecta. [root@servera ~]# vim /etc/fstab ...output omitted... # /dev/sdz1 /RemoveMe xfs defaults 7.2. 0 0 Actualice systemd para que el sistema registre la configuración de /etc/fstab nueva. [root@servera ~]# systemctl daemon-reload 8. Intente montar todas las entradas para verificar que su /etc/fstab ahora sea correcto. [root@servera ~]# mount -a RH134-RHEL8.2-es-1-20200928 295 capítulo 10 | Control del proceso de arranque 9. Reinicie el sistema y espere a que el arranque finalice. Ahora el sistema debería arrancar normalmente. [root@servera ~]# systemctl reboot Finalizar En workstation, ejecute el script lab boot-repairing finish para terminar este ejercicio. [student@workstation ~]$ lab boot-repairing finish Esto concluye el ejercicio guiado. 296 RH134-RHEL8.2-es-1-20200928 capítulo 10 | Control del proceso de arranque Trabajo de laboratorio Control del proceso de arranque Lista de verificación de rendimiento En este trabajo de laboratorio, restablecerá la contraseña de root en un sistema, corregirá una configuración incorrecta y establecerá el objetivo de arranque predeterminado. Resultados Usted deberá ser capaz de realizar lo siguiente: • Restablecer una contraseña de root perdida. • Diagnosticar y corregir problemas de arranque. • Establecer el objetivo de systemd predeterminado. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab boot-review start. Este comando ejecuta un script de inicio que determina si la máquina serverb es accesible en la red. También introduce un problema del sistema de archivos, restablece la contraseña de root, establece un tiempo de espera mayor para el menú de GRUB2 y reinicia serverb. [student@workstation ~]$ lab boot-review start 1. En serverb, restablezca la contraseña de root como redhat. Localice el icono de la consola de serverb, según corresponda para el entorno del aula. Trabaje desde esa consola. 2. El sistema no arranca. Al parecer, un trabajo de inicio no se ejecuta por completo. Desde la consola, corrija el problema. 3. Cambie el objetivo de systemd predeterminado en serverb para que el sistema inicie automáticamente una interfaz gráfica en el arranque. Todavía no hay una interfaz gráfica instalada en serverb. Para este ejercicio, solo establezca el objetivo predeterminado y no instale los paquetes. Evaluación En workstation, ejecute el script lab boot-review grade para confirmar que ha realizado correctamente este ejercicio. [student@workstation ~]$ lab boot-review grade RH134-RHEL8.2-es-1-20200928 297 capítulo 10 | Control del proceso de arranque Finalizar En workstation, ejecute el script lab boot-review finish para terminar el trabajo de laboratorio. [student@workstation ~]$ lab boot-review finish Esto concluye el trabajo de laboratorio. 298 RH134-RHEL8.2-es-1-20200928 capítulo 10 | Control del proceso de arranque Solución Control del proceso de arranque Lista de verificación de rendimiento En este trabajo de laboratorio, restablecerá la contraseña de root en un sistema, corregirá una configuración incorrecta y establecerá el objetivo de arranque predeterminado. Resultados Usted deberá ser capaz de realizar lo siguiente: • Restablecer una contraseña de root perdida. • Diagnosticar y corregir problemas de arranque. • Establecer el objetivo de systemd predeterminado. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab boot-review start. Este comando ejecuta un script de inicio que determina si la máquina serverb es accesible en la red. También introduce un problema del sistema de archivos, restablece la contraseña de root, establece un tiempo de espera mayor para el menú de GRUB2 y reinicia serverb. [student@workstation ~]$ lab boot-review start 1. En serverb, restablezca la contraseña de root como redhat. Localice el icono de la consola de serverb, según corresponda para el entorno del aula. Trabaje desde esa consola. 1.1. Envíe Ctrl+Alt+Del a su sistema usando la entrada del menú o el botón relevantes. 1.2. Cuando el menú del cargador de arranque aparezca, presione cualquier tecla (excepto Enter) para interrumpir la cuenta regresiva. 1.3. Use las teclas de dirección para destacar la entrada del cargador de arranque predeterminada. 1.4. Presione e para editar la entrada actual. 1.5. Use las teclas de dirección para navegar hacia la línea que comienza con linux. 1.6. Presione End (Fin) para mover el cursor hasta el final de la línea. 1.7. Agregue rd.break en el final de la línea. 1.8. Presione Ctrl+x para realizar el arranque con la configuración modificada. 1.9. En el prompt switch_root, vuelva a montar el sistema de archivos /sysroot con acceso de lectura-escritura y, luego, use chroot para ir a un jail chroot en /sysroot. RH134-RHEL8.2-es-1-20200928 299 capítulo 10 | Control del proceso de arranque switch_root:/# mount -o remount,rw /sysroot switch_root:/# chroot /sysroot 1.10. Establezca la contraseña de root en redhat. sh-4.4# passwd root Changing password for user root. New password: redhat BAD PASSWORD: The password is shorter than 8 characters Retype new password: redhat passwd: all authentication tokens updated successfully. 1.11. Configure el sistema para que realice automáticamente un etiquetado nuevo de SELinux completo después del arranque. sh-4.4# touch /.autorelabel 1.12. 2. Escriba exit dos veces para continuar reiniciando su sistema. El sistema no arranca debido a un problema que resolverá en el siguiente paso. El sistema no arranca. Al parecer, un trabajo de inicio no se ejecuta por completo. Desde la consola, corrija el problema. 2.1. Arranque el sistema en modo de emergencia. Para esto, reinicie serverb al enviar Ctrl+Alt+Del a su sistema usando la entrada del menú o el botón relevantes. 2.2. Cuando el menú del cargador de arranque aparezca, presione cualquier tecla (excepto Enter) para interrumpir la cuenta regresiva. 2.3. Use las teclas de dirección para destacar la entrada del cargador de arranque predeterminada. 2.4. Presione e para editar la entrada actual. 2.5. Use las teclas de dirección para navegar hacia la línea que comienza con linux. 2.6. Presione End (Fin) para mover el cursor hasta el final de la línea. 2.7. Agregue systemd.unit=emergency.target en el final de la línea. 2.8. Presione Ctrl+x para realizar el arranque con la configuración modificada. 2.9. Inicie sesión en el modo de emergencia. La contraseña de root es redhat. Give root password for maintenance (or press Control-D to continue): redhat [root@serverb ~]# 2.10. Vuelva a montar el sistema de archivos / con acceso de lectura-escritura. [root@serverb ~]# mount -o remount,rw / 2.11. 300 Use el comando mount -a para intentar montar todos los demás sistemas de archivos. RH134-RHEL8.2-es-1-20200928 capítulo 10 | Control del proceso de arranque [root@serverb ~]# mount -a mount: /olddata: can't find UUID=4d5c85a5-8921-4a06-8aff-80567e9689bc. 2.12. Edite /etc/fstab para eliminar o comentar la línea incorrecta. [root@serverb ~]# vim /etc/fstab ...output omitted... #UUID=4d5c85a5-8921-4a06-8aff-80567e9689bc /olddata xfs defaults 0 0 2.13. Actualice systemd para que el sistema registre la configuración de /etc/fstab nueva. [root@serverb ~]# systemctl daemon-reload [root@serverb ~]# 2.14. Intente montar todas las entradas para verificar que su /etc/fstab ahora sea correcto. [root@serverb ~]# mount -a [root@serverb ~]# 2.15. Reinicie el sistema y espere a que el arranque finalice. Puesto que creó el archivo /.autorelabel en el primer paso, después de configurar la contraseña de root, el sistema ejecuta un etiquetado nuevo de SELinux y, luego, se reinicia nuevamente por su cuenta. Ahora el sistema debería arrancar normalmente. [root@serverb ~]# systemctl reboot 3. Cambie el objetivo de systemd predeterminado en serverb para que el sistema inicie automáticamente una interfaz gráfica en el arranque. Todavía no hay una interfaz gráfica instalada en serverb. Para este ejercicio, solo establezca el objetivo predeterminado y no instale los paquetes. 3.1. Inicie sesión en serverb como el usuario root. Use redhat como la contraseña. 3.2. Use el comando systemctl set-default para establecer graphical.target como el objetivo predeterminado. [root@serverb ~]# systemctl set-default graphical.target 3.3. Use el comando systemctl get-default para verificar su trabajo. [root@serverb ~]# systemctl get-default graphical.target 3.4. Cierre sesión en serverb. [root@serverb ~]# exit RH134-RHEL8.2-es-1-20200928 301 capítulo 10 | Control del proceso de arranque Evaluación En workstation, ejecute el script lab boot-review grade para confirmar que ha realizado correctamente este ejercicio. [student@workstation ~]$ lab boot-review grade Finalizar En workstation, ejecute el script lab boot-review finish para terminar el trabajo de laboratorio. [student@workstation ~]$ lab boot-review finish Esto concluye el trabajo de laboratorio. 302 RH134-RHEL8.2-es-1-20200928 capítulo 10 | Control del proceso de arranque Resumen En este capítulo, aprendió lo siguiente: • systemctl reboot y systemctl poweroff reinician y apagan el sistema, respectivamente. • systemctl isolate target-name.target cambia a un nuevo objetivo en tiempo de ejecución. • systemctl get-default y systemctl set-default se pueden usar para consultar y establecer el objetivo predeterminado. • Use rd.break en la línea de comandos del kernel para interrumpir el proceso de arranque antes de que se entregue el control desde el initramfs. El sistema de archivos root se monta como solo lectura en /sysroot. • El objetivo de emergencia se puede usar para diagnosticar y corregir problemas de sistemas de archivos. RH134-RHEL8.2-es-1-20200928 303 304 RH134-RHEL8.2-es-1-20200928 capítulo 11 Administración de la seguridad de redes Meta Controlar las conexiones de red a los servicios mediante el firewall del sistema y las reglas de SELinux. Objetivos • Aceptar o rechazar las conexiones de red a los servicios del sistema por medio de las reglas de firewalld. • Controlar si los servicios de red pueden usar puertos de red específicos al administrar las etiquetas de puertos de SELinux. • Administración de firewalls del servidor (y ejercicio guiado) • Control del etiquetado de puertos de SELinux (y ejercicio guiado) Secciones Trabajo de laboratorio RH134-RHEL8.2-es-1-20200928 Administración de firewalls del servidor 305 capítulo 11 | Administración de la seguridad de redes Administración de firewalls del servidor Objetivos Tras finalizar esta sección, usted deberá ser capaz de aceptar o rechazar las conexiones de red a los servicios del sistema por medio de las reglas de firewalld. Conceptos de arquitectura del firewall El kernel de Linux incluye netfilter, un marco (framework) para las operaciones de tráfico de red, como el filtrado de paquetes, la traducción de direcciones de red y la traducción de puertos. Al implementar manejadores en el kernel que interceptan invocaciones de funciones y mensajes, netfilter permite que otros módulos del kernel interactúen directamente con la pila (stack) de red del kernel. El software del firewall emplea estos enlaces para registrar reglas de filtro y funciones que modifican al paquete, lo que permite procesar cada paquete que pasa a través de la pila (stack) de red. Cualquier paquete de red entrante, saliente o reenviado se puede inspeccionar, modificar, eliminar o enrutar mediante programación antes de llegar a los componentes o a las aplicaciones del espacio de usuario. Netfilter es el componente primario en los firewalls de Red Hat Enterprise Linux 8. Nftables supera a netfilter El kernel de Linux también incluye el marco nftables, un nuevo subsistema de clasificación de paquetes y filtros que ha mejorado partes del código de netfilter, pero ha conservado la arquitectura de netfilter (como los enlaces de la pila [stack] de red, el sistema de seguimiento de la conexión y la utilidad de registro). Las ventajas de la actualización de nftables es que ofrece un procesamiento de paquetes más veloz, actualizaciones del conjunto de reglas más rápidas y el procesamiento simultáneo de IPv4 e IPv6 desde las mismas reglas. Otra gran diferencia entre nftables y el marco netfilter original radica en sus interfaces. Netfilter está configurado por medio de múltiples marcos (frameworks) de utilidad, incluidos iptables, ip6tables, arptables y ebtables, que ahora están en desuso. Nftables emplea la utilidad única del espacio de usuario nft, lo que permite que toda la gestión de protocolos se produzca a través de una sola interfaz y elimina la contención histórica causada por diversos front-ends y múltiples interfaces de netfilter. Presentación de firewalld Firewalld es un administrador de firewall dinámico, un front-end para el marco (framework) nftables que usa el comando nft. Hasta la introducción de nftables, firewalld usaba el comando iptables para configurar netfilter de forma directa, como una alternativa mejorada del servicio de iptables. En RHEL 8, firewalld sigue siendo el front-end recomendado, ya que gestiona conjuntos de reglas de firewall por medio de nft. Firewalld sigue siendo capaz de leer y gestionar los archivos de configuración y los conjuntos de reglas de iptables y usa xtables-nft-multi para traducir objetos de iptables directamente a reglas y objetos de nftables. Si bien esto no se aconseja, firewalld se puede configurar para retornar al backend de iptables para casos de usos complejos en los que los conjuntos de reglas existentes de iptables no se pueden procesar correctamente con traducciones de nft. Las aplicaciones consultan el subsistema usando la interfaz de D-Bus. El subsistema de firewalld (disponible desde el paquete RPM de firewalld) no se incluye en una instalación mínima, pero se incluye en una instalación básica. Con firewalld, se simplifica la administración 306 RH134-RHEL8.2-es-1-20200928 capítulo 11 | Administración de la seguridad de redes del firewall al clasificar todo el tráfico de la red en zonas. En función de los criterios (como la dirección IP de la fuente de un paquete o la interfaz de red entrante), el tráfico se desvía a las reglas de firewall para la zona adecuada. Cada zona tiene su propia lista de puertos y servicios que están abiertos o cerrados. nota En el caso de equipos portátiles u otras máquinas que cambian regularmente las redes, NetworkManager se puede usar para configurar automáticamente la zona de firewall para una conexión. Las zonas se personalizan con reglas adecuadas para conexiones particulares. Esto es especialmente útil en el traslado entre el hogar, el trabajo y las redes inalámbricas públicas. Un usuario podría desear llegar al servicio sshd de su sistema cuando se conecta a las redes de su hogar y corporativas, pero no cuando se conecta a la red inalámbrica pública en la tienda de café local. Firewalld verifica la dirección de origen para cada paquete que ingresa al sistema. Si esa dirección de origen está asignada a una zona específica, rigen las reglas de esa zona. Si la dirección de origen no está asignada a una zona, firewalld asocia el paquete con la zona para la interfaz de red entrante, y rigen las reglas para esa zona. Si la interfaz de red no está asociada con una zona por algún motivo, firewalld asocia el paquete con la zona predeterminada. La zona predeterminada no es una zona separada, sino una designación para una zona existente. Inicialmente, firewalld designa la zona public (pública) como la zona predeterminada y asigna la interfaz de bucle invertido de lo a la zona trusted (de confianza). La mayoría de las zonas permiten el tráfico a través del firewall que relaciona una lista de puertos y protocolos particulares (como 631/udp) o servicios predefinidos (como ssh). Si el tráfico no relaciona un puerto y protocolo o servicio permitidos, generalmente se rechaza. (La zona trusted [de confianza], que permite todo el tráfico de forma predeterminada, es una excepción a esto). Zonas predefinidas Firewalld cuenta con zonas predefinidas, cada una de las cuales se puede personalizar. De forma predeterminada, todas las zonas permiten todo el tráfico entrante que sea parte de una comunicación iniciada por el sistema y todo el tráfico saliente. En la siguiente tabla, se detalla esta configuración de zona inicial. Configuración predeterminada de zonas firewalld Nombre de la zona Configuración predeterminada trusted (de confianza) Permite todo el tráfico entrante. home (inicio) Rechaza el tráfico entrante a menos que esté relacionado con tráfico saliente o que relacione los servicios predefinidos ssh, mdns, ippclient, samba-client o dhcpv6-client. RH134-RHEL8.2-es-1-20200928 307 capítulo 11 | Administración de la seguridad de redes Nombre de la zona Configuración predeterminada internal (interna) Rechaza el tráfico entrante a menos que esté relacionado con tráfico saliente o que relacione los servicios predefinidos ssh, mdns, ippclient, samba-client o dhcpv6-client (lo mismo que la zona home para empezar). work (trabajo) Rechaza el tráfico entrante a menos que esté relacionado con tráfico saliente o que relacione los servicios predefinidos ssh, ipp-client o dhcpv6-client. public (pública) Rechaza el tráfico entrante, a menos que esté relacionado con tráfico saliente o que relacione los servicios predefinidos ssh o dhcpv6client. La zona predeterminada para interfaces de red recientemente agregadas. external (externa) Rechaza el tráfico entrante, a menos que esté relacionado con tráfico saliente o que relacione el servicio predefinido ssh. El tráfico IPv4 saliente reenviado a través de esta zona es enmascarado para que luzca como si se hubiera originado desde la dirección IPv4 de la interfaz de red saliente. dmz Rechaza el tráfico entrante, a menos que esté relacionado con tráfico saliente o que relacione el servicio predefinido ssh. block (bloqueo) Rechaza todo el tráfico entrante, a menos que esté relacionado con tráfico saliente. drop (caída) Deja caer todo el tráfico entrante, a menos que esté relacionado con tráfico saliente (ni siquiera responde con errores ICMP). Para conocer una lista de las zonas predefinidas disponibles y sus usos previstos, consulte firewalld.zones(5). Servicios predefinidos Firewalld incluye un número de servicios predefinidos. Estas definiciones de servicio lo ayudan a identificar servicios de red particulares que puede configurar. En lugar de tener que buscar los puertos relevantes para el servicio samba-client, por ejemplo, puede especificar el servicio samba-client compilado previamente para configurar los puertos y protocolos correctos. En la siguiente tabla, se detallan los servicios predefinidos que se emplean en la configuración inicial de zonas de firewall. Servicios firewalld predefinidos seleccionados Nombre del servicio Configuración ssh Servidor SSH local. Tráfico a 22/tcp dhcpv6-client Cliente DHCPv6 local. Tráfico a 546/udp en la red fe80::/64 IPv6 ipp-client Impresión IPP local. Tráfico a 631/udp. samba-client Archivo Windows local y cliente de intercambio de impresión. Tráfico a 137/udp y 138/udp. 308 RH134-RHEL8.2-es-1-20200928 capítulo 11 | Administración de la seguridad de redes Nombre del servicio Configuración mdns Resolución del nombre del enlace local DNS (mDNS) multidifusión (multicast). Tráfico a 5353/udp a las direcciones de multidifusión (multicast) 224.0.0.251 (IPv4) o ff02::fb (IPv6). nota Muchos servicios predefinidos se incluyen en el paquete firewalld. Use firewallcmd --get-services para enumerarlos. Los archivos de configuración para los servicios predefinidos se encuentran en /usr/lib/firewalld/services, en un formato definido por firewalld.zone(5). Use los servicios predefinidos o especifique directamente el puerto y el protocolo requeridos. La interfaz gráfica de la consola web se usa para revisar los servicios predefinidos y para definir servicios adicionales. Configuración del firewall Los administradores de sistemas interactúan con firewalld de tres formas: • mediante la edición directa de archivos de configuración en /etc/firewalld/ (no analizado en este capítulo); • mediante la interfaz gráfica de la consola web; • mediante la herramienta de línea de comandos firewall-cmd. Configuración de los servicios de firewall mediante la consola web Para configurar los servicios de firewall con la consola web, inicie sesión con acceso con privilegios al hacer clic en la opción Reuse my password for privileged tasks (Volver a usar mi contraseña para tareas con privilegios). Esto permite al usuario que ejecute comandos con privilegios de sudo para modificar los servicios de firewall. Figura 11.1: Inicio de sesión con privilegios con la consola web Haga clic en la opción Networking (Redes) en el menú de navegación izquierdo para mostrar la sección Firewall en la página principal de redes. Haga clic en el enlace de Firewall para acceder a la lista de servicios permitidos. RH134-RHEL8.2-es-1-20200928 309 capítulo 11 | Administración de la seguridad de redes Figura 11.2: Redes de la consola web Los servicios permitidos que se muestran en la lista son aquellos servicios que el firewall permite actualmente. Haga clic en la flecha (>) a la izquierda del nombre del servicio para ver los detalles del servicio. Para agregar un servicio, haga clic en el botón Add Services... (Agregar servicios) en la esquina superior derecha de la página de Firewall Allowed Services (Servicios permitidos). Figura 11.3: Lista de servicios permitidos por el firewall en la consola web La página Add Services (Agregar servicios) muestra los servicios predefinidos disponibles. 310 RH134-RHEL8.2-es-1-20200928 capítulo 11 | Administración de la seguridad de redes Figura 11.4: Interfaz para agregar servicios de firewall en la consola web Para seleccionar un servicio, desplácese por la lista o seleccione una opción en el cuadro de texto Filter Services (Filtrar servicios). En el siguiente ejemplo, la cadena http se ingresa en el cuadro de texto de búsqueda para buscar servicios que contengan esa cadena, es decir, servicios relacionados con la web. Seleccione la casilla de verificación a la izquierda de los servicios para que el firewall los permita. Haga clic en el botón Add Services (Agregar servicios) para completar el proceso. RH134-RHEL8.2-es-1-20200928 311 capítulo 11 | Administración de la seguridad de redes Figura 11.5: Búsqueda por filtro de servicios de firewall en la consola web La interfaz vuelve a la página de Firewall Allowed Services (Servicios permitidos), donde puede revisar la lista actualizada de servicios permitidos. Figura 11.6: Lista de servicios permitidos por el firewall en la consola web Configuración de firewall desde la línea de comandos El comando firewall-cmd interactúa con el administrador de firewall dinámico firewalld. Se instala como parte del paquete firewalld principal y está disponible para los administradores que prefieren trabajar en la línea de comandos a los fines de trabajar en sistemas sin un entorno gráfico o ejecutar el scripting de la configuración de firewall. 312 RH134-RHEL8.2-es-1-20200928 capítulo 11 | Administración de la seguridad de redes En la siguiente tabla, se detallan varios comandos de firewall-cmd usados frecuentemente, junto con una explicación. Observe que, a menos que se especifique lo contrario, casi todos los comandos funcionarán en la configuración de tiempo de ejecución, a menos que se especifique la opción --permanent. Si se especifica la opción --permanent, debe activar la configuración ejecutando también el comando firewall-cmd --reload, que lee la configuración permanente actual y la aplica como la nueva configuración de tiempo de ejecución. Muchos de los comandos detallados toman la opción --zone=ZONE para determinar qué zona afectan. Cuando se requiera una máscara de red, use la notación CIDR (como 192.168.1/24). Comandos de firewall-cmd Explicación --get-default-zone Consultar la zona predeterminada actual. --set-default-zone=ZONE Configurar la zona predeterminada. Esto cambia tanto la configuración del tiempo de ejecución como la permanente. --get-zones Mostrar todas las zonas disponibles. --get-active-zones Mostrar todas las zonas que están actualmente en uso (tienen una interfaz u origen conectados a esta), junto con la información de su interfaz y origen. --add-source=CIDR [--zone=ZONE] Enrutar todo el tráfico que proviene de la dirección IP o red/máscara de red a la zona especificada. Si no se proporciona ninguna opción --zone=, se usa la zona predeterminada. --remove-source=CIDR [--zone=ZONE] Eliminar la regla que enruta todo el tráfico que proviene de la red de la dirección IP o red/máscara de red. Si no se proporciona ninguna opción --zone=, se usa la zona predeterminada. --add-interface=INTERFACE [-zone=ZONE] Enrutar todo el tráfico que proviene de INTERFACE a la zona especificada. Si no se proporciona ninguna opción --zone=, se usa la zona predeterminada. --change-interface=INTERFACE [-zone=ZONE] Asociar la interfaz con ZONE en lugar de su zona actual. Si no se proporciona ninguna opción --zone=, se usa la zona predeterminada. --list-all [--zone=ZONE] Mostrar todas las interfaces, fuentes, servicios y puertos configurados para ZONE. Si no se proporciona ninguna opción --zone=, se usa la zona predeterminada. --list-all-zones Recuperar toda la información para todas las zonas (interfaces, fuentes, puertos, servicios). RH134-RHEL8.2-es-1-20200928 313 capítulo 11 | Administración de la seguridad de redes Comandos de firewall-cmd Explicación --add-service=SERVICE [-zone=ZONE] Permitir el tráfico a SERVICE. Si no se proporciona ninguna opción --zone=, se usa la zona predeterminada. --add-port=PORT/PROTOCOL [-zone=ZONE] Permitir el tráfico a los puertos PORT/ PROTOCOL. Si no se proporciona ninguna opción --zone=, se usa la zona predeterminada. --remove-service=SERVICE [-zone=ZONE] Eliminar SERVICE de la lista permitida para la zona. Si no se proporciona ninguna opción -zone=, se usa la zona predeterminada. --remove-port=PORT/PROTOCOL [-zone=ZONE] Eliminar los puertos PORT/PROTOCOL de la lista permitida para la zona. Si no se proporciona ninguna opción --zone=, se usa la zona predeterminada. --reload Dejar caer la configuración del tiempo de ejecución y aplicar la configuración persistente. Los siguientes ejemplos de comandos configuran la zona predeterminada para dmz, asignan todo el tráfico proveniente de la red 192.168.0.0/24 a la zona internal (interna) y abren los puertos de red para el servicio mysql en la zona internal (interna). [root@host ~]# firewall-cmd --set-default-zone=dmz [root@host ~]# firewall-cmd --permanent --zone=internal \ --add-source=192.168.0.0/24 [root@host ~]# firewall-cmd --permanent --zone=internal --add-service=mysql [root@host ~]# firewall-cmd --reload nota En situaciones donde la sintaxis básica de firewalld no es suficiente, también puede agregar rich-rules (reglas enriquecidas), una sintaxis más expresiva, para escribir reglas complejas. Si aun así la sintaxis de las reglas enriquecidas no es suficiente, también puede usar reglas de Direct Configuration (Configuración directa), la sintaxis de nft sin formato mezclada con las reglas de firewalld. Estos modos avanzados no están incluidos en el alcance de este capítulo. Referencias Páginas del manual: firewall-cmd(1), firewalld(1), firewalld.zone(5), firewalld.zones(5) y nft(8) 314 RH134-RHEL8.2-es-1-20200928 capítulo 11 | Administración de la seguridad de redes Ejercicio Guiado Administración de firewalls del servidor En este ejercicio, controlará el acceso a los servicios del sistema mediante el ajuste de las reglas del firewall del sistema con firewalld. Resultados Debe ser capaz de configurar reglas de firewall para controlar el acceso a los servicios. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. Desde workstation, ejecute el comando lab netsecurity-firewalls start. El comando ejecuta un script de inicio que determina si el host servera es accesible en la red. [student@workstation ~]$ lab netsecurity-firewalls start 1. Desde workstation, use SSH para iniciar sesión en servera con el usuario student. Los sistemas se configuran para que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. En el sistema servera, asegúrese de que tanto el paquete httpd como el paquete mod_ssl estén instalados. Estos paquetes proporcionan el servidor web Apache que usted protegerá con un firewall, y las extensiones necesarias para que el servidor web sirva contenido mediante SSL. [student@servera ~]$ sudo yum install httpd mod_ssl [sudo] password for student: student ...output omitted... Is this ok [y/N]: y ...output omitted... Complete! 3. Con el usuario student en servera, cree el archivo /var/www/html/index.html. Agregue la siguiente línea de texto: I am servera. (Soy servera). [student@servera ~]$ sudo bash -c \ "echo 'I am servera.' > /var/www/html/index.html" 4. Inicie y habilite el servicio httpd en su sistema servera. RH134-RHEL8.2-es-1-20200928 315 capítulo 11 | Administración de la seguridad de redes [student@servera ~]$ sudo systemctl enable --now httpd Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/ lib/systemd/system/httpd.service. 5. Salga de servera. [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ 6. Desde workstation, intente acceder a su servidor web en servera por medio del puerto no cifrado 80/TCP y del puerto encapsulado SSL 443/TCP. Ambos intentos deberían fallar. 6.1. Este comando debería fallar: [student@workstation ~]$ curl http://servera.lab.example.com curl: (7) Failed to connect to servera.lab.example.com port 80: No route to host 6.2. Este comando también debería fallar: [student@workstation ~]$ curl -k https://servera.lab.example.com curl: (7) Failed to connect to servera.lab.example.com port 443: No route to host 7. Inicie sesión en servera con el usuario student. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 8. En servera, asegúrese de que el servicio nftables esté enmascarado y de que el servicio firewalld esté habilitado y en ejecución. 8.1. Determine si el estado del servicio nftables está enmascarado. [student@servera ~]$ sudo systemctl status nftables [sudo] password for student: student ● nftables.service - Netfilter Tables Loaded: loaded (/usr/lib/systemd/system/nftables.service; disabled; vendor preset: disabled) Active: inactive (dead) Docs: man:nft(8) Los resultados muestran que nftables está deshabilitado e inactivo pero no enmascarado. Ejecute el siguiente comando para enmascarar el servicio. [student@servera ~]$ sudo systemctl mask nftables Created symlink /etc/systemd/system/nftables.service → /dev/null. 8.2. 316 Verifique que el estado del servicio nftables esté enmascarado. RH134-RHEL8.2-es-1-20200928 capítulo 11 | Administración de la seguridad de redes [student@servera ~]$ sudo systemctl status nftables ● nftables.service Loaded: masked (Reason: Unit nftables.service is masked.) Active: inactive (dead) 8.3. Verifique que el estado del servicio firewall esté habilitado y en ejecución. [student@servera ~]$ sudo systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2019-05-22 15:36:02 CDT; 5min ago Docs: man:firewalld(1) Main PID: 703 (firewalld) Tasks: 2 (limit: 11405) Memory: 29.8M CGroup: /system.slice/firewalld.service └─703 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork -nopid May 22 15:36:01 servera.lab.example.com systemd[1]: Starting firewalld - dynamic firewall daemon... May 22 15:36:02 servera.lab.example.com systemd[1]: Started firewalld - dynamic firewall daemon. 8.4. Salga de servera. [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ 9. Desde workstation, abra Firefox e inicie sesión en la consola web que se ejecuta en servera para agregar el servicio httpd a la zona de red public (pública). 9.1. Abra Firefox y navegue hasta https://servera.lab.example.com:9090 para acceder a la consola web. Acepte el certificado autofirmado usado por servera agregándolo como una excepción. 9.2. Seleccione la casilla de verificación junto a Reuse my password for privileged tasks (Volver a usar mi contraseña para tareas con privilegios) para garantizar los privilegios administrativos. Inicie sesión como student con la contraseña student. 9.3. Haga clic en Networking (Redes) en la barra de navegación izquierda. 9.4. Haga clic en el enlace de Firewall en la página principal de Networking (Redes). 9.5. Haga clic en el botón Add Services... (Agregar servicios) ubicado en el margen superior derecho de la página de Firewall. RH134-RHEL8.2-es-1-20200928 317 capítulo 11 | Administración de la seguridad de redes 9.6. En la interfaz de usuario de Add Services (Agregar servicios), desplácese hacia abajo o use Filter Services (Filtrar servicios) para ubicar y seleccionar la casilla de verificación junto al servicio Secure WWW (HTTPS). 9.7. Haga clic en el botón Add Services (Agregar servicios) ubicado en el margen inferior derecho de la interfaz de usuario de Add Services (Agregar servicios). 10. Regrese a un terminal en workstation y verifique su trabajo intentando ver el contenido del servidor web de servera. 10.1. Este comando debería fallar: [student@workstation ~]$ curl http://servera.lab.example.com curl: (7) Failed to connect to servera.lab.example.com port 80: No route to host 10.2. Este comando debe arrojar resultados satisfactorios: [student@workstation ~]$ curl -k https://servera.lab.example.com I am servera. nota Si usa Firefox para conectarse al servidor web, le solicitará la verificación del certificado del host si pasa el firewall satisfactoriamente. Finalizar En workstation, ejecute el script lab netsecurity-firewalls finish para terminar este ejercicio. [student@workstation ~]$ lab netsecurity-firewalls finish Esto concluye el ejercicio guiado. 318 RH134-RHEL8.2-es-1-20200928 capítulo 11 | Administración de la seguridad de redes Control del etiquetado de puertos de SELinux Objetivos Tras finalizar esta sección, usted deberá ser capaz de verificar que los puertos de red tengan el tipo de SELinux correcto para que los servicios puedan hacer referencia a ellos. Etiquetado de puertos de SELinux SELinux no se limita al etiquetado de archivos y procesos. La política SELinux también rige estrictamente el tráfico de red. Uno de los métodos que SELinux usa para el control del tráfico de red es el etiquetado de puertos de red; por ejemplo, en la política targeted, el puerto 22/TCP tiene asociada la etiqueta ssh_port_t. Los puertos HTTP predeterminados, 80/TCP y 443/TCP, tienen asociada la etiqueta http_port_t. Siempre que un proceso desee escuchar en un puerto, SELinux verifica si la etiqueta asociada con ese proceso (el dominio) tiene permitido hacer referencia a la etiqueta de dicho puerto. Este proceso puede evitar que un servicio no autorizado use puertos de otra manera usados por otros servicios de red (legítimos). Administración del etiquetado de puertos de SELinux Si decide ejecutar un servicio en un puerto no estándar, es casi seguro que SELinux bloqueará el tráfico. En este caso, debe actualizar las etiquetas de puertos de SELinux. En algunos casos, la política targeted ya ha etiquetado el puerto con un tipo que puede usarse; por ejemplo, dado que el puerto 8008/TCP suele emplearse para aplicaciones web, dicho puerto ya ha sido etiquetado con http_port_t, el tipo de puerto predeterminado para el servidor web. Listado de etiquetas de puertos Para obtener una descripción general de todas las asignaciones de etiquetas de puertos actuales, ejecute el comando semanage port -l. La opción -l incluye todas las asignaciones actuales de la siguiente manera: port_label_t tcp|udp comma,separated,list,of,ports Ejemplo de salida: [root@host ~]# semanage port -l ...output omitted... http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 ...output omitted... Pare refinar la búsqueda, use el comando grep: RH134-RHEL8.2-es-1-20200928 319 capítulo 11 | Administración de la seguridad de redes [root@host ~]# semanage port -l | grep ftp ftp_data_port_t tcp 20 ftp_port_t tcp 21, 989, 990 ftp_port_t udp 989, 990 tftp_port_t udp 69 Observe que una etiqueta de puerto puede aparecer dos veces en la salida, una para TCP y otra para UDP. Administración de etiquetas de puertos Use el comando semanage para asignar etiquetas de puertos nuevas, quitar etiquetas de puertos o modificar las existentes. Importante La mayoría de los servicios estándares disponibles en la distribución de Linux proporcionan un módulo de políticas de SELinux que establece etiquetas en los puertos. No puede cambiar las etiquetas en esos puertos por medio de semanage. Para cambiarlas, debe reemplazar el módulo de políticas. La escritura y la generación de módulos de políticas no se abordan en este curso. A fin de agregar un puerto a una etiqueta de puerto existente (tipo), use la siguiente sintaxis. -a agrega una nueva etiqueta de puerto, -t denota el tipo y -p denota el protocolo. [root@host ~]# semanage port -a -t port_label -p tcp|udp PORTNUMBER Por ejemplo, para permitir que un servicio gopher escuche en el puerto 71/TCP: [root@host~]# semanage port -a -t gopher_port_t -p tcp 71 Para ver los cambios locales realizados en la política predeterminada, los administradores pueden agregar la opción -C al comando semanage. [root@host~]# semanage port -l -C SELinux Port Type Proto Port Number gopher_port_t 71 tcp nota La política targeted se envía con una gran cantidad de tipos de puerto. Las páginas del manual de SELinux específicas de los servicios que se encuentran en el paquete selinux-policy-doc incluyen documentación sobre tipos de SELinux, booleanos y tipos de puertos. Si las páginas del manual antes mencionadas todavía no están instaladas en su sistema, realice este procedimiento: [root@host ~]# yum -y install selinux-policy-doc [root@host ~]# man -k _selinux 320 RH134-RHEL8.2-es-1-20200928 capítulo 11 | Administración de la seguridad de redes Eliminación de etiquetas de puertos La sintaxis para quitar una etiqueta de puerto personalizada es la misma que para la adición de una etiqueta de puerto, solo que, en lugar de usar la opción -a (para agregar), se usa la opción -d (para quitar). Por ejemplo, para quitar la referencia del puerto 71/TCP con gopher_port_t: [root@host ~]# semanage port -d -t gopher_port_t -p tcp 71 Modificación de referencias de puertos Para cambiar una referencia de puerto, tal vez porque los requisitos han cambiado, use la opción m (Modificar). Este es un proceso más eficiente que quitar un enlace antiguo y agregar uno nuevo. Por ejemplo, para modificar el puerto 71/TCP desde gopher_port_t hasta http_port_t, un administrador puede usar el siguiente comando: [root@server ~]# semanage port -m -t http_port_t -p tcp 71 Como antes, visualice la modificación con el comando semanage. [root@server ~]# semanage port -l -C SELinux Port Type Proto Port Number http_port_t tcp 71 [root@server ~]# semanage port -l | grep http http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 71, 80, 81, 443, 488, 8008, 8009, 8443, 9000 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989 Referencias Páginas del manual: semanage(8), semanage-port(8), *_selinux(8) RH134-RHEL8.2-es-1-20200928 321 capítulo 11 | Administración de la seguridad de redes Ejercicio Guiado Control del etiquetado de puertos de SELinux En este trabajo de laboratorio, configurará su sistema servera para permitir el acceso HTTP en un puerto no estándar. Resultados: Configurará un servidor web que se ejecuta en servera de manera correcta y ofrece contenido por medio de un puerto no estándar. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab netsecurity-ports start. Este comando ejecuta un script de inicio que determina si la máquina servera es accesible en la red. También instala el servicio httpd y configura el firewall en servera para permitir conexiones http. [student@workstation ~]$ lab netsecurity-ports start Su organización está implementando una nueva aplicación web personalizada. La aplicación web se ejecuta en un puerto no estándar; en este caso 82/TCP. Uno de sus administradores júniores ya ha configurado la aplicación en servera. Sin embargo, no se puede acceder al contenido del servidor web. 1. Use el comando ssh para iniciar sesión en servera como el usuario student. Los sistemas se configuran para que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Use el comando sudo -i para cambiar al usuario root. La contraseña del usuario student es student. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 3. Intente corregir el problema del contenido web al reiniciar el servicio httpd. 3.1. 322 Use el comando systemctl para reiniciar httpd.service. Se espera que este comando falle. RH134-RHEL8.2-es-1-20200928 capítulo 11 | Administración de la seguridad de redes [root@servera ~]# systemctl restart httpd.service Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details. 3.2. Use el comando systemctl status -l para visualizar el estado del servicio httpd. Advierta el error permission denied (permiso denegado). [root@servera ~]# systemctl status -l httpd.service ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) Active: failed (Result: exit-code) since Mon 2019-04-08 14:23:29 CEST; 3min 33s ago Docs: man:httpd.service(8) Process: 28078 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE) Main PID: 28078 (code=exited, status=1/FAILURE) Status: "Reading configuration..." Apr 08 14:23:29 servera.lab.example.com systemd[1]: Starting The Apache HTTP Server... Apr 08 14:23:29 servera.lab.example.com httpd[28078]: (13)Permission denied: AH00072: make_sock: could not bind to address [::]:82 Apr 08 14:23:29 servera.lab.example.com httpd[28078]: (13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:82 Apr 08 14:23:29 servera.lab.example.com httpd[28078]: no listening sockets available, shutting down Apr 08 14:23:29 servera.lab.example.com httpd[28078]: AH00015: Unable to open logs Apr 08 14:23:29 servera.lab.example.com systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE Apr 08 14:23:29 servera.lab.example.com systemd[1]: httpd.service: Failed with result 'exit-code'. Apr 08 14:23:29 servera.lab.example.com systemd[1]: Failed to start The Apache HTTP Server. 3.3. Use el comando sealert para verificar si SELinux está impidiendo que httpd haga referencia al puerto 82/TCP. [root@servera ~]# sudo sealert -a /var/log/audit/audit.log 100% done found 1 alerts in /var/log/audit/audit.log -------------------------------------------------------------------------------SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket port 82. ***** Plugin bind_ports (99.5 confidence) suggests ************************ If you want to allow /usr/sbin/httpd to bind to network port 82 Then you need to modify the port type. Do # semanage port -a -t PORT_TYPE -p tcp 82 RH134-RHEL8.2-es-1-20200928 323 capítulo 11 | Administración de la seguridad de redes where PORT_TYPE is one of the following: http_cache_port_t, http_port_t, jboss_management_port_t, jboss_messaging_port_t, ntop_port_t, puppet_port_t. ...output omitted... Raw Audit Messages type=AVC msg=audit(1554726569.188:852): avc: denied { name_bind } for pid=28393 comm="httpd" src=82 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:reserved_port_t:s0 tclass=tcp_socket permissive=0 ...output omitted... 4. Configure SELinux para que permita que httpd haga referencia al puerto 82/TCP y, luego, reinicie el servicio httpd.service. 4.1. Use el comando semanage para buscar un tipo de puerto apropiado para el puerto 82/TCP. [root@servera ~]# semanage port -l | grep http http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989 http_port_t contiene los puertos HTTP predeterminados: 80/TCP y 443/TCP. Este es el tipo de puerto correcto para el servidor web. 4.2. Use el comando semanage para asignar al puerto 82/TCP el tipo http_port_t. [root@servera ~]# semanage port -a -t http_port_t -p tcp 82 4.3. Use el comando systemctl para reiniciar el servicio httpd.service. Este comando debe arrojar resultados satisfactorios. [root@servera ~]# systemctl restart httpd.service 5. Verifique si ahora puede acceder al servidor web que se ejecuta en el puerto 82/TCP. Use el comando curl para acceder al servicio web desde servera. [root@servera ~]# curl http://servera.lab.example.com:82 Hello 6. En una ventana de terminal diferente, verifique si puede acceder al nuevo servicio web desde workstation. Use el comando curl para acceder al servicio web desde workstation. [student@workstation ~]$ curl http://servera.lab.example.com:82 curl: (7) Failed to connect to servera.example.com:82; No route to host Ese error significa que todavía no puede conectarse al servicio web desde workstation. 7. En servera, abra un puerto 82/TCP en el firewall. 7.1. 324 Use el comando firewall-cmd para abrir el puerto 82/TCP en la configuración permanente para la zona predeterminada en el firewall en servera. RH134-RHEL8.2-es-1-20200928 capítulo 11 | Administración de la seguridad de redes [root@servera ~]# firewall-cmd --permanent --add-port=82/tcp success 7.2. Active sus cambios del firewall en servera. [root@servera ~]# firewall-cmd --reload success 8. Use el comando curl para acceder al servicio web desde workstation. [student@workstation ~]$ curl http://servera.lab.example.com:82 Hello 9. Salga de servera. [root@servera ~]# exit logout [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute el script lab netsecurity-ports finish para terminar este ejercicio. [student@workstation ~]$ lab netsecurity-ports finish Esto concluye el ejercicio guiado. RH134-RHEL8.2-es-1-20200928 325 capítulo 11 | Administración de la seguridad de redes Trabajo de laboratorio Administración de la seguridad de redes Lista de verificación de rendimiento En este trabajo de laboratorio, configurará un firewall y los ajustes de SELinux para permitir el acceso a múltiples servidores web que se ejecutan en serverb. Resultados Deberá ser capaz de configurar el firewall y los ajustes de SELinux en un host del servidor web. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. Desde workstation, ejecute el comando lab netsecurity-review start. Este comando ejecuta un script de inicio para determinar si el host serverb es accesible en la red. [student@workstation ~]$ lab netsecurity-review start Su empresa ha decidido ejecutar una nueva aplicación web. Esta aplicación escucha en puertos 80/TCP y 1001/TCP. El puerto 22/TCP para el acceso mediante ssh también debe estar disponible. Todos los cambios que hace deben persistir en un reinicio. Si sudo se lo solicita, use student como contraseña. Importante: La interfaz gráfica usada en el entorno de Aprendizaje en línea de Red Hat necesita un puerto 5900/TCP para permanecer disponible también. Este puerto también es conocido bajo el nombre del servicio vnc-server. Si accidentalmente bloquea su acceso a serverb, puede intentar recuperar el acceso al usar ssh para su máquina serverb desde su máquina workstation o restablecer su máquina serverb. Si elige restablecer su máquina serverb, debe ejecutar los scripts de configuración para este trabajo de laboratorio nuevamente. La configuración de sus máquinas ya incluye una zona personalizada denominada ROL que abre estos puertos. 1. Desde workstation, pruebe acceder al servidor web predeterminado en http://serverb.lab.example.com y al host virtual en http:// serverb.lab.example.com:1001. 2. Inicie sesión en serverb para determinar qué está impidiendo el acceso a los servidores web. 3. Configure SELinux para que permita que el servicio httpd escuche en el puerto 1001/TCP. 4. Desde workstation, pruebe acceder al servidor web predeterminado en http://serverb.lab.example.com y al host virtual en http:// serverb.lab.example.com:1001. 5. Inicie sesión en serverb para determinar si los puertos correctos están asignados al firewall. 326 RH134-RHEL8.2-es-1-20200928 capítulo 11 | Administración de la seguridad de redes 6. Agregue el puerto 1001/TCP a la configuración permanente para la zona de red public (pública). Confirme su configuración. 7. Desde workstation, confirme que el servidor web predeterminado en serverb.lab.example.com vuelva a SERVER B y que el host virtual en serverb.lab.example.com:1001 vuelva a VHOST 1. Evaluación En workstation, ejecute el comando lab netsecurity-review grade para confirmar que ha realizado correctamente este ejercicio del trabajo de laboratorio. [student@workstation ~]$ lab netsecurity-review grade Finalizar En workstation, ejecute el script lab netsecurity-review finish para terminar este ejercicio. [student@workstation ~]$ lab netsecurity-review finish Esto concluye el trabajo de laboratorio. RH134-RHEL8.2-es-1-20200928 327 capítulo 11 | Administración de la seguridad de redes Solución Administración de la seguridad de redes Lista de verificación de rendimiento En este trabajo de laboratorio, configurará un firewall y los ajustes de SELinux para permitir el acceso a múltiples servidores web que se ejecutan en serverb. Resultados Deberá ser capaz de configurar el firewall y los ajustes de SELinux en un host del servidor web. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. Desde workstation, ejecute el comando lab netsecurity-review start. Este comando ejecuta un script de inicio para determinar si el host serverb es accesible en la red. [student@workstation ~]$ lab netsecurity-review start Su empresa ha decidido ejecutar una nueva aplicación web. Esta aplicación escucha en puertos 80/TCP y 1001/TCP. El puerto 22/TCP para el acceso mediante ssh también debe estar disponible. Todos los cambios que hace deben persistir en un reinicio. Si sudo se lo solicita, use student como contraseña. Importante: La interfaz gráfica usada en el entorno de Aprendizaje en línea de Red Hat necesita un puerto 5900/TCP para permanecer disponible también. Este puerto también es conocido bajo el nombre del servicio vnc-server. Si accidentalmente bloquea su acceso a serverb, puede intentar recuperar el acceso al usar ssh para su máquina serverb desde su máquina workstation o restablecer su máquina serverb. Si elige restablecer su máquina serverb, debe ejecutar los scripts de configuración para este trabajo de laboratorio nuevamente. La configuración de sus máquinas ya incluye una zona personalizada denominada ROL que abre estos puertos. Desde workstation, pruebe acceder al servidor web predeterminado en http://serverb.lab.example.com y al host virtual en http:// serverb.lab.example.com:1001. 1. 1.1. Pruebe acceder al servidor web en http://serverb.lab.example.com. La prueba falla actualmente. El servidor web debería volver a SERVER B. [student@workstation ~]$ curl http://serverb.lab.example.com curl: (7) Failed to connect to serverb.lab.example.com port 80: Connection refused 1.2. 328 Pruebe acceder al host virtual en http://serverb.lab.example.com:1001. La prueba falla actualmente. El host virtual debería volver a VHOST 1. RH134-RHEL8.2-es-1-20200928 capítulo 11 | Administración de la seguridad de redes [student@workstation ~]$ curl http://serverb.lab.example.com:1001 curl: (7) Failed to connect to serverb.lab.example.com port 1001: No route to host 2. Inicie sesión en serverb para determinar qué está impidiendo el acceso a los servidores web. 2.1. Desde workstation, abra una sesión de SSH en serverb como el usuario student. Los sistemas se configuran para que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@serverb ...output omitted... [student@serverb ~]$ 2.2. Determine si el servicio httpd está activo. [student@serverb ~]$ systemctl is-active httpd inactive 2.3. Habilite e inicie el servicio httpd. El servicio httpd no puede iniciarse. [student@serverb ~]$ sudo systemctl enable --now httpd [sudo] password for student: student Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/ lib/systemd/system/httpd.service. Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details. 2.4. Investigue los motivos que hicieron que el servicio httpd.service no se haya podido iniciar. [student@serverb ~]$ systemctl status httpd.service ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) Active: failed (Result: exit-code) since Thu 2019-04-11 19:25:36 CDT; 19s ago Docs: man:httpd.service(8) Process: 9615 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE) Main PID: 9615 (code=exited, status=1/FAILURE) Status: "Reading configuration..." Apr 11 19:25:36 serverb.lab.example.com systemd[1]: Starting The Apache HTTP Server... Apr 11 19:25:36 serverb.lab.example.com httpd[9615]: (13)Permission denied: AH00072: make_sock: could not bind to address [::]:1001 Apr 11 19:25:36 serverb.lab.example.com httpd[9615]: (13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:1001 Apr 11 19:25:36 serverb.lab.example.com httpd[9615]: no listening sockets available, shutting down Apr 11 19:25:36 serverb.lab.example.com httpd[9615]: AH00015: Unable to open logs RH134-RHEL8.2-es-1-20200928 329 capítulo 11 | Administración de la seguridad de redes Apr 11 19:25:36 serverb.lab.example.com systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE Apr 11 19:25:36 serverb.lab.example.com systemd[1]: httpd.service: Failed with result 'exit-code'. Apr 11 19:25:36 serverb.lab.example.com systemd[1]: Failed to start The Apache HTTP Server. 2.5. Use el comando sealert para verificar si SELinux está impidiendo que el servicio httpd haga referencia al puerto 1001/TCP. [student@serverb ~]$ sudo sealert -a /var/log/audit/audit.log 100% done found 1 alerts in /var/log/audit/audit.log -------------------------------------------------------------------------------SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket port 1001. ***** Plugin bind_ports (99.5 confidence) suggests ************************ If you want to allow /usr/sbin/httpd to bind to network port 1001 Then you need to modify the port type. Do # semanage port -a -t PORT_TYPE -p tcp 1001 where PORT_TYPE is one of the following: http_cache_port_t, http_port_t, jboss_management_port_t, jboss_messaging_port_t, ntop_port_t, puppet_port_t. ***** Plugin catchall (1.49 confidence) suggests ************************** ...output omitted... Configure SELinux para que permita que el servicio httpd escuche en el puerto 1001/TCP. 3. 3.1. Use el comando semanage para encontrar el tipo de puerto correcto. [student@serverb ~]$ sudo semanage port -l | grep 'http' http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989 3.2. Use el comando semanage para hacer referencia al puerto 1001/TCP con el tipo http_port_t. [student@serverb ~]$ sudo semanage port -a -t http_port_t -p tcp 1001 [student@serverb ~]$ 3.3. Confirme si ese puerto 1001/TCP está enlazado con el tipo de puerto http_port_t. [student@serverb ~]$ sudo semanage port -l | grep '^http_port_t' http_port_t tcp 1001, 80, 81, 443, 488, 8008, 8009, 8443, 9000 330 RH134-RHEL8.2-es-1-20200928 capítulo 11 | Administración de la seguridad de redes 3.4. Habilite e inicie el servicio httpd. [student@serverb ~]$ sudo systemctl enable --now httpd 3.5. Verifique si el servicio httpd está en ejecución. [student@serverb ~]$ systemctl is-active httpd; systemctl is-enabled httpd active enabled 3.6. Salga de serverb. [student@serverb ~]$ exit logout Connection to serverb closed. [student@workstation ~]$ 4. Desde workstation, pruebe acceder al servidor web predeterminado en http://serverb.lab.example.com y al host virtual en http:// serverb.lab.example.com:1001. 4.1. Pruebe acceder al servidor web en http://serverb.lab.example.com. El servidor web debería volver a SERVER B. [student@workstation ~]$ curl http://serverb.lab.example.com SERVER B 4.2. Pruebe acceder al host virtual en http://serverb.lab.example.com:1001. La prueba sigue fallando. [student@workstation ~]$ curl http://serverb.lab.example.com:1001 curl: (7) Failed to connect to serverb.lab.example.com port 1001: No route to host 5. Inicie sesión en serverb para determinar si los puertos correctos están asignados al firewall. 5.1. Desde workstation, inicie sesión en serverb con el usuario student. [student@workstation ~]$ ssh student@serverb ...output omitted... [student@serverb ~]$ 5.2. Verifique que la zona de firewall predeterminada esté configurada en public (pública). [student@serverb ~]$ firewall-cmd --get-default-zone public 5.3. Si el paso anterior no estableció la zona public (pública) nuevamente como la zona predeterminada, corríjala con el siguiente comando: [student@serverb ~]$ sudo firewall-cmd --set-default-zone public RH134-RHEL8.2-es-1-20200928 331 capítulo 11 | Administración de la seguridad de redes 5.4. Determine los puertos abiertos listados en la zona de red public (pública). [student@serverb ~]$ sudo firewall-cmd --permanent --zone=public --list-all [sudo] password for student: student public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: Agregue el puerto 1001/TCP a la configuración permanente para la zona de red public (pública). Confirme su configuración. 6. 6.1. Agregue el puerto 1001/TCP a la zona de red public (pública). [student@serverb ~]$ sudo firewall-cmd --permanent --zone=public \ --add-port=1001/tcp success 6.2. Vuelva a cargar la configuración de firewall. [student@serverb ~]$ sudo firewall-cmd --reload success 6.3. Confirme su configuración. [student@serverb ~]$ sudo firewall-cmd --permanent --zone=public --list-all public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client http ssh ports: 1001/tcp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: 6.4. Salga de serverb. 332 RH134-RHEL8.2-es-1-20200928 capítulo 11 | Administración de la seguridad de redes [student@serverb ~]$ exit logout Connection to serverb closed. [student@workstation ~]$ 7. Desde workstation, confirme que el servidor web predeterminado en serverb.lab.example.com vuelva a SERVER B y que el host virtual en serverb.lab.example.com:1001 vuelva a VHOST 1. 7.1. Pruebe acceder al servidor web en http://serverb.lab.example.com. [student@workstation ~]$ curl http://serverb.lab.example.com SERVER B 7.2. Pruebe acceder al host virtual en http://serverb.lab.example.com:1001. [student@workstation ~]$ curl http://serverb.lab.example.com:1001 VHOST 1 Evaluación En workstation, ejecute el comando lab netsecurity-review grade para confirmar que ha realizado correctamente este ejercicio del trabajo de laboratorio. [student@workstation ~]$ lab netsecurity-review grade Finalizar En workstation, ejecute el script lab netsecurity-review finish para terminar este ejercicio. [student@workstation ~]$ lab netsecurity-review finish Esto concluye el trabajo de laboratorio. RH134-RHEL8.2-es-1-20200928 333 capítulo 11 | Administración de la seguridad de redes Resumen En este capítulo, aprendió lo siguiente: • El subsistema netfilter permite a los módulos del kernel inspeccionar cada paquete que atraviese el sistema. Se inspeccionan todos los paquetes de red entrantes, salientes o reenviados. • El uso de firewalld ha simplificado la administración al clasificar todo el tráfico de la red en zonas. Cada zona tiene su propia lista de puertos y servicios. La zona public (pública) se establece como la zona predeterminada. • El servicio firewalld incluye un número de servicios predefinidos. Se pueden mostrar por medio del comando firewall-cmd --get-services. • La política SELinux controla estrictamente el tráfico de red. Los puertos de red están etiquetados. Por ejemplo, el puerto 22/TCP tiene asociada la etiqueta ssh_port_t. Cuando un proceso desea escuchar en un puerto, SELinux verifica si la etiqueta asociada puede hacer referencia a la etiqueta de dicho puerto. • El comando semanage se usa para agregar, eliminar y modificar etiquetas. 334 RH134-RHEL8.2-es-1-20200928 capítulo 12 Instalación de Red Hat Enterprise Linux Meta Instalar Red Hat Enterprise Linux en servidores y máquinas virtuales. Objetivos • Instalar Red Hat Enterprise Linux en un servidor. • Automatizar el proceso de instalación por medio de Kickstart. • Instalar una máquina virtual en su servidor Red Hat Enterprise Linux por medio de Cockpit. • Instalación de Red Hat Enterprise Linux (y ejercicio guiado) • Automatización de la instalación con Kickstart (y ejercicio guiado) • Instalación y configuración de máquinas virtuales (y cuestionario) Secciones Trabajo de laboratorio RH134-RHEL8.2-es-1-20200928 Instalación de Red Hat Enterprise Linux 335 capítulo 12 | Instalación de Red Hat Enterprise Linux Instalación de Red Hat Enterprise Linux Objetivos Tras finalizar esta sección, usted deberá ser capaz de instalar Red Hat Enterprise Linux en un servidor. Selección de los medios de instalación Red Hat proporciona varias formas distintas de instalación que puede descargar desde el sitio web del Portal de Clientes con su suscripción activa. • Un archivo de imagen binario en formato ISO 9660 que contiene Anaconda, el programa de instalación de Red Hat Enterprise Linux y los repositorios de paquetes de BaseOS y AppStream. Estos repositorios contienen los paquetes necesarios para completar la instalación sin materiales adicionales. • Un archivo de imagen "ISO de arranque" que contiene Anaconda y requiere una red configurada para acceder a los repositorios de paquetes disponibles mediante HTTP, FTP o NFS. • Una imagen QCOW2 que contiene un disco del sistema compilado previamente, listo para implementarse como máquina virtual en la nube o en entornos virtuales empresariales. QCOW2 es el formato de imagen estándar utilizado por Red Hat con la virtualización basada en KVM. Red Hat proporciona medios de instalación para cuatro arquitecturas de procesadores compatibles: x86 de 64 bits (AMD e Intel), IBM Power Systems (Little Endian), IBM Z y ARM de 64 bits. Después de la descarga, cree medios de instalación de arranque según las instrucciones en https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html-single/ performing_a_standard_rhel_installation/index#making-media_preparing-for-your-installation. Compilación de imágenes con Composer Composer es una herramienta nueva disponible en RHEL 8. Para casos de uso especializados, Composer permite a los administradores compilar imágenes de sistema personalizadas para su implementación en plataformas en la nube o entornos virtuales. Composer usa la consola web gráfica de Cockpit. También puede invocar a Composer desde una línea de comandos con el comando composer-cli. Instalación manual de Red Hat Enterprise Linux Por medio del DVD binario o archivo ISO de arranque, los administradores pueden instalar un nuevo sistema RHEL en un servidor sin sistema operativo (bare-metal) o en una máquina virtual. El programa Anaconda es compatible con dos métodos de instalación: • La instalación manual interactúa con el usuario para consultar cómo Anaconda debe instalar y configurar el sistema. • La instalación automatizada usa un archivo Kickstart que le dice a Anaconda cómo instalar el sistema. En una sección posterior, se detallan las instalaciones Kickstart. 336 RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux Instalación de RHEL con la interfaz gráfica Cuando arranca el sistema desde el DVD binario o el archivo ISO de arranque, Anaconda se inicia como una aplicación gráfica. En la pantalla Welcome to Red Hat Enterprise Linux 8 (Bienvenido a Red Hat Enterprise Linux 8), seleccione el idioma que usará durante la instalación. Esto también establece el idioma predeterminado del sistema después de la instalación. Los usuarios individuales pueden elegir el idioma de preferencia después de la instalación. Anaconda muestra la ventana Installation Summary (Resumen de la instalación), el lugar central para personalizar los parámetros antes de comenzar la instalación. Figura 12.1: Ventana Installation Summary (Resumen de la instalación) Desde esta ventana, seleccione los iconos en cualquier orden para configurar los parámetros de instalación. Seleccione un ítem para ver o editar. Haga clic en Done (Finalizado) en cualquier ítem para volver a esta pantalla central. Anaconda marca los ítems obligatorios con un símbolo de advertencia con forma de triángulo y un mensaje. La barra de estado naranja en la parte inferior de la pantalla advierte que existen ítems obligatorios que deben completarse antes de que comience la instalación. Complete los siguientes ítems según sea necesario: • Keyboard (Teclado): agregue configuraciones de teclado adicionales. • Language Support (Idioma): seleccione los idiomas adicionales que desee instalar. RH134-RHEL8.2-es-1-20200928 337 capítulo 12 | Instalación de Red Hat Enterprise Linux • Time & Date (Hora y fecha): para seleccionar la ciudad del sistema, haga clic en el mapa interactivo o use las listas. Especifique la zona horaria local incluso al usar el protocolo de hora de red (NTP). • Installation Source (Fuente de instalación): ingrese la ubicación del paquete fuente que Anaconda necesita para la instalación. Si usa el DVD binario, el campo de fuente de instalación hace referencia directa al DVD. • Software Selection (Selección de software): seleccione el entorno base que desea instalar y cualquier complemento adicional. El entorno Minimal Install (Instalación mínima) instala solamente los paquetes esenciales para ejecutar Red Hat Enterprise Linux. • Installation Destination (Destino de instalación): seleccione y divida los discos donde se instalará Red Hat Enterprise Linux. El administrador debe entender los esquemas de partición y los criterios de selección del sistema de archivos para realizar la tarea. El botón de radio predeterminado para la partición automática asigna los dispositivos de almacenamiento seleccionados usando todo el espacio disponible. • Conéctese a Red Hat: registre el sistema con su cuenta de Red Hat y seleccione el propósito del sistema. La función del propósito del sistema permite al proceso de registro asociar automáticamente la suscripción más adecuada al sistema. Para registrar el sistema, primero debe conectarse a la red mediante el icono Network & Host Name (Red y nombre del host). • KDUMP: la función de volcado de error del kernel, KDUMP, recopila información acerca del estado de la memoria del sistema cuando el kernel se bloquea. Los ingenieros de Red Hat pueden analizar un archivo kdump para identificar la causa del error. Use este ítem de Anaconda para habilitar o deshabilitar kdump. • Network & Host Name (Nombre del host y de la red): las conexiones de red detectadas se enumeran a la izquierda. Seleccione una conexión para visualizar sus detalles. Para configurar la conexión de red seleccionada, haga clic en Configure (Configurar). • Security Policy (Política de seguridad): al activar un perfil de política de seguridad, como el perfil Norma de seguridad de datos del sector de tarjetas de pago (PCI DSS), Anaconda aplica restricciones y recomendaciones durante la instalación en función del perfil seleccionado. Después de completar la configuración de la instalación y resolver todas las advertencias, haga clic en Begin Installation (Comenzar la instalación). Si hace clic en Quit (Salir), la instalación se interrumpe sin aplicar los cambios al sistema. Mientras el sistema se está instalando, complete los siguientes elementos cuando se visualicen: • Root Password (Contraseña root): el programa de instalación solicita que se configure una contraseña de root. La etapa final del proceso de instalación no continuará hasta que defina una contraseña root. • User Creation (Creación de usuario): cree una cuenta opcional que no corresponda al usuario root. Se recomienda mantener una cuenta local de uso general. También puede crear cuentas después de que se complete la instalación. 338 RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux Figura 12.2: Configuración de la contraseña root y creación de usuario Cuando la instalación haya finalizado, haga clic en Reboot (Reiniciar). Anaconda muestra la pantalla Initial Setup (Configuración inicial) si se instaló un escritorio gráfico. Acepte la información de la licencia y, opcionalmente, registre el sistema en el administrador de suscripciones. Puede omitir el registro del sistema y realizarlo más tarde. Resolución de problemas durante la instalación Durante la instalación de Red Hat Enterprise Linux 8, Anaconda proporciona dos consolas virtuales. La primera tiene cinco ventanas provistas por el multiplexor del terminal de software tmux. Puede acceder a la consola con Ctrl+Alt+F1. La segunda consola virtual, que se muestra de forma predeterminada, muestra la interfaz gráfica de Anaconda. Puede acceder con Ctrl+Alt+F6. En la primera consola virtual, tmux proporciona un prompt de shell en la segunda ventana. Puede usarlo para ingresar comandos para inspeccionar y solucionar problemas del sistema mientras la instalación continúa. Las otras ventanas muestran mensajes de diagnóstico, registros y otra información. En la siguiente tabla, se detallan las combinaciones de teclas para acceder a las consolas virtuales y a las ventanas de tmux. En el caso de tmux, los atajos de teclado se realizan en dos pasos: presionar y soltar Ctrl+B; luego, presionar la tecla numérica de la ventana a la cual desea acceder. Para tmux, también puede usar Alt+Tab para rotar entre las diferentes ventanas. Secuencia de teclas contenidos Ctrl+Alt+F1 Acceder al multiplexor del terminal de tmux. RH134-RHEL8.2-es-1-20200928 339 capítulo 12 | Instalación de Red Hat Enterprise Linux Secuencia de teclas contenidos Ctrl+B 1 Cuando se encuentre en tmux, esto le permite acceder a la página de información principal del proceso de instalación. Ctrl+B 2 Cuando se encuentre en tmux, proporcione una shell root. Anaconda almacena los archivos de registro de instalación en el directorio /tmp. Ctrl+B 3 Cuando se encuentre en tmux, visualice el contenido del archivo /tmp/ anaconda.log. Ctrl+B 4 Cuando se encuentre en tmux, visualice el contenido del archivo /tmp/ storage.log. Ctrl+B 5 Cuando se encuentre en tmux, visualice el contenido del archivo /tmp/ program.log. Ctrl+Alt+F6 Le permite acceder a la interfaz gráfica de Anaconda. nota A los fines de que exista compatibilidad con versiones anteriores de Red Hat Enterprise Linux, las consolas virtuales de Ctrl+Alt+F2 a Ctrl+Alt+F5 también presentan shells root durante la instalación. Referencias Para obtener más información, consulte la guía Realización de una instalación estándar de RHEL en https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/htmlsingle/performing_a_standard_rhel_installation/index 340 RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux Ejercicio Guiado Instalación de Red Hat Enterprise Linux En este ejercicio, reinstalará uno de sus servidores con una instalación mínima de Red Hat Enterprise Linux. Resultados Debe ser capaz de instalar manualmente Red Hat Enterprise Linux 8. Andes De Comenzar En la máquina workstation, inicie sesión con el usuario student con la contraseña student. En la máquina workstation, ejecute el comando lab installing-install start. Este comando ejecuta un script de inicio para determinar si la máquina servera es accesible en la red. También agrega una nueva entrada en el menú de GRUB2 para arrancar servera en los medios de instalación. [student@workstation ~]$ lab installing-install start Instrucciones 1. Acceda a la consola de servera y reinicie el sistema en los medios de instalación. 1.1. Localice el icono de la consola de servera para el entorno del aula. Abra la consola. 1.2. Para reiniciar, envíe Ctrl+Alt+Del a su sistema usando la entrada del teclado, del menú o la entrada virtual relevantes. 1.3. Cuando aparezca el menú del cargador de arranque, seleccione Install Red Hat Enterprise Linux 8 (Instalar Red Hat Enterprise Linux 8). 1.4. Espere a que aparezca la ventana de selección de idioma. 2. Deje seleccionado el idioma predeterminado y haga clic en Continue (Continuar). 3. Use la partición automática en el disco /dev/vdapredeterminado. 3.1. Haga clic en Installation Destination (Destino de la instalación). 3.2. Haga clic en el primer disco, vda, para seleccionarlo. Haga clic en Done (Finalizado) para usar la opción predeterminada de partición automática. 3.3. En la ventana Installation Options (Opciones de instalación), haga clic en Reclaim space (Recuperar espacio). Dado que el disco /dev/vda ya tiene particiones y sistemas de archivos de la instalación anterior, esta selección le permite borrar el disco para la nueva instalación. En la ventana Reclaim Disk Space (Recuperar espacio del disco), haga clic en Delete all (Borrar todo) y, luego, en Reclaim space (Recuperar espacio). RH134-RHEL8.2-es-1-20200928 341 capítulo 12 | Instalación de Red Hat Enterprise Linux 4. Establezca el nombre de host del servidor en servera.lab.example.com y verifique la configuración de la interfaz de red. 4.1. Haga clic en Network & Host Name (Nombre del host y de la red). 4.2. En el campo Host Name (Nombre del host), ingrese servera.lab.example.com y, luego, haga clic en Apply (Aplicar). 4.3. Haga clic en Configure (Configurar) y, luego, haga clic en la pestaña IPv4 Settings (Configuración de IPv4). 4.4. Confirme que los parámetros de red sean correctos. La dirección IP es 172.25.250.10, la máscara de red es 24 y la puerta de enlace y el servidor de nombres están configurados en 172.25.250.254. Haga clic en Save (Guardar). 4.5. Confirme que la interfaz de red esté habilitada al configurar ON/OFF (Habilitar/ Deshabilitar) en ON (Habilitar). 4.6. Haga clic en Done (Finalizado). 5. Configure el campo Installation Source (Fuente de instalación) en http:// content.example.com/rhel8.2/x86_64/dvd. 5.1. Haga clic en Installation Source (Fuente de instalación). 5.2. Seleccione en la red. 5.3. En el campo http://, ingrese content.example.com/rhel8.2/x86_64/dvd 5.4. Haga clic en Done (Finalizado). 6. Seleccione el software requerido para ejecutar una instalación mínima. 7. 6.1. Haga clic en Software Selection (Selección de software). 6.2. Seleccione Minimal Install (Instalación mínima) de la lista Base Environment (Entorno base). 6.3. Haga clic en Done (Finalizado). Configure el propósito del sistema. 7.1. Haga clic en Connect to Red Hat. 7.2. Seleccione Purpose (Propósito). 7.3. Seleccione el rol Red Hat Enterprise Linux Server. 7.4. Seleccione un nivel de SLA de Self-Support (Autosoporte). 7.5. Seleccione el uso Development/Test (Desarrollo/Prueba). 7.6. No cambie ningún otro parámetro. Haga clic en Done (Finalizado). 8. Haga clic en Begin Installation (Comenzar la instalación). 9. Mientras la instalación avanza, establezca la contraseña para root en redhat. 342 RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux 9.1. Haga clic en Root Password (Contraseña de root). 9.2. Ingrese redhat en el campo Root Password (Contraseña de root). 9.3. Ingrese redhat en el campo Confirm (Confirmar). 9.4. La contraseña es débil, por lo que tendrá que hacer clic en Done (Finalizado) dos veces. 10. Mientras la instalación avanza, agregue el usuario student. 10.1. Haga clic en User Creation (Creación del usuario). 10.2. Ingrese student en el campo Full Name (Nombre completo). 10.3. Marque la opción Make this user administrator (Hacer administrador a este usuario) para que student pueda usar sudo para ejecutar comandos como root. 10.4. Ingrese student en el campo Password (Contraseña). 10.5. Ingrese student en el campo Confirm password (Confirmar contraseña). 10.6. La contraseña es débil, por lo que tendrá que hacer clic en Done (Finalizado) dos veces. 11. Cuando la instalación esté completa, haga clic en Reboot (Reiniciar). 12. Cuando el sistema muestre el prompt de inicio de sesión, inicie sesión como student con la contraseña student. Finalizar Use el método apropiado para el entorno del aula para restablecer su máquina servera. Esto concluye el ejercicio guiado. RH134-RHEL8.2-es-1-20200928 343 capítulo 12 | Instalación de Red Hat Enterprise Linux Automatización de la instalación con Kickstart Objetivos Tras finalizar esta sección, usted deberá ser capaz de realizar lo siguiente: • Explicar los conceptos y la arquitectura de Kickstart. • Crear un archivo Kickstart con el sitio web de Kickstart Generator. • Modificar un archivo Kickstart existente con un editor de textos y revisar su sintaxis con ksvalidator. • Publicar un archivo Kickstart para el instalador. • Realizar una instalación Kickstart de red. Creación de un perfil Kickstart Puede automatizar la instalación de Red Hat Enterprise Linux por medio de una función que se denomina Kickstart. Al usar Kickstart, usted especifica todo lo que Anaconda necesita para completar una instalación, incluida la partición del disco, la configuración de la interfaz de red, la selección de paquetes y otros parámetros, en un archivo de texto de Kickstart. Al hacer referencia al archivo de texto, Anaconda realiza la instalación sin la interacción del usuario. nota Kickstart en Red Hat Enterprise Linux es similar a la utilidad Jumpstart en Oracle Solaris, o similar a emplear un archivo de respuesta de configuración desatendida para Microsoft Windows. Los archivos Kickstart comienzan con una lista de comandos que definen cómo se instalará la máquina de destino. Las líneas que comienzan con caracteres # son comentarios que el instalador omite. Las secciones adicionales comienzan con una directiva (que se puede reconocer gracias al primer carácter %) y terminan en una línea con la directiva %end. La sección %packages especifica el software que se instalará en el sistema de destino. Los paquetes individuales se especifican por nombre (sin versiones). Los grupos de paquetes, especificados por nombre o identificación, se reconocen porque comienzan con el carácter @. Los grupos del entorno (grupos de grupos de paquetes) se reconocen porque comienzan con los caracteres @^. Los módulos, las secuencias y los perfiles se especifican con la sintaxis @module:stream/profile. Los grupos tienen componentes obligatorios, predeterminados y opcionales. Normalmente, Kickstart instala los componentes obligatorios y predeterminados. Para excluir un paquete o grupo de paquetes de la instalación, incluya antes un carácter -. Sin embargo, es posible que los paquetes o grupos de paquetes excluidos se instalen si son dependencias obligatorias de otros paquetes obligatorios. Una configuración de Kickstart generalmente usa dos secciones adicionales, %pre y %post, que contienen comandos de scripting de shell que ajustan otras configuraciones del sistema. El script %pre se ejecuta antes de que haga alguna partición del disco. Por lo general, esta sección se usa 344 RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux solo si es necesario tomar medidas para reconocer o inicializar un dispositivo antes de la partición del disco. El script %post se ejecuta después de que la instalación se ha completado. Debe especificar los comandos principales de Kickstart antes de las secciones %pre, %post y %packages pero, por lo demás, puede colocar estas secciones en cualquier orden en el archivo. Comandos de archivos Kickstart Comandos de instalación Definen la fuente de instalación y cómo realizar la instalación. Se muestra un ejemplo para cada uno. • url: Especifica la URL que apunta a los medios de instalación. url --url="http://classroom.example.com/content/rhel8.2/x86_64/dvd/" • repo: Especifica dónde encontrar paquetes adicionales para la instalación. Esta opción debe apuntar a un repositorio yum válido. repo --name="appstream" --baseurl=http://classroom.example.com/content/rhel8.2/ x86_64/dvd/AppStream/ • text: Fuerza una instalación del modo de texto. • vnc: Permite la visualización de forma remota de la instalación gráfica mediante VNC. vnc --password=redhat Comandos de partición Definen los dispositivos y el esquema de partición que se usarán. • clearpart: Elimina particiones del sistema antes de la creación de particiones nuevas. De manera predeterminada, no se elimina ninguna partición. clearpart --all --drives=sda,sdb --initlabel • part: Especifica el tamaño, el formato y el nombre de una partición. part /home --fstype=ext4 --label=homes --size=4096 --maxsize=8192 --grow • autopart: Crea automáticamente una partición de root, una partición de intercambio y una partición de arranque adecuada para la arquitectura. En unidades con un tamaño grande adecuado, esto también crea una partición de /home. • ignoredisk: Controla el acceso de Anaconda a los discos conectados al sistema. ignoredisk --drives=sdc • bootloader: Define dónde instalar el cargador de arranque. bootloader --location=mbr --boot-drive=sda RH134-RHEL8.2-es-1-20200928 345 capítulo 12 | Instalación de Red Hat Enterprise Linux • volgroup, logvol: Crea grupos de volúmenes LVM y volúmenes lógicos. part pv.01 --size=8192 volgroup myvg pv.01 logvol / --vgname=myvg --fstype=xfs --size=2048 --name=rootvol --grow logvol /var --vgname=myvg --fstype=xfs --size=4096 --name=varvol • zerombr: Inicializa los discos cuyo formato no se reconoce. Comandos de red Definen las funciones de red usadas por el host. • network: Configura la información de la red para el sistema de destino. Activa los dispositivos de red en el entorno del instalador. network --device=eth0 --bootproto=dhcp • firewall: Define la configuración del firewall para el sistema de destino. firewall --enabled --service=ssh,http Comandos de ubicación y seguridad Configuran los ajustes relacionados con la seguridad, el idioma y las regiones. • lang: Establece el idioma para usar durante la instalación y el idioma predeterminado del sistema instalado. Obligatorio. lang en_US.UTF-8 • keyboard: Establece el tipo de teclado del sistema. Obligatorio. keyboard --vckeymap=us --xlayouts='' • timezone: Define la zona horaria, los servidores NTP y si el reloj del hardware usa UTC. timezone --utc --ntpservers=time.example.com Europe/Amsterdam • authselect: Establece opciones de autenticación. Las opciones reconocidas por authselect son válidas para este comando. Consulte authselect(8). • rootpw: Define la contraseña inicial de root. rootpw --plaintext redhat or rootpw --iscrypted $6$KUnFfrTzO8jv.PiH$YlBbOtXBkWzoMuRfb0.SpbQ....XDR1UuchoMG1 • selinux: Establece el modo de SELinux para el sistema instalado. selinux --enforcing 346 RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux • services: Modifica el conjunto de servicios predeterminado que se ejecutan en el destino systemd predeterminado. services --disabled=network,iptables,ip6tables --enabled=NetworkManager,firewalld • group, user: Crea un grupo o usuario locales en el sistema. group --name=admins --gid=10001 user --name=jdoe --gecos="John Doe" --groups=admins --password=changeme -plaintext Comandos varios Configuran diversos ítems relacionados con el registro durante la instalación y el estado de energía del host al finalizar. • logging: Este comando define cómo Anaconda realizará el registro durante la instalación. logging --host=loghost.example.com --level=info • firstboot: Si está habilitado, el Agente de configuración se inicia la primera vez que el sistema arranca. Se debe instalar el paquete initial-setup. firstboot --disabled • reboot, poweroff, halt: Especifican la medida final que se tomará cuando finalice la instalación. nota La utilidad ksverdiff del paquete pykickstart sirve para identificar cambios en la sintaxis del archivo Kickstart entre dos versiones de Red Hat Enterprise Linux o Fedora. Por ejemplo, ksverdiff -f RHEL7 -t RHEL8 identifica cambios en la sintaxis de RHEL 7 a RHEL 8. Las versiones disponibles se enumeran en la parte superior del archivo /usr/lib/python3.6/site-packages/pykickstart/ version.py. Ejemplo de un archivo Kickstart La primera parte del archivo consta de los comandos de instalación, como la partición del disco y la fuente de instalación. #version=RHEL8 ignoredisk --only-use=vda # System bootloader configuration bootloader --append="console=ttyS0 console=ttyS0,115200n8 no_timer_check net.ifnames=0 crashkernel=auto" --location=mbr --timeout=1 --boot-drive=vda # Clear the Master Boot Record zerombr # Partition clearing information RH134-RHEL8.2-es-1-20200928 347 capítulo 12 | Instalación de Red Hat Enterprise Linux clearpart --all --initlabel # Use text mode install text repo --name="appstream" --baseurl=http://classroom.example.com/content/rhel8.2/ x86_64/dvd/AppStream/ # Use network installation url --url="http://classroom.example.com/content/rhel8.2/x86_64/dvd/" # Keyboard layouts # old format: keyboard us # new format: keyboard --vckeymap=us --xlayouts='' # System language lang en_US.UTF-8 # Root password rootpw --plaintext redhat # System authorization information auth --enableshadow --passalgo=sha512 # SELinux configuration selinux --enforcing firstboot --disable # Do not configure the X Window System skipx # System services services --disabled="kdump,rhsmcertd" --enabled="sshd,rngd,chronyd" # System timezone timezone America/New_York --isUtc # Disk partitioning information part / --fstype="xfs" --ondisk=vda --size=10000 La segunda parte contiene la sección %packages, que detalla qué paquetes y grupo de paquetes deben instalarse y qué paquetes no deben instalarse. %packages @core chrony cloud-init dracut-config-generic dracut-norescue firewalld grub2 kernel rsync tar -plymouth %end La última parte contiene todos los scripts de instalación %pre y %post. %post --erroronfail # For cloud images, 'eth0' _is_ the predictable device name, since # we don't want to be tied to specific virtual (!) hardware 348 RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux rm -f /etc/udev/rules.d/70* ln -s /dev/null /etc/udev/rules.d/80-net-name-slot.rules # simple eth0 config, again not hard-coded to the build hardware cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF DEVICE="eth0" BOOTPROTO="dhcp" ONBOOT="yes" TYPE="Ethernet" USERCTL="yes" PEERDNS="yes" IPV6INIT="no" EOF %end nota En un archivo Kickstart, si no se determinan los valores obligatorios, el instalador solicitará una repuesta interactivamente o abortará la instalación por completo. Pasos de instalación Kickstart Para automatizar correctamente la instalación de Red Hat Enterprise Linux, siga estos pasos: 1. 2. 3. Cree un archivo Kickstart. Publique un archivo Kickstart para el instalador. Arranque Anaconda y apúntelo al archivo Kickstart. Creación de un archivo Kickstart Use cualquiera de estos métodos para crear un archivo Kickstart: • Usar el sitio web de Kickstart Generator. • Usar un editor de textos. El sitio web de Kickstart Generator en https://access.redhat.com/labs/ kickstartconfig/ presenta cuadros de diálogo para las entradas del usuario y crea un archivo de texto con directivas Kickstart con las opciones del usuario. Cada cuadro de diálogo corresponde a los ítems del instalador de Anaconda que se pueden configurar. RH134-RHEL8.2-es-1-20200928 349 capítulo 12 | Instalación de Red Hat Enterprise Linux Figura 12.3: Configuración básica con Kickstart Generator nota Al momento de la escritura, el sitio web de Kickstart Generator no proporcionaba Red Hat Enterprise Linux 8 como opción de menú. Red Hat Enterprise Linux 8 Beta era una selección válida. La creación de un archivo Kickstart desde cero suele ser demasiado compleja, pero la edición de un archivo Kickstart existente es común y útil. Cada instalación crea un archivo /root/ anaconda-ks.cfg que contiene las directivas Kickstart que se usan en la instalación. Este archivo es un buen punto de inicio al crear un archivo Kickstart de forma manual. ksvalidator es una utilidad que revisa errores de sintaxis en un archivo Kickstart. Asegura que las palabras clave y las opciones se usen adecuadamente, pero no garantiza que las rutas URL, ni los paquetes individuales, ni los grupos, ni ninguna parte de los scripts %post o %pre se ejecutarán de forma correcta. Por ejemplo, si la directiva firewall --disabled está mal escrita, ksvalidator podría producir uno de los siguientes errores: [user@host ~]$ ksvalidator /tmp/anaconda-ks.cfg The following problem occurred on line 10 of the kickstart file: Unknown command: frewall [user@host ~]$ ksvalidator /tmp/anaconda-ks.cfg The following problem occurred on line 10 of the kickstart file: no such option: --dsabled 350 RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux El paquete pykickstart proporciona ksvalidator. Publicar el archivo Kickstart para Anaconda Para que el archivo Kickstart esté disponible para el instalador, colóquelo en una de las siguientes ubicaciones: • un servidor de red disponible en el momento de la instalación mediante FTP, HTTP o NFS; • un disco USB o CD-ROM disponibles; • un disco duro local en el sistema que se instalará. El instalador debe acceder al archivo Kickstart para iniciar una instalación automatizada. El método de automatización más común usa un servidor de red, como un servidor FTP, web o NFS. Los servidores de red facilitan el mantenimiento del archivo Kickstart porque los cambios se pueden hacer solo una vez y, luego, se usan para múltiples instalaciones futuras. También es conveniente proporcionar archivos Kickstart en USB o CD-ROM. El archivo Kickstart se puede integrar en los medios de arranque usados para iniciar la instalación. Sin embargo, cuando se cambia el archivo Kickstart, debe generar nuevos medios de instalación. Si proporciona el archivo Kickstart en un disco local, puede volver a compilar rápidamente un sistema. Arrancar Anaconda y apuntarlo al archivo Kickstart Una vez elegido un método de Kickstart, se le indica al instalador dónde ubicar el archivo Kickstart al pasar el parámetro inst.ks=LOCATION al kernel de instalación. Algunos ejemplos: • inst.ks=http://server/dir/file • inst.ks=ftp://server/dir/file • inst.ks=nfs:server:/dir/file • inst.ks=hd:device:/dir/file • inst.ks=cdrom: dispositivo RH134-RHEL8.2-es-1-20200928 351 capítulo 12 | Instalación de Red Hat Enterprise Linux Figura 12.4: Especificación de la ubicación del archivo Kickstart durante la instalación En el caso de instalaciones en máquinas virtuales mediante el uso de Virtual Machine Manager o virt-manager, la URL Kickstart se puede especificar en una caja (box) debajo de URL Options (Opciones de URL). Cuando realice una instalación en máquinas físicas, realice el arranque usando medios de instalación y presione la tecla de tabulación para interrumpir el proceso de arranque. Agregue un parámetro inst.ks=LOCATION para el kernel de instalación. Referencias Capítulo Conceptos básicos de instalación de Kickstart en Realización de una instalación avanzada de RHEL en https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/ html-single/performing_an_advanced_rhel_installation/kickstart-installationbasics_installing-rhel-as-an-experienced-user#kickstart-installationbasics_installing-rhel-as-an-experienced-user Sección Comandos Kickstart para la configuración del programa de instalación y control de flujo en el Apéndice B. Referencia de comandos y opciones de Kickstart en Realización de una instalación avanzada de RHEL en https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/ html-single/performing_an_advanced_rhel_installation/kickstart-installationbasics_installing-rhel-as-an-experienced-user#kickstart-commands-forinstallation-program-configuration-and-flow-control_kickstart-commands-andoptions-reference Capítulo Opciones de arranque en Realización de una instalación avanzada de RHEL en https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/ html-single/performing_an_advanced_rhel_installation/kickstart-installationbasics_installing-rhel-as-an-experienced-user#kickstart-and-advanced-bootoptions_installing-rhel-as-an-experienced-user 352 RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux Ejercicio Guiado Automatización de la instalación con Kickstart En este trabajo de laboratorio, creará un archivo kickstart y validará la sintaxis. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear un archivo kickstart. • Usar ksvalidator para validar la sintaxis del archivo kickstart. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab installing-kickstart start. Este comando ejecuta un script de inicio para determinar si la máquina servera es accesible en la red. También verifica que Apache está instalado y configurado en servera. [student@workstation ~]$ lab installing-kickstart start 1. Use el comando ssh para iniciar sesión en servera como el usuario student. Los sistemas se configuran para que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Copie /root/anaconda-ks.cfg en servera en un archivo denominado /home/ student/kickstart.cfg de modo que student pueda realizar ediciones. Use el comando sudo cat /root/anaconda-ks.cfg > ~/kickstart.cfg para copiar los contenidos de /root/anaconda-ks.cfg en /home/student/kickstart.cfg. Introduzca la contraseña student cuando se le solicite la contraseña para el usuario student en sudoserverb. [student@servera ~]$ sudo cat /root/anaconda-ks.cfg > ~/kickstart.cfg [sudo] password for student: student 3. Haga los siguientes cambios en /home/student/kickstart.cfg. 3.1. Comente la directiva reboot (reiniciar): #reboot RH134-RHEL8.2-es-1-20200928 353 capítulo 12 | Instalación de Red Hat Enterprise Linux 3.2. Comente el comando repo para el repositorio de BaseOS. Modifique el comando repo para que AppStream apunte al repositorio de AppStream del aula: #repo --name="koji-override-0" --baseurl=http://downloadnode-02.eng.bos.redhat.com/rhel-8/devel/candidate-trees/RHEL-8/RHEL-8.2.0updates-20200423.0/compose/BaseOS/x86_64/os repo --name="appstream" --baseurl=http://classroom.example.com/content/rhel8.2/ x86_64/dvd/AppStream/ 3.3. Cambie el comando url para especificar los medios de fuentes de instalación HTTP del aula: url --url="http://classroom.example.com/content/rhel8.2/x86_64/dvd/" 3.4. #network 3.5. Comente el comando network: --bootproto=dhcp --device=link --activate Establezca la contraseña de root en redhat. Cambie la línea que comienza con rootpw por: rootpw --plaintext redhat 3.6. Elimine la línea que usa el comando auth y agregue la línea authselect select sssd para configurar el servicio sssd como la fuente de identidad y autenticación. authselect select sssd En Red Hat Enterprise Linux 8, el comando authselect reemplaza el comando authconfig. 3.7. Simplifique el comando services para que se vea de la siguiente manera: services --disabled="kdump,rhsmcertd" --enabled="sshd,rngd,chronyd" 3.8. Comente los comandos part. Agregue el comando autopart: # Disk partitioning information #part biosboot --fstype="biosboot" --size=1 #part /boot/efi --fstype="efi" --size=100 --fsoptions="..." #part / --fstype="xfs autopart 3.9. Elimine todo el contenido entre la sección %post y su %end. Agregue la siguiente línea: echo "Kickstarted on $(date)" >> /etc/issue La sección %post debe aparecer de la siguiente manera: %post --erroronfail echo "Kickstarted on $(date)" >> /etc/issue %end 354 RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux 3.10. Simplifique la especificación del paquete para que se vea exactamente de la siguiente manera: %packages @core chrony dracut-config-generic dracut-norescue firewalld grub2 kernel rsync tar httpd -plymouth %end Al finalizar la edición del archivo, guárdelo y salga. 4. Use el comando ksvalidator para comprobar si hay errores de sintaxis en el archivo Kickstart. [student@servera ~]$ ksvalidator kickstart.cfg 5. Copie kickstart.cfg en el directorio /var/www/html/ks-config. [student@servera ~]$ sudo cp ~/kickstart.cfg /var/www/html/ks-config 6. Salga de servera. [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En workstation, ejecute el script lab installing-kickstart finish para terminar este ejercicio. [student@workstation ~]$ lab installing-kickstart finish Esto concluye el ejercicio guiado. RH134-RHEL8.2-es-1-20200928 355 capítulo 12 | Instalación de Red Hat Enterprise Linux Instalación y configuración de máquinas virtuales Objetivos Tras finalizar esta sección, usted deberá ser capaz de instalar una máquina virtual en su servidor Red Hat Enterprise Linux por medio de Cockpit. Presentación de la virtualización de KVM La virtualización es una característica que permite que una sola máquina física se divida en varias máquinas virtuales (VM), cada una de las cuales puede ejecutar un sistema operativo independiente. Red Hat Enterprise Linux 8 es compatible con la máquina virtual basada en el kernel (KVM), una solución de virtualización completa compilada como parte del kernel de Linux. KMV puede ejecutar múltiples sistemas operativos guest Windows y Linux. Figura 12.5: Virtualización de KVM En Red Hat Enterprise Linux, administre KVM con el comando virsh o con la herramienta Virtual Machines de Cockpit. La tecnología de máquinas virtuales de KVM está disponible en todos los productos Red Hat, que van desde instancias físicas independientes de Red Hat Enterprise Linux hasta Red Hat OpenStack Platform: • Los sistemas de hardware físico ejecutan Red Hat Enterprise Linux para proporcionar la virtualización de KVM. Red Hat Enterprise Linux normalmente es un thick host, un sistema que admite máquinas virtuales y que, al mismo tiempo, presta otros servicios locales y de red, aplicaciones y funciones de administración. • Red Hat Virtualization (RHV) proporciona una interfaz web centralizada que permite a los administradores administrar una infraestructura virtual completa. Incluye características avanzadas, como la migración de KVM, la redundancia y la alta disponibilidad. Red Hat 356 RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux Virtualization Hypervisor es una versión optimizada de Red Hat Enterprise Linux dedicada específicamente al aprovisionamiento y al soporte de máquinas virtuales. • Red Hat OpenStack Platform (RHOSP) es la base para crear, implementar y escalar una nube pública o privada. Red Hat es compatible con máquinas virtuales que ejecutan estos sistemas operativos: • Red Hat Enterprise Linux 6 y versiones posteriores • Microsoft Windows 10 y versiones posteriores • Microsoft Windows Server 2016 y versiones posteriores Configuración de un sistema físico Red Hat Enterprise Linux como host de virtualización Los administradores pueden configurar un sistema Red Hat Enterprise Linux como host de virtualización para poder realizar tareas de desarrollo, pruebas o capacitación, o cuando se necesite trabajar en múltiples sistemas operativos simultáneamente. Instalación de las herramientas de virtualización Instale el módulo de Yum virt para preparar un sistema para que se convierta en un host de virtualización. [root@host ~]# yum module list virt Name Stream Profiles virt rhel [d][e] common [d] Summary Virtualization module Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled [root@host ~]# yum module install virt ...output omitted... Verificación de los requisitos del sistema KVM requiere un procesador Intel con las extensiones Intel VT-x e Intel 64 para los sistemas basados en x86, o un procesador AMD con las extensiones AMD-V y AMD64. Para verificar su hardware y los requisitos del sistema, use el comando virt-host-validate. [root@host ~]# virt-host-validate QEMU: Checking for hardware virtualization : PASS QEMU: Checking if device /dev/kvm exists : PASS QEMU: Checking if device /dev/kvm is accessible : PASS QEMU: Checking if device /dev/vhost-net exists : PASS QEMU: Checking if device /dev/net/tun exists : PASS QEMU: Checking for cgroup 'memory' controller support : PASS QEMU: Checking for cgroup 'memory' controller mount-point : PASS QEMU: Checking for cgroup 'cpu' controller support : PASS QEMU: Checking for cgroup 'cpu' controller mount-point : PASS QEMU: Checking for cgroup 'cpuacct' controller support : PASS QEMU: Checking for cgroup 'cpuacct' controller mount-point : PASS QEMU: Checking for cgroup 'cpuset' controller support : PASS QEMU: Checking for cgroup 'cpuset' controller mount-point : PASS QEMU: Checking for cgroup 'devices' controller support : PASS QEMU: Checking for cgroup 'devices' controller mount-point : PASS RH134-RHEL8.2-es-1-20200928 357 capítulo 12 | Instalación de Red Hat Enterprise Linux QEMU: Checking for cgroup 'blkio' controller support QEMU: Checking for cgroup 'blkio' controller mount-point QEMU: Checking for device assignment IOMMU support : PASS : PASS : PASS El sistema debe aprobar todos los ítems de validación para poder ser un host KVM. Administración de máquinas virtuales con Cockpit El módulo de Yum virt proporciona el comando virsh para administrar sus máquinas virtuales. La herramienta Cockpit proporciona una interfaz de consola web para la gestión de KVM y la creación de máquinas virtuales. Figura 12.6: Administración de máquinas virtuales en Cockpit Instale el paquete cockpit-machines para agregar el menú Virtual Machines (Máquinas virtuales) en Cockpit. [root@host ~]# yum install cockpit-machines Si Cockpit no se está ejecutando, inícielo y habilítelo. [root@host ~]# systemctl enable --now cockpit.socket Para crear una nueva máquina virtual con Cockpit, acceda al menú Virtual Machines (Máquinas virtuales) en la interfaz web de Cockpit. Desde allí, haga clic en Create VM (Crear máquina 358 RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux virtual) e ingrese la configuración de la máquina virtual en la ventana Create New Virtual Machine (Crear nueva máquina virtual). Figura 12.7: Creación de una máquina virtual en Cockpit • Name (Nombre) establece un nombre de dominio para la configuración de la máquina virtual. Este nombre no está relacionado con el nombre del host de red que le da al sistema en la máquina virtual instalada. • Installation Source Type (Tipo de fuente de instalación) es el método para recuperar el archivo ISO de instalación. Las opciones incluyen el sistema de archivos local o una URL de HTTPS, FTP o NFS. • Installation Source (Fuente de instalación) proporciona la ruta de la fuente de instalación. • OS Vendor (Proveedor de SO) y Operating System (Sistema operativo) indican el sistema operativo de la máquina virtual. La capa de virtualización presenta una emulación de hardware compatible con el sistema operativo elegido. • Memory (Memoria) es la cantidad de RAM disponible para la máquina virtual nueva. • Storage Size (Tamaño de almacenamiento) es el tamaño del disco de la máquina virtual nueva. Asocie discos adicionales con la máquina virtual después de la instalación. • Immediately Start VM (Iniciar máquina virtual de inmediato) indica si la máquina virtual se debe iniciar inmediatamente después de hacer clic en Create (Crear). Haga clic en Create (Crear) para crear la máquina virtual y en Install (Instalar) para iniciar la instalación del sistema operativo. Cockpit muestra la consola de la máquina virtual desde la que puede instalar el sistema. RH134-RHEL8.2-es-1-20200928 359 capítulo 12 | Instalación de Red Hat Enterprise Linux Figura 12.8: Instalación del sistema operativo de la máquina virtual Referencias Para obtener más información, consulte la guía Configuración y administración de la virtualización en https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/htmlsingle/configuring_and_managing_virtualization/index ¿Qué es la virtualización? https://www.redhat.com/en/topics/virtualization/what-is-virtualization 360 RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux Cuestionario Instalación y configuración de máquinas virtuales Elija las respuestas correctas para las siguientes preguntas: 1. ¿Qué tres sistemas operativos guest admite Red Hat como máquinas virtuales KVM? (Elija tres opciones). a. Fedora 28 y versiones posteriores b. Red Hat Enterprise Linux 6 y versiones posteriores c. CoreOS Container Linux 2023 y versiones posteriores d. Microsoft Windows 7 SP1 e. Microsoft Windows 10 y versiones posteriores f. Microsoft Windows Server 2016 y versiones posteriores 2. ¿Qué dos componentes se requieren para configurar su sistema como un host de virtualización y gestionar máquinas virtuales con la consola web? (Elija dos opciones). a. El módulo de Yum virt b. El grupo de paquetes de openstack c. El paquete cockpit-machines d. El grupo de paquetes de Virtualization Platform e. El módulo de Yum kvm f. El paquete cockpit-virtualization 3. ¿Qué comando verifica si su sistema es compatible con la virtualización? a. grep kvm /proc/cpuinfo b. virsh validate c. virt-host-validate d. rhv-validate e. cockpit-validate 4. ¿Qué dos herramientas puede usar para iniciar y detener sus máquinas virtuales en un sistema Red Hat Enterprise Linux? (Elija dos opciones). a. vmctl b. libvirtd c. virsh d. openstack e. Consola web RH134-RHEL8.2-es-1-20200928 361 capítulo 12 | Instalación de Red Hat Enterprise Linux Solución Instalación y configuración de máquinas virtuales Elija las respuestas correctas para las siguientes preguntas: 1. ¿Qué tres sistemas operativos guest admite Red Hat como máquinas virtuales KVM? (Elija tres opciones). a. Fedora 28 y versiones posteriores b. Red Hat Enterprise Linux 6 y versiones posteriores c. CoreOS Container Linux 2023 y versiones posteriores d. Microsoft Windows 7 SP1 e. Microsoft Windows 10 y versiones posteriores f. Microsoft Windows Server 2016 y versiones posteriores 2. ¿Qué dos componentes se requieren para configurar su sistema como un host de virtualización y gestionar máquinas virtuales con la consola web? (Elija dos opciones). a. El módulo de Yum virt b. El grupo de paquetes de openstack c. El paquete cockpit-machines d. El grupo de paquetes de Virtualization Platform e. El módulo de Yum kvm f. El paquete cockpit-virtualization 3. ¿Qué comando verifica si su sistema es compatible con la virtualización? a. grep kvm /proc/cpuinfo b. virsh validate c. virt-host-validate d. rhv-validate e. cockpit-validate 4. ¿Qué dos herramientas puede usar para iniciar y detener sus máquinas virtuales en un sistema Red Hat Enterprise Linux? (Elija dos opciones). a. vmctl b. libvirtd c. virsh d. openstack e. Consola web 362 RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux Trabajo de laboratorio Instalación de Red Hat Enterprise Linux Lista de verificación de rendimiento En este trabajo de laboratorio, creará un archivo kickstart y realizará una instalación kickstart en serverb. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear un archivo kickstart. • Poner el archivo kickstart a disposición del instalador. • Realizar una instalación kickstart. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab installing-review start. Este comando ejecuta un script de inicio para determinar si las máquinas servera y serverb son accesibles en la red, y configura Apache en serverb. También configura el menú de arranque en serverb para que el ejercicio realice una instalación kickstart. [student@workstation ~]$ lab installing-review start Prepare un archivo kickstart en serverb según lo especificado y póngalo a disposición en http://serverb.lab.example.com/ks-config/kickstart.cfg . Ejecute una instalación kickstart en servera usando el archivo kickstart que preparó. 1. En serverb, copie /root/anaconda-ks.cfg en /home/student/kickstart.cfg, para que el usuario student pueda editarlo. 2. Haga los siguientes cambios en /home/student/kickstart.cfg. • Comente el comando reboot. • Comente el comando repo para el repositorio de BaseOS. Modifique el comando repo para que el repositorio de AppStream apunte a http://classroom.example.com/ content/rhel8.2/x86_64/dvd/AppStream/. El nombre del repositorio se debe establecer en appstream. • Cambie el comando url para usar http://classroom.example.com/content/ rhel8.2/x86_64/dvd/ como la fuente de instalación. • Comente el comando network. • Cambie el comando rootpw para usar plaintext y establezca la contraseña de root en redhat. RH134-RHEL8.2-es-1-20200928 363 capítulo 12 | Instalación de Red Hat Enterprise Linux • Elimine la línea que usa el comando auth y agregue la línea authselect select sssd para configurar el servicio sssd como la fuente de identidad y autenticación. • Simplifique el comando services para que se deshabiliten solo los servicios kdump y rhsmcertd. Deje habilitados solo sshd, rngd y chronyd. • Agregue el comando autopart. Los comandos part ya debe estar comentados. • Simplifique la sección %post para que solo ejecute un script para agregar el texto Kickstarted on DATE en el final del archivo /etc/issue. DATE es información variable y se debe generar a través del script con el comando date sin opciones adicionales. • Simplifique la sección %package de la siguiente manera: incluya los paquetes @core, chrony, dracut-config-generic, dracut-norescue, firewalld, grub2, kernel, rsync, tar y httpd. Asegúrese de que no se instale el paquete plymouth. 3. Valide la sintaxis de kickstart.cfg. 4. Ponga a disposición el archivo /home/student/kickstart.cfg en http:// serverb.lab.example.com/ks-config/kickstart.cfg 5. Vuelva al sistema workstation para verificar su trabajo. Evaluación En workstation, ejecute el script lab installing-review grade para calificar este ejercicio. Reinicie servera para realizar una instalación kickstart. [student@workstation ~]$ lab installing-review grade Corrija cualquier falla en kickstart.cfg que se comparta desde el servidor web serverb ya sea al modificar /var/www/html/ks-config/kickstart.cfg directamente o al modificar ~/ kickstart.cfg y copiarlo en /var/www/html/ks-config/. Reinicie servera para ejecutar una instalación kickstart. En el menú de GRUB, seleccione Kickstart Red Hat Enterprise Linux 8 y presione Enter. Finalizar En workstation, ejecute el script lab installing-review finish para terminar este ejercicio. Este script elimina el servidor web configurado en serverb durante el ejercicio. [student@workstation ~]$ lab installing-review finish Restablezca el sistema servera para regresarlo al estado predeterminado. Esto concluye el trabajo de laboratorio. 364 RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux Solución Instalación de Red Hat Enterprise Linux Lista de verificación de rendimiento En este trabajo de laboratorio, creará un archivo kickstart y realizará una instalación kickstart en serverb. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear un archivo kickstart. • Poner el archivo kickstart a disposición del instalador. • Realizar una instalación kickstart. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute el comando lab installing-review start. Este comando ejecuta un script de inicio para determinar si las máquinas servera y serverb son accesibles en la red, y configura Apache en serverb. También configura el menú de arranque en serverb para que el ejercicio realice una instalación kickstart. [student@workstation ~]$ lab installing-review start Prepare un archivo kickstart en serverb según lo especificado y póngalo a disposición en http://serverb.lab.example.com/ks-config/kickstart.cfg . Ejecute una instalación kickstart en servera usando el archivo kickstart que preparó. 1. En serverb, copie /root/anaconda-ks.cfg en /home/student/kickstart.cfg, para que el usuario student pueda editarlo. 1.1. Use el comando ssh para iniciar sesión en serverb con el usuario student. [student@workstation ~]$ ssh student@serverb ...output omitted... [student@serverb ~]$ 1.2. Copie /root/anaconda-ks.cfg en serverb en un archivo denominado /home/ student/kickstart.cfg de modo que student pueda realizar ediciones. Use el comando sudo cat /root/anaconda-ks.cfg > ~/kickstart.cfg para copiar el archivo /root/anaconda-ks.cfg en /home/student/kickstart.cfg. Introduzca la contraseña student cuando se le solicite la contraseña para el usuario student en sudoserverb. RH134-RHEL8.2-es-1-20200928 365 capítulo 12 | Instalación de Red Hat Enterprise Linux [student@serverb ~]$ sudo cat /root/anaconda-ks.cfg > ~/kickstart.cfg [sudo] password for student: student Haga los siguientes cambios en /home/student/kickstart.cfg. 2. • Comente el comando reboot. • Comente el comando repo para el repositorio de BaseOS. Modifique el comando repo para que el repositorio de AppStream apunte a http://classroom.example.com/ content/rhel8.2/x86_64/dvd/AppStream/. El nombre del repositorio se debe establecer en appstream. • Cambie el comando url para usar http://classroom.example.com/content/ rhel8.2/x86_64/dvd/ como la fuente de instalación. • Comente el comando network. • Cambie el comando rootpw para usar plaintext y establezca la contraseña de root en redhat. • Elimine la línea que usa el comando auth y agregue la línea authselect select sssd para configurar el servicio sssd como la fuente de identidad y autenticación. • Simplifique el comando services para que se deshabiliten solo los servicios kdump y rhsmcertd. Deje habilitados solo sshd, rngd y chronyd. • Agregue el comando autopart. Los comandos part ya debe estar comentados. • Simplifique la sección %post para que solo ejecute un script para agregar el texto Kickstarted on DATE en el final del archivo /etc/issue. DATE es información variable y se debe generar a través del script con el comando date sin opciones adicionales. • Simplifique la sección %package de la siguiente manera: incluya los paquetes @core, chrony, dracut-config-generic, dracut-norescue, firewalld, grub2, kernel, rsync, tar y httpd. Asegúrese de que no se instale el paquete plymouth. 2.1. Comente la directiva reboot (reiniciar): #reboot 2.2. El comando repo se encuentra dos veces en kickstart.cfg. Comente el comando repo para el repositorio de BaseOS. Modifique el comando repo para que el repositorio de AppStream apunte al repositorio de AppStream del aula: #repo --name="koji-override-0" --baseurl=http://downloadnode-02.eng.bos.redhat.com/rhel-8/devel/candidate-trees/RHEL-8/RHEL-8.2.0updates-20200423.0/compose/BaseOS/x86_64/os repo --name="appstream" --baseurl=http://classroom.example.com/content/rhel8.2/ x86_64/dvd/AppStream/ 2.3. 366 Cambie el comando url para especificar los medios de fuentes de instalación HTTP usados en el aula: RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux url --url="http://classroom.example.com/content/rhel8.2/x86_64/dvd/" 2.4. Comente el comando network: #network 2.5. --bootproto=dhcp --device=link --activate Establezca la contraseña de root en redhat. Cambie la línea que comienza con rootpw por: rootpw --plaintext redhat 2.6. Elimine la línea que usa el comando auth y agregue la línea authselect select sssd para configurar el servicio sssd como la fuente de identidad y autenticación. authselect select sssd 2.7. Simplifique el comando services para que se vea de la siguiente manera: services --disabled="kdump,rhsmcertd" --enabled="sshd,rngd,chronyd" 2.8. Comente los comandos part. Agregue el comando autopart: # Disk partitioning information #part biosboot --fstype="biosboot" --size=1 #part /boot/efi --fstype="efi" --size=100 --fsoptions="..." #part / --fstype="xfs" --size=10137 --label=root autopart 2.9. Elimine todo el contenido entre la sección %post y su %end. Agregue la siguiente línea: echo "Kickstarted on $(date)" >> /etc/issue La sección %post debe aparecer de la siguiente manera: %post --erroronfail echo "Kickstarted on $(date)" >> /etc/issue %end 2.10. Simplifique la especificación del paquete para que se vea de la siguiente manera: %packages @core chrony dracut-config-generic dracut-norescue firewalld grub2 kernel rsync tar RH134-RHEL8.2-es-1-20200928 367 capítulo 12 | Instalación de Red Hat Enterprise Linux httpd -plymouth %end Valide la sintaxis de kickstart.cfg. 3. 3.1. Use el comando ksvalidator para comprobar si hay errores de sintaxis en el archivo Kickstart. [student@serverb ~]$ ksvalidator kickstart.cfg Ponga a disposición el archivo /home/student/kickstart.cfg en http:// serverb.lab.example.com/ks-config/kickstart.cfg 4. 4.1. Copie kickstart.cfg en el directorio /var/www/html/ks-config/. [student@serverb ~]$ sudo cp ~/kickstart.cfg /var/www/html/ks-config Vuelva al sistema workstation para verificar su trabajo. 5. 5.1. Salga de serverb. [student@serverb ~]$ exit logout Connection to serverb closed. [student@workstation ~]$ Evaluación En workstation, ejecute el script lab installing-review grade para calificar este ejercicio. Reinicie servera para realizar una instalación kickstart. [student@workstation ~]$ lab installing-review grade Corrija cualquier falla en kickstart.cfg que se comparta desde el servidor web serverb ya sea al modificar /var/www/html/ks-config/kickstart.cfg directamente o al modificar ~/ kickstart.cfg y copiarlo en /var/www/html/ks-config/. Reinicie servera para ejecutar una instalación kickstart. En el menú de GRUB, seleccione Kickstart Red Hat Enterprise Linux 8 y presione Enter. Finalizar En workstation, ejecute el script lab installing-review finish para terminar este ejercicio. Este script elimina el servidor web configurado en serverb durante el ejercicio. [student@workstation ~]$ lab installing-review finish Restablezca el sistema servera para regresarlo al estado predeterminado. Esto concluye el trabajo de laboratorio. 368 RH134-RHEL8.2-es-1-20200928 capítulo 12 | Instalación de Red Hat Enterprise Linux Resumen En este capítulo, aprendió lo siguiente: • El DVD binario de RHEL 8 incluye Anaconda y todos los repositorios necesarios para la instalación. • El archivo ISO de arranque de RHEL 8 incluye el instalador de Anaconda, que permite acceder a los repositorios por medio de la red durante la instalación. • El sistema Kickstart ejecuta instalaciones desatendidas. • Los archivos Kickstart se pueden crear por medio del sitio web de Kickstart Generator o al copiar y editar /root/anaconda-ks.cfg. • El módulo de Yum virt proporciona los paquetes para que un sistema RHEL se convierta en un host de virtualización. • El paquete cockpit-machines agrega el menú Virtual Machines (Máquinas virtuales) en Cockpit. RH134-RHEL8.2-es-1-20200928 369 370 RH134-RHEL8.2-es-1-20200928 capítulo 13 Ejecución de contenedores Meta Obtener, ejecutar y administrar servicios livianos simples como contenedores en un único servidor de Red Hat Enterprise Linux. Objetivos • Explicar qué es un contenedor y cómo usar uno para administrar e implementar aplicaciones con dependencias y librerías de software que necesitan las aplicaciones para funcionar. • Instalar las herramientas de administración de contenedores y ejecutar un contenedor rootless simple. • Buscar, recuperar, inspeccionar y administrar imágenes de contenedores obtenidas de un registro de contenedores remoto y almacenadas en su servidor. • Ejecutar contenedores con opciones avanzadas, enumerar los contenedores que se ejecutan en el sistema e iniciar, detener y finalizar contenedores. • Proporcionar almacenamiento persistente para los datos del contenedor mediante el montaje de un directorio desde el host del contenedor dentro de un contenedor en ejecución. • Iniciar, detener y verificar el estado de un contenedor como un servicio systemd. RH134-RHEL8.2-es-1-20200928 371 capítulo 13 | Ejecución de contenedores Secciones Trabajo de laboratorio 372 • Introducción a los contenedores (y cuestionario) • Ejecución de un contenedor básico (y ejercicio guiado) • Búsqueda y administración de imágenes de contenedores (y ejercicio guiado) • Realización de una administración avanzada de contenedores (y ejercicio guiado) • Conexión del almacenamiento persistente a un contenedor (y ejercicio guiado) • Administración de contenedores como servicios (y ejercicio guiado) Ejecución de contenedores RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores Introducción a los contenedores Objetivos Tras completar esta sección, deberá ser capaz de explicar qué es un contenedor y cómo usar uno para administrar e implementar aplicaciones con dependencias y librerías de software con soporte. Introducción a la tecnología de contenedores Por lo general, las aplicaciones de software dependen de otras librerías, archivos de configuración o servicios proporcionados por el entorno de tiempo de ejecución. En general, el entorno de tiempo de ejecución para una aplicación de software se instala en un sistema operativo que se ejecuta en un host físico o una máquina virtual. Todas las dependencias de la aplicación se instalan junto con ese sistema operativo en el host. En Red Hat Enterprise Linux, los sistemas de paquetes como RPM se usan para ayudar a administrar las dependencias de las aplicaciones. Cuando instala el paquete httpd, el sistema RPM garantiza que también se instalen las librerías y las demás dependencias correspondientes para ese paquete. El principal inconveniente de las aplicaciones de software implementadas tradicionalmente es que estas dependencias están entremezcladas con el entorno de tiempo de ejecución. Una aplicación puede necesitar versiones de software que sean anteriores o posteriores al software provisto con el sistema operativo. De manera similar, dos aplicaciones en el mismo sistema pueden requerir diferentes versiones del mismo software que son incompatibles entre sí. Una forma de resolver estos conflictos es empaquetar e implementar la aplicación como un contenedor. Un contenedor es un conjunto de uno o más procesos que están aislados del resto del sistema. Piense en un contenedor de transporte físico. Un contenedor de envío es una forma estándar de empaquetar y enviar mercancías. Se etiqueta, se carga, se descarga y se transporta de una ubicación a otra como si se tratase de una sola caja. El contenido del contenedor se aísla del contenido de otros contenedores para que no se afecten unos a otros. Los contenedores de software son una forma de empaquetar aplicaciones para simplificar la implementación y la administración. Comparación de contenedores y máquinas virtuales Los contenedores ofrecen muchos de los mismos beneficios de las máquinas virtuales, como seguridad, almacenamiento y aislamiento de redes. Ambas tecnologías aíslan las librerías de aplicaciones y los recursos de tiempo de ejecución del sistema operativo del host o del hipervisor y viceversa. RH134-RHEL8.2-es-1-20200928 373 capítulo 13 | Ejecución de contenedores Los contenedores y las máquinas virtuales son diferentes en la forma en que interactúan con el hardware y el sistema operativo subyacente. Virtualización: • Permite que varios sistemas operativos se ejecuten simultáneamente en una única plataforma de hardware. • Usa un hipervisor para dividir el hardware en varios sistemas de hardware virtuales, lo que permite que varios sistemas operativos se ejecuten en paralelo. • Requiere un entorno de sistema operativo completo para dar soporte a la aplicación. Compare y contraste estas características con las de los contenedores, que: • Se ejecutan directamente en el sistema operativo y comparten tanto el hardware como los recursos del sistema operativo en todos los contenedores del sistema. Esto permite que las aplicaciones permanezcan livianas y se ejecuten rápidamente en paralelo. • Comparten el mismo kernel del sistema operativo, aíslan los procesos de aplicaciones contenedorizadas del resto del sistema y usan cualquier software compatible con ese kernel. • Requieren muchos menos recursos de hardware que las máquinas virtuales, lo que también les permite iniciarse y detenerse rápidamente, además de reducir los requisitos de almacenamiento. nota Es posible que algunas aplicaciones no sean adecuadas para ejecutarse como un contenedor. Por ejemplo, en general, es posible que las aplicaciones que acceden a información de hardware de bajo nivel necesiten un acceso de hardware más directo que los contenedores. Exploración de la implementación de contenedores Red Hat Enterprise Linux implementa contenedores mediante el uso de tecnologías core (centrales) como: • Grupos de control (cgroups) para administrar recursos. • Espacios de nombres (Namespaces) para aislar procesos. • SELinux y Seccomp (modo de computación segura) para proporcionar límites de seguridad. 374 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores nota Para obtener un análisis más exhaustivo de la arquitectura y seguridad del contenedor, consulte el informe técnico "Diez capas de seguridad de contenedores" [https://www.redhat.com/en/resources/container-security-openshift-clouddevops-whitepaper]. Planificación para contenedores Los contenedores son una manera eficaz de proporcionar reutilización y portabilidad de las aplicaciones alojadas. Se pueden trasladar fácilmente de un entorno a otro, como de desarrollo a producción. Puede guardar varias versiones de un contenedor y acceder rápidamente a cada una según sea necesario. Por lo general, los contenedores son temporales, o efímeros. Puede guardar de forma permanente los datos generados por un contenedor en ejecución en un almacenamiento persistente, pero los contenedores, por lo general, se ejecutan cuando es necesario; luego, se detienen y se eliminan. Se inicia un nuevo proceso de contenedor la próxima vez que se necesita un contenedor en particular. Ejecución de contenedores a partir de imágenes de contenedores Los contenedores se ejecutan a partir de imágenes de contenedores. Las imágenes de contenedores sirven como modelos para crear contenedores. Las imágenes de contenedores empaquetan una aplicación junto con todas sus dependencias, tales como: • Librerías del sistema • Tiempos de ejecución de lenguajes de programación • Librerías de lenguajes de programación • Parámetros de configuración • Archivos de datos estáticos Las imágenes de contenedores son archivos inalterables o inmutables, que incluyen todo el código requerido y las dependencias para ejecutar un contenedor. Las imágenes de contenedores se compilan de acuerdo con las especificaciones, como la especificación de formato de imagen de Open Container Initiative (OCI). Estas especificaciones definen el formato para las imágenes de contenedores, así como los metadatos acerca de los sistemas operativos del host de contenedores y las arquitecturas de hardware que soporta la imagen. Diseño de arquitecturas basadas en contenedores Podría instalar una aplicación de software compleja formada por varios servicios en un único contenedor. Por ejemplo, puede tener un servidor web que necesite usar una base de datos y un sistema de mensajería. Sin embargo, el uso de un contenedor para varios servicios es difícil de gestionar. Un mejor diseño ejecuta cada componente, el servidor web, la base de datos y el sistema de mensajería en contenedores separados. De esta manera, las actualizaciones y el mantenimiento de los componentes de las aplicaciones individuales no afectan otros componentes ni la stack (pila) de aplicaciones. RH134-RHEL8.2-es-1-20200928 375 capítulo 13 | Ejecución de contenedores Administración de contenedores con Podman Una buena manera de empezar a aprender acerca de los contenedores es trabajar con contenedores individuales en un único servidor que actúa como host de contenedores. Red Hat Enterprise Linux proporciona un conjunto de herramientas de contenedores que puede usar para hacer esto, que incluyen: • podman, que administra directamente contenedores e imágenes de contenedores. • skopeo, que puede usar para inspeccionar, copiar, eliminar y firmar imágenes. • buildah, que puede usar para crear nuevas imágenes de contenedores. Estas herramientas son compatibles con Open Container Initiative (OCI). Se pueden usar para administrar los contenedores de Linux creados por motores de contenedores compatibles con OCI, como Docker. Estas herramientas están diseñadas específicamente para ejecutar contenedores en Red Hat Enterprise Linux en un host de contenedores de un solo nodo. En este capítulo, usará los comandos podman y skopeo para ejecutar y administrar contenedores e imágenes de contenedores existentes. nota El uso de buildah para crear sus propias imágenes de contenedores no está incluido en el alcance de este curso, pero se trata en el curso de capacitación de Red Hat Red Hat OpenShift I: contenedores y kubernetes (DO180). Ejecución de contenedores rootless En el host de contenedores, puede ejecutar contenedores como usuario root o como usuario normal sin privilegios. Los contenedores ejecutados por usuarios sin privilegios se denominan contenedores rootless. Los contenedores rootless son más seguros, pero tienen algunas restricciones. Por ejemplo, los contenedores rootless no pueden publicar sus servicios de red a través de los puertos con privilegios del host de contenedores (los puertos inferiores a 1024). Puede ejecutar contenedores directamente como root, si es necesario, pero esto debilita la seguridad del sistema si un error permite que un atacante comprometa el contenedor. Administración de contenedores a escala Las nuevas aplicaciones implementan cada vez más componentes funcionales mediante contenedores. Estos contenedores proporcionan servicios que consumen otras partes de la aplicación. En una organización, la administración de una cantidad cada vez mayor de contenedores puede convertirse rápidamente en una tarea abrumadora. La implementación de contenedores a escala en la producción requiere un entorno que se pueda adaptar a algunos de los siguientes desafíos: • La plataforma debe garantizar la disponibilidad de contenedores que proporcionen servicios esenciales a los clientes. • El entorno debe responder a los picos de uso de la aplicación mediante el aumento o la reducción de los contenedores en ejecución y el balanceo de carga del tráfico. • La plataforma debería detectar la falla de un contenedor o un host y reaccionar en consecuencia. 376 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores • Es posible que los desarrolladores necesiten un flujo de trabajo automatizado para ofrecer nuevas versiones de aplicaciones a los clientes de forma transparente y segura. Kubernetes es un servicio de orquestación que facilita la implementación, la administración y la escalabilidad de aplicaciones basadas en contenedores en un clúster de hosts de contenedores. Ayuda a gestionar las actualizaciones de DNS al iniciar nuevos contenedores. Ayuda a redirigir el tráfico a sus contenedores mediante un balanceador de carga, que también le permite escalar y reducir verticalmente la cantidad de contenedores que proporcionan un servicio de forma manual o automática. También soporta comprobaciones de estado definidas por el usuario para monitorear sus contenedores y reiniciarlos en caso de que fallen. Red Hat proporciona una distribución de Kubernetes denominada Red Hat OpenShift. OpenShift es un conjunto de componentes y servicios modulares desarrollado sobre la base de una infraestructura de Kubernetes. Agrega características adicionales, como administración remota basada en la Web, multiinquilino (multitenancy), monitoreo y auditoría, administración del ciclo de vida de la aplicación e instancias de autoservicio para desarrolladores, entre otras. Red Hat OpenShift no está incluido en el alcance de este curso, pero puede obtener más información sobre este en https://www.openshift.com. nota En una empresa, los contenedores individuales no se ejecutan generalmente desde la línea de comandos. En cambio, se prefiere ejecutar contenedores en producción mediante una plataforma basada en Kubernetes, como Red Hat OpenShift. Sin embargo, es posible que necesite usar comandos para trabajar con contenedores e imágenes de forma manual o a escala pequeña. Para ello, puede instalar un conjunto de herramientas de contenedores en un sistema Red Hat Enterprise Linux 8. Este capítulo se centra en este caso de uso para ayudarlo a comprender mejor los conceptos básicos subyacentes de los contenedores, cómo funcionan y cómo pueden ser útiles. Referencias Páginas del manual cgroups(7), namespaces(7), seccomp(2). Especificación de imágenes de Open Container Initiative (OCI) https://github.com/opencontainers/image-spec/blob/master/spec.md Para obtener más información, consulte el capítulo Comenzar con contenedores en la Guía de creación, ejecución y administración de contenedores de Red Hat Enterprise Linux 8 en https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/ html-single/building_running_and_managing_containers/index#starting-withcontainers_building-running-and-managing-containers RH134-RHEL8.2-es-1-20200928 377 capítulo 13 | Ejecución de contenedores Cuestionario Introducción a los contenedores Elija las respuestas correctas para las siguientes preguntas: 1. ¿Qué herramienta proporciona Red Hat Enterprise Linux que se usa para ejecutar contenedores? a. buildah b. container c. podman d. skopeo 2. ¿Cuáles de los siguientes son los dos enunciados que describen la tecnología de contenedores? (Elija dos opciones). a. Los contenedores empaquetan sistemas operativos completos, como las máquinas virtuales. b. Los contenedores ejecutan un conjunto de uno o más procesos que están aislados del resto del sistema. c. Cada contenedor incluye su propio kernel. d. Los contenedores proporcionan una forma estándar de empaquetar aplicaciones para facilitar la implementación y la administración. 3. ¿Cuáles de los siguientes son los dos enunciados verdaderos sobre las imágenes de contenedores? (Elija dos opciones). a. Las imágenes de contenedores empaquetan una aplicación con todas las dependencias del tiempo de ejecución que necesita. b. Las imágenes de contenedores que funcionan con Docker no pueden funcionar con Podman. c. Las imágenes de contenedores solo se pueden ejecutar en un host de contenedores que se instala con la misma versión exacta del software en la imagen. d. Las imágenes de contenedores sirven como modelos para crear contenedores. 4. ¿Cuáles son las tres tecnologías core (centrales) que se usan para implementar contenedores en Red Hat Enterprise Linux? (Elija tres opciones). a. Código de hipervisor para alojar máquinas virtuales. b. Grupos de control (cgroups) para administrar recursos. c. Espacios de nombres para aislar procesos. d. Sistema operativo completo para compatibilidad con el host de contenedores. e. SELinux y Seccomp para la seguridad. 378 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores Solución Introducción a los contenedores Elija las respuestas correctas para las siguientes preguntas: 1. ¿Qué herramienta proporciona Red Hat Enterprise Linux que se usa para ejecutar contenedores? a. buildah b. container c. podman d. skopeo 2. ¿Cuáles de los siguientes son los dos enunciados que describen la tecnología de contenedores? (Elija dos opciones). a. Los contenedores empaquetan sistemas operativos completos, como las máquinas virtuales. b. Los contenedores ejecutan un conjunto de uno o más procesos que están aislados del resto del sistema. c. Cada contenedor incluye su propio kernel. d. Los contenedores proporcionan una forma estándar de empaquetar aplicaciones para facilitar la implementación y la administración. 3. ¿Cuáles de los siguientes son los dos enunciados verdaderos sobre las imágenes de contenedores? (Elija dos opciones). a. Las imágenes de contenedores empaquetan una aplicación con todas las dependencias del tiempo de ejecución que necesita. b. Las imágenes de contenedores que funcionan con Docker no pueden funcionar con Podman. c. Las imágenes de contenedores solo se pueden ejecutar en un host de contenedores que se instala con la misma versión exacta del software en la imagen. d. Las imágenes de contenedores sirven como modelos para crear contenedores. 4. ¿Cuáles son las tres tecnologías core (centrales) que se usan para implementar contenedores en Red Hat Enterprise Linux? (Elija tres opciones). a. Código de hipervisor para alojar máquinas virtuales. b. Grupos de control (cgroups) para administrar recursos. c. Espacios de nombres para aislar procesos. d. Sistema operativo completo para compatibilidad con el host de contenedores. e. SELinux y Seccomp para la seguridad. RH134-RHEL8.2-es-1-20200928 379 capítulo 13 | Ejecución de contenedores Ejecución de un contenedor básico Objetivos Tras completar esta sección, deberá ser capaz de instalar las herramientas de administración de contenedores y ejecutar un contenedor rootless simple. Instalación de herramientas de administración de contenedores Para comenzar a ejecutar y gestionar contenedores en su sistema, debe instalar las herramientas de la línea de comandos necesarias. Instala el módulo container-tools con el comando yum. [root@host ~]# yum module install container-tools El módulo container-tools incluye paquetes de software que instalan varias herramientas. Las herramientas usadas en este capítulo son podman y skopeo. nota De manera predeterminada, el sistema instala las herramientas de flujo rápido, container-tools:rhel8 que se basan en la versión de la versión anterior estable de las herramientas del contenedor cada tres meses. Las secuencias estables alternativas que se bloquean en una versión específica de las herramientas no obtienen actualizaciones de características. Red Hat tiene previsto lanzar nuevos flujos estables una vez al año con soporte durante dos años. Selección de imágenes de contenedores y registros Un registro de contenedor es un repositorio para almacenar y recuperar imágenes de contenedores. Un desarrollador carga o envía las imágenes de contenedores a un registro de contenedores. Puede descargar, o extraer, esas imágenes de contenedores del registro a un sistema local, de modo que pueda usarlas para ejecutar contenedores. Puede usar un registro público que contenga imágenes de terceros o puede usar un registro privado controlado por su organización. El origen de las imágenes de contenedores es importante. Al igual que cualquier otro paquete de software, debe saber si puede confiar en el código de la imagen de contenedor. Los diferentes registros tienen diferentes políticas sobre si proporcionan, evalúan y prueban las imágenes de contenedores que se les envían, y cómo lo hacen. Red Hat distribuye las imágenes de contenedores certificadas a través de dos registros de contenedores principales a los que puede acceder con sus credenciales de inicio de sesión de Red Hat. • registry.redhat.io para contenedores basados en productos oficiales de Red Hat. • registry.connect.redhat.com para contenedores basados en productos de terceros. 380 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores Red Hat está eliminando gradualmente un registro más antiguo, registry.access.redhat.com. Red Hat Container Catalog (https://access.redhat.com/containers) proporciona una interfaz basada en la Web que puede usar para buscar contenido certificado en estos registros. nota En el aula se ejecuta un registro privado basado en Red Hat Quay para proporcionar imágenes de contenedores. Consulte https://access.redhat.com/products/red-hatquay para obtener más información sobre este software. Convenciones de nombres de contenedores Los nombres de las imágenes de contenedores se asignan según la siguiente sintaxis nombre de imagen completamente calificado: registry_name/user_name/image_name:tag • registry_name es el nombre del registro que almacena la imagen. Por lo general, es el nombre de dominio completamente calificado del registro. • user_name representa el usuario o la organización a la que pertenece la imagen. • image_name debe ser único en el espacio de nombres del usuario. • tag identifica la versión de la imagen. Si el nombre de la imagen no incluye etiqueta de imagen, se supone que es latest. Ejecución de contenedores Para ejecutar un contenedor en su sistema local, primero debe extraer una imagen de contenedor. Use Podman para extraer una imagen de un registro. Debe usar siempre el nombre de la imagen completamente calificado cuando descarga imágenes. El comando podman pull extrae la imagen que usted especifica del registro y la guarda localmente: [user@host ~]$ podman pull registry.access.redhat.com/ubi8/ubi:latest Trying to pull registry.access.redhat.com/ubi8/ubi:latest...Getting image source signatures Copying blob 77c58f19bd6e: 70.54 MiB / 70.54 MiB [=========================] 10s Copying blob 47db82df7f3f: 1.68 KiB / 1.68 KiB [===========================] 10s Copying config a1f8c9699786: 4.26 KiB / 4.26 KiB [==========================] 0s Writing manifest to image destination Storing signatures a1f8c969978652a6d1b2dfb265ae0c6c346da69000160cd3ecd5f619e26fa9f3 Después de descargarla, Podman almacena las imágenes localmente y se las puede listar con el comando podman images: [user@host ~]$ podman images REPOSITORY registry.access.redhat.com/ubi8/ubi TAG latest IMAGE ID a1f8c9699786 CREATED 5 weeks ago SIZE 211 MB En la salida anterior, se muestra que la etiqueta de la imagen es latest y que el ID de la imagen es a1f8c96699786. RH134-RHEL8.2-es-1-20200928 381 capítulo 13 | Ejecución de contenedores Para ejecutar un contenedor a partir de esta imagen, use el comando podman run. Cuando ejecuta un comando podman run, crea e inicia un nuevo contenedor a partir de una imagen de contenedor. Use las opciones -it para interactuar con el contenedor, si es necesario. Las opciones -it asignan un terminal al contenedor y le permiten enviar pulsaciones de teclas a este. [user@host ~]$ podman run -it registry.access.redhat.com/ubi8/ubi:latest [root@8b032455db1a /]# Importante Si ejecuta un contenedor con el nombre de la imagen completamente calificado, pero la imagen aún no está almacenada localmente, el comando podman run primero extrae la imagen del registro y, luego, se ejecuta. nota Muchas opciones de Podman también tienen una forma larga alternativa; algunas de estas se explican a continuación. • -t es equivalente a --tty, lo que significa que se debe asignar pseudo-tty (pseudoterminal) para el contenedor. • -i es lo mismo que --interactive. Cuando se usa esta opción, el contenedor acepta la entrada estándar. • -d, o su forma larga --detach, significa que el contenedor se ejecuta en segundo plano (independiente). Cuando se usa esta opción, Podman ejecuta el contenedor en segundo plano y muestra su ID de contenedor generado. Consulte la página del manual podman-run(1) para ver la lista completa de indicadores. Cuando se hace referencia a un contenedor, Podman reconoce el nombre del contenedor o el ID del contenedor generado. Use la opción --name para establecer el nombre del contenedor al ejecutar el contenedor con Podman. Los nombres de los contenedores deben ser únicos. Si el comando podman run no incluye ningún nombre de contenedor, Podman genera un nombre aleatorio único. En el siguiente ejemplo, se asigna un nombre al contenedor, se inicia un terminal de Bash de forma explícita dentro del contenedor y se ejecuta un comando en él de forma interactiva: nota Tenga en cuenta que la etiqueta latest se supone cuando no se especifica ninguna etiqueta explícitamente. El comando en el siguiente ejemplo se ingresa en una sola línea. [user@host ~]$ podman run -it --name=rhel8 registry.access.redhat.com/ubi8/ ubi /bin/bash [root@c20631116955 /]# cat /etc/os-release NAME="Red Hat Enterprise Linux" 382 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores VERSION="8.2 (Ootpa)" ID="rhel" ID_LIKE="fedora" VERSION_ID="8.2" PLATFORM_ID="platform:el8" PRETTY_NAME="Red Hat Enterprise Linux 8.2 (Ootpa)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:redhat:enterprise_linux:8.2:GA" HOME_URL="https://www.redhat.com/" BUG_REPORT_URL="https://bugzilla.redhat.com/" REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 8" REDHAT_BUGZILLA_PRODUCT_VERSION=8.2 REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux" REDHAT_SUPPORT_PRODUCT_VERSION="8.2" [root@c20631116955 /]# exit exit [user@host ~]$ También puede ejecutar un comando rápido en un contenedor sin interactuar con él y, luego, eliminar el contenedor una vez que se haya completado el comando. Para ello, use podman run --rm seguido de la imagen de contenedor y un comando. [user@host ~]$ podman run --rm registry.access.redhat.com/ubi8/ubi cat /etc/osrelease NAME="Red Hat Enterprise Linux" VERSION="8.2 (Ootpa)" ID="rhel" ID_LIKE="fedora" VERSION_ID="8.2" PLATFORM_ID="platform:el8" PRETTY_NAME="Red Hat Enterprise Linux 8.2 (Ootpa)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:redhat:enterprise_linux:8.2:GA" HOME_URL="https://www.redhat.com/" BUG_REPORT_URL="https://bugzilla.redhat.com/" REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 8" REDHAT_BUGZILLA_PRODUCT_VERSION=8.2 REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux" REDHAT_SUPPORT_PRODUCT_VERSION="8.2" [user@host ~]$ Análisis del aislamiento de contenedores Los contenedores proporcionan aislamiento del tiempo de ejecución de los recursos. Los contenedores usan espacios de nombres de Linux para proporcionar entornos independientes y aislados para recursos, como procesos, comunicaciones de red y volúmenes. Los procesos que se ejecutan dentro de un contenedor se aíslan de todos los otros procesos en la máquina del host. Vea los procesos que se ejecutan dentro del contenedor: RH134-RHEL8.2-es-1-20200928 383 capítulo 13 | Ejecución de contenedores [user@host ~]$ podman run -it registry.access.redhat.com/ubi7/ubi /bin/bash [root@ef2550ed815d /]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 4.5 0.1 11840 2904 pts/0 Ss 22:10 0:00 /bin/bash root 15 0.0 0.1 51768 3388 pts/0 R+ 22:10 0:00 ps aux Tenga en cuenta que el nombre de usuario y el ID dentro del contenedor son diferentes del nombre de usuario y el ID en la máquina del host: [root@ef2550ed815d /]# id uid=0(root) gid=0(root) groups=0(root) [root@ef2550ed815d /]# exit exit [user@host ~]$ id uid=1000(user) gid=1000(user) groups=1000(user),10(wheel) Referencias Páginas del manual podman-pull(1), podman-images(1) y podman-run(1). Para obtener más información, consulte el capítulo Comenzar con contenedores en la Guía de creación, ejecución y administración de contenedores de Red Hat Enterprise Linux 8 en https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/ html-single/building_running_and_managing_containers/index#starting-withcontainers_building-running-and-managing-containers 384 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores Ejercicio Guiado Ejecución de un contenedor básico En este ejercicio, instalará herramientas de contenedores y las probará mediante la ejecución de un contenedor rootless simple. Resultados Deberá ser capaz de instalar herramientas de administración de contenedores y usarlas para ejecutar un contenedor. Andes De Comenzar En la máquina workstation, inicie sesión con el usuario student con la contraseña student. En la máquina workstation, ejecute el comando lab containers-basic start. Este comando ejecuta un script de inicio para determinar si la máquina servera es accesible en la red. Además, verifica y configura el registro de contenedores y garantiza que la imagen de contenedor usada para este ejercicio esté almacenada allí. [student@workstation ~]$ lab containers-basic start Instrucciones 1. Use el comando ssh para iniciar sesión en servera como el usuario student. Los sistemas se configuran a fin de que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Instale el módulo de Yum container-tools con el comando yum. [student@servera ~]$ sudo yum module install container-tools [sudo] password for student: student ...output omitted... Is this ok [y/N]: y ...output omitted... Complete! 3. Inicie sesión en el registro de contenedores con el comando podman login. RH134-RHEL8.2-es-1-20200928 385 capítulo 13 | Ejecución de contenedores [student@servera ~]$ podman login registry.lab.example.com Username: admin Password: redhat321 Login Succeeded! 4. Extraiga una imagen de contenedor del registro con el nombre completamente calificado con el comando podman pull. [student@servera ~]$ podman pull registry.lab.example.com/rhel8/httpd-24:latest Trying to pull registry.lab.example.com/rhel8/httpd-24:latest... Getting image source signatures Copying blob 77c58f19bd6e done Copying blob 47db82df7f3f done Copying blob 9d20433efa0c done Copying blob 71391dc11a78 done Copying config 7e93f25a94 done Writing manifest to image destination Storing signatures 7e93f25a946892c9c175b74a0915c96469e3b4845a6da9f214fd3ec19c3d7070 5. Ejecute un contenedor a partir la imagen, conéctelo al terminal, asígnele un nombre y luego, inicie una shell de bash interactiva con el comando podman run. Se supone la etiqueta latest, ya que no se especifica ninguna etiqueta: El siguiente comando podman run es muy extenso y debe ingresarse como una sola línea. [student@servera ~]$ podman run --name myweb -it registry.lab.example.com/rhel8/ httpd-24 /bin/bash bash-4.4$ 6. Enumere los procesos en ejecución dentro del contenedor. Solo verá aquellos procesos que se ejecutan en el contenedor. No verá ningún otro proceso que se esté ejecutando en el servidor. bash-4.4$ ps aux USER PID %CPU %MEM default 1 6.6 0.1 default 6 0.0 0.1 7. VSZ 12020 44596 RSS TTY 3120 pts/0 3296 pts/0 STAT START Ss 21:52 R+ 21:52 TIME COMMAND 0:00 /bin/bash 0:00 ps aux Visualice el nombre de usuario y el ID actuales dentro del contenedor. bash-4.4$ id uid=1001(default) gid=0(root) groups=0(root) 8. Salga de la shell del contenedor. bash-4.4$ exit exit 386 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores 9. Ejecute el comando httpd -v en un contenedor, con la imagen de contenedor rhel8/ httpd-24 y elimine el contenedor cuando salga el comando: El siguiente comando podman run es muy extenso y debe ingresarse como una sola línea. [student@servera ~]$ podman run --rm registry.lab.example.com/rhel8/httpd-24 httpd -v Server version: Apache/2.4.37 (Red Hat Enterprise Linux) Server built: Dec 2 2019 14:15:24 10. Salga de servera. [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En la máquina workstation, ejecute el script lab containers-basic finish para terminar este ejercicio. [student@workstation ~]$ lab containers-basic finish Esto concluye el ejercicio guiado. RH134-RHEL8.2-es-1-20200928 387 capítulo 13 | Ejecución de contenedores Búsqueda y administración de imágenes de contenedores Objetivos Tras completar esta sección, deberá ser capaz de buscar, recuperar, inspeccionar y administrar imágenes de contenedores obtenidas de un registro de contenedores remoto y almacenadas en su servidor. Configuración de registros de contenedores Podman usa un archivo registries.conf en su sistema host para obtener información acerca de los registros de contenedores que puede usar. [user@host ~]$ cat /etc/containers/registries.conf # This is a system-wide configuration file used to # keep track of registries for various container backends. # It adheres to TOML format and does not support recursive # lists of registries. # The default location for this configuration file is /etc/containers/ registries.conf. # The only valid categories are: 'registries.search', 'registries.insecure', # and 'registries.block'. [registries.search] registries = ['registry.redhat.io', 'quay.io', 'docker.io'] # If you need to access insecure registries, add the registry's fully-qualified name. # An insecure registry is one that does not have a valid SSL certificate or only does HTTP. [registries.insecure] registries = [] # If you need to block pull access from a registry, uncomment the section below # and add the registries fully-qualified name. # [registries.block] registries = [] Importante Para un usuario normal (rootless) de Podman, este archivo se almacena en el directorio $HOME/.config/containers. Los valores de configuración en este archivo reemplazan la configuración de todo el sistema en el archivo /etc/ containers/registries.conf. 388 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores La lista de registros en los que Podman puede buscar se configura en la sección [registries.search] de este archivo. Si no especifica una imagen completamente calificada en la línea de comandos, Podman buscará en esta sección en el orden detallado para determinar cómo formar una ruta de imagen completa. El comando podman info muestra la información de configuración para Podman, incluidos sus registros configurados. [user@host ~]$ podman info ...output omitted... insecure registries: registries: [] registries: registries: - registry.redhat.io - quay.io - docker.io ...output omitted... Seguridad de registros Los registros no seguros se enumeran en la sección [registries.insecure] del archivo registries.conf. Si un registro se detalla como no seguro, las conexiones a ese registro no están protegidas con cifrado TLS. Si un registro admite búsqueda y no es seguro, puede mostrarse en [registries.search] y en [registries.insecure]. Los registros de contenedores también se pueden configurar para requerir autenticación. Como se analizó anteriormente, usa el comando podman login para iniciar sesión en un registro de contenedores que requiere autenticación. Búsqueda de imágenes de contenedores Use el comando podman search para buscar registros de contenedores para una imagen de contenedor específica. En el siguiente ejemplo, se muestra cómo buscar en el registro de contenedores registry.redhat.io todas las imágenes que incluyen el nombre rhel8: [user@host ~]$ podman search registry.redhat.io/rhel8 INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED redhat.io registry.redhat.io/openj9/openj9-8-rhel8 OpenJ9 1.8 OpenShift S2I image for Java Appl... 0 redhat.io registry.redhat.io/openjdk/openjdk-8-rhel8 OpenJDK 1.8 Image for Java Applications base... 0 redhat.io registry.redhat.io/openj9/openj9-11-rhel8 OpenJ9 11 OpenShift S2I image for Java Appli... 0 redhat.io registry.redhat.io/openjdk/openjdk-11-rhel8 OpenJDK S2I image for Java Applications on U... 0 redhat.io registry.redhat.io/rhel8/memcached Free and open source, high-performance, dist... 0 redhat.io registry.redhat.io/rhel8/llvm-toolset The LLVM back-end compiler and core librarie... 0 RH134-RHEL8.2-es-1-20200928 389 capítulo 13 | Ejecución de contenedores redhat.io registry.redhat.io/rhel8/rust-toolset a build system and ... 0 redhat.io registry.redhat.io/rhel8/go-toolset will replace the curre... 0 ...output omitted... Rust and Cargo, which is Golang compiler which Ejecute el mismo comando con la opción --no-trunc para ver descripciones de imágenes más largas: [user@host ~]$ podman search --no-trunc registry.access.redhat.com/rhel8 INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED ...output omitted... redhat.io registry.redhat.io/rhel8/nodejs-10 Node.js 10 available as container is a base platform for building and running various Node.js 10 applications and frameworks. Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. 0 redhat.io registry.redhat.io/rhel8/python-36 Python 3.6 available as container is a base platform for building and running various Python 3.6 applications and frameworks. Python is an easy to learn, powerful programming language. It has efficient high-level data structures and a simple but effective approach to object-oriented programming. 0 redhat.io registry.redhat.io/rhel8/perl-526 Perl 5.26 available as container is a base platform for building and running various Perl 5.26 applications and frameworks. Perl is a high-level programming language with roots in C, sed, awk and shell scripting. Perl is good at handling processes and files, and is especially good at handling text. 0 ...output omitted... En la siguiente tabla, se muestran algunas otras opciones útiles para el comando podman search: Opciones de búsqueda de Podman útiles Opción Descripción --limit <number> Limita el número de imágenes enumeradas por registro. 390 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores Opción Descripción --filter <filter=value> Filtra la salida en función de las condiciones proporcionadas. Estos son los filtros soportados: • stars=<number>: mostrar solo imágenes con al menos esta cantidad de estrellas. • is-automated=<true|false>: mostrar solo las imágenes creadas automáticamente. • is-official=<true|false>: mostrar solo las imágenes marcadas como oficiales. --tls-verify <true|false> Habilita o deshabilita la validación de certificados HTTPS para todos los registros usados. Valor predeterminado=true Uso de Red Hat Container Catalog Red Hat mantiene repositorios que contienen imágenes de contenedores certificadas. Puede acceder a una interfaz web para buscarlos en https://access.redhat.com/containers. El uso de este repositorio proporciona a los clientes una capa de protección y confiabilidad contra vulnerabilidades conocidas que podrían generarse por imágenes no sometidas a pruebas. El comando estándar podman es compatible con los repositorios a los que hace referencia Red Hat Container Catalog. Inspección de imágenes de contenedores Puede ver información acerca de una imagen antes de descargarla en su sistema. El comando skopeo inspect puede inspeccionar una imagen de contenedor remota en un registro y mostrar información sobre ella. En el siguiente ejemplo, se inspecciona una imagen de contenedor y se devuelve información de la imagen sin extraer la imagen al sistema local: nota El comando skopeo inspect puede inspeccionar diferentes formatos de imagen de diferentes fuentes, como registros remotos o directorios locales. El mecanismo de transporte docker:// le indica a skopeo que consulte un registro de imágenes de contenedores. [user@host ~]$ skopeo inspect docker://registry.redhat.io/rhel8/python-36 ...output omitted... "name": "ubi8/python-36", "release": "107", "summary": "Platform for building and running Python 3.6 applications", ...output omitted... RH134-RHEL8.2-es-1-20200928 391 capítulo 13 | Ejecución de contenedores También puede inspeccionar información de imágenes almacenadas localmente mediante el comando podman inspect. Es posible que este comando proporcione más información que el comando skopeo inspect. Enumerar imágenes almacenadas localmente: [user@host ~]$ podman images REPOSITORY quay.io/generic/rhel7 registry.redhat.io/rhel8/python-36 registry.redhat.io/ubi8/ubi TAG latest latest latest IMAGE ID 1d3b6b7d01e4 e55cd9a2e0ca a1f8c9699786 CREATED 3 weeks ago 6 weeks ago 6 weeks ago SIZE 688 MB 811 MB 211 MB Inspeccionar una imagen almacenada localmente y devolver información: [user@host ~]$ podman inspect registry.redhat.io/rhel8/python-36 ...output omitted... "Config": { "User": "1001", "ExposedPorts": { "8080/tcp": {} ...output omitted... "name": "ubi8/python-36", "release": "107", "summary": "Platform for building and running Python 3.6 applications", ...output omitted... Eliminación de imágenes de contenedores locales Las imágenes de contenedores son inmutables; no cambian. Esto significa que las imágenes antiguas no se actualizan, de modo que la actualización del software en un contenedor requiere una nueva imagen que reemplace la anterior. Cuando una imagen actualizada está disponible, el publicador cambia la etiqueta latest para asociarla con la nueva imagen. Aún puede acceder a una imagen anterior si hace referencia a su etiqueta de versión específica y puede ejecutar contenedores a partir de ella. También puede eliminar la imagen anterior, extraer la imagen más reciente y usar solo la imagen más reciente (actualizada) para ejecutar contenedores. Por ejemplo, las imágenes proporcionadas por Red Hat se benefician de la larga experiencia de Red Hat en la administración de vulnerabilidades de seguridad y defectos en Red Hat Enterprise Linux y otros productos. El equipo de seguridad de Red Hat refuerza y controla estas imágenes de alta calidad. Se reconstruyen cuando se descubren nuevas vulnerabilidades y pasan por un proceso de control de calidad. Para eliminar una imagen almacenada localmente, use el comando podman rmi. Enumerar imágenes almacenadas localmente: [user@host ~]$ podman images REPOSITORY quay.io/generic/rhel7 registry.redhat.io/rhel8/python-36 registry.redhat.io/ubi8/ubi 392 TAG latest latest latest IMAGE ID 1d3b6b7d01e4 e55cd9a2e0ca a1f8c9699786 CREATED 3 weeks ago 6 weeks ago 6 weeks ago SIZE 688 MB 811 MB 211 MB RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores Elimine la imagen registry.redhat.io/rhel8/python-36:latest. [user@host ~]$ podman rmi registry.redhat.io/rhel8/python-36:latest e55cd9a2e0ca5f0f4e0249404d1abe3a69d4c6ffa5103d0512dd4263374063ad [user@host ~]$ Enumerar las imágenes almacenadas localmente y verificar que se hayan eliminado: [user@host ~]$ podman images REPOSITORY quay.io/generic/rhel7 registry.redhat.io/ubi8/ubi TAG latest latest IMAGE ID 1d3b6b7d01e4 a1f8c9699786 CREATED 3 weeks ago 6 weeks ago SIZE 688 MB 211 MB Referencias Páginas del manual podman-search(1), podman-inspect(1) y skopeo(1). Para obtener más información, consulte el capítulo Trabajo con imágenes de contenedores en la Guía de creación, ejecución y administración de contenedores de Red Hat Enterprise Linux 8 en https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/htmlsingle/building_running_and_managing_containers/index#working-with-containerimages_building-running-and-managing-containers RH134-RHEL8.2-es-1-20200928 393 capítulo 13 | Ejecución de contenedores Ejercicio Guiado Búsqueda y administración de imágenes de contenedores En este ejercicio, usará podman para recuperar, administrar y eliminar imágenes de contenedores en su servidor. Resultados Deberá ser capaz de buscar, recuperar, inspeccionar y eliminar imágenes de contenedores obtenidas de un registro de contenedores remoto y almacenadas en su servidor. Andes De Comenzar En la máquina workstation, ejecute el comando lab containers-managing start. Este comando ejecuta un script de inicio para determinar si la máquina servera es accesible en la red. Además, verifica y configura el registro de contenedores y garantiza que la imagen de contenedor usada para este ejercicio esté almacenada allí. [student@workstation ~]$ lab containers-managing start Instrucciones 1. Use el comando ssh para iniciar sesión en servera como el usuario student. Los sistemas se configuran a fin de que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Muestre el archivo de configuración del registro de contenedores y visualice los registros configurados. [student@servera ~]$ cat /home/student/.config/containers/registries.conf unqualified-search-registries = ['registry.lab.example.com'] [[registry]] location = "registry.lab.example.com" insecure = true blocked = false 3. 394 Busque en el registro imágenes con un nombre que comience con "ubi" mediante el comando podman search. RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores [student@servera ~]$ podman search registry.lab.example.com/ubi INDEX NAME DESCRIPTION STARS example.com registry.lab.example.com/ubi7/ubi 0 example.com registry.lab.example.com/ubi8/ubi 0 OFFICIAL 4. Inicie sesión en el registro de contenedores con el comando podman login. [student@servera ~]$ podman login registry.lab.example.com Username: admin Password: redhat321 Login Succeeded! 5. Use el comando skopeo inspect para ver información sobre una imagen en el registro antes de descargarla. El siguiente comando skopeo inspect es muy extenso y debe ingresarse como una sola línea. [student@servera ~]$ skopeo inspect docker://registry.lab.example.com/rhel8/ httpd-24 ...output omitted... "Config": { "User": "1001", "ExposedPorts": { "8080/tcp": {}, "8443/tcp": {} }, "Env": [ "PATH=/opt/app-root/src/bin:/opt/app-root/bin:/usr/local/sbin:/ usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "container=oci", "SUMMARY=Platform for running Apache httpd 2.4 or building httpdbased application", "DESCRIPTION=Apache httpd 2.4 available as container, is a powerful, efficient, and extensible web server. Apache supports a variety of features, many implemented as compiled modules which extend the core functionality. These can range from server-side programming language support to authentication schemes. Virtual hosting allows one Apache installation to serve many different Web sites.", "STI_SCRIPTS_URL=image:///usr/libexec/s2i", "STI_SCRIPTS_PATH=/usr/libexec/s2i", "APP_ROOT=/opt/app-root", "HOME=/opt/app-root/src", "PLATFORM=el8", "HTTPD_VERSION=2.4", "HTTPD_CONTAINER_SCRIPTS_PATH=/usr/share/container-scripts/ httpd/", "HTTPD_APP_ROOT=/opt/app-root", "HTTPD_CONFIGURATION_PATH=/opt/app-root/etc/httpd.d", "HTTPD_MAIN_CONF_PATH=/etc/httpd/conf", "HTTPD_MAIN_CONF_MODULES_D_PATH=/etc/httpd/conf.modules.d", "HTTPD_MAIN_CONF_D_PATH=/etc/httpd/conf.d", RH134-RHEL8.2-es-1-20200928 395 capítulo 13 | Ejecución de contenedores "HTTPD_TLS_CERT_PATH=/etc/httpd/tls", "HTTPD_VAR_RUN=/var/run/httpd", "HTTPD_DATA_PATH=/var/www", "HTTPD_DATA_ORIG_PATH=/var/www", "HTTPD_LOG_PATH=/var/log/httpd" ], "Entrypoint": [ "container-entrypoint" ], "Cmd": [ "/usr/bin/run-httpd" ], "WorkingDir": "/opt/app-root/src", ...output omitted... 6. Extraiga una imagen de contenedor del registro con el comando podman pull. [student@servera ~]$ podman pull registry.lab.example.com/rhel8/httpd-24 Trying to pull registry.lab.example.com/rhel8/httpd-24... Getting image source signatures Copying blob 77c58f19bd6e done Copying blob 47db82df7f3f done Copying blob 9d20433efa0c done Copying blob 71391dc11a78 done Copying config 7e93f25a94 done Writing manifest to image destination Storing signatures 7e93f25a946892c9c175b74a0915c96469e3b4845a6da9f214fd3ec19c3d7070 7. Use el comando podman images para ver imágenes almacenadas localmente. [student@servera ~]$ podman images REPOSITORY TAG registry.lab.example.com/rhel8/httpd-24 latest IMAGE ID 7e93f25a9468 CREATED 4 weeks ago SIZE 430 MB 8. Use el comando podman inspect para ver información acerca de una imagen almacenada localmente. [student@servera ~]$ podman inspect registry.lab.example.com/rhel8/httpd-24 ...output omitted... "Config": { "User": "1001", "ExposedPorts": { "8080/tcp": {}, "8443/tcp": {} }, "Env": [ "PATH=/opt/app-root/src/bin:/opt/app-root/bin:/usr/local/sbin:/ usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "container=oci", "SUMMARY=Platform for running Apache httpd 2.4 or building httpdbased application", 396 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores "DESCRIPTION=Apache httpd 2.4 available as container, is a powerful, efficient, and extensible web server. Apache supports a variety of features, many implemented as compiled modules which extend the core functionality. These can range from server-side programming language support to authentication schemes. Virtual hosting allows one Apache installation to serve many different Web sites.", "STI_SCRIPTS_URL=image:///usr/libexec/s2i", "STI_SCRIPTS_PATH=/usr/libexec/s2i", "APP_ROOT=/opt/app-root", "HOME=/opt/app-root/src", "PLATFORM=el8", "HTTPD_VERSION=2.4", "HTTPD_CONTAINER_SCRIPTS_PATH=/usr/share/container-scripts/ httpd/", "HTTPD_APP_ROOT=/opt/app-root", "HTTPD_CONFIGURATION_PATH=/opt/app-root/etc/httpd.d", "HTTPD_MAIN_CONF_PATH=/etc/httpd/conf", "HTTPD_MAIN_CONF_MODULES_D_PATH=/etc/httpd/conf.modules.d", "HTTPD_MAIN_CONF_D_PATH=/etc/httpd/conf.d", "HTTPD_TLS_CERT_PATH=/etc/httpd/tls", "HTTPD_VAR_RUN=/var/run/httpd", "HTTPD_DATA_PATH=/var/www", "HTTPD_DATA_ORIG_PATH=/var/www", "HTTPD_LOG_PATH=/var/log/httpd" ], "Entrypoint": [ "container-entrypoint" ], "Cmd": [ "/usr/bin/run-httpd" ], "WorkingDir": "/opt/app-root/src", ...output omitted... 9. Elimine una imagen almacenada localmente con el comando podman rmi. [student@servera ~]$ podman rmi registry.lab.example.com/rhel8/httpd-24 Untagged: registry.lab.example.com/rhel8/httpd-24:latest Deleted: 7e93...7070 10. Ejecute el comando podman images para verificar que se elimine la imagen almacenada localmente. [student@servera ~]$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE 11. Salga de servera. [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ RH134-RHEL8.2-es-1-20200928 397 capítulo 13 | Ejecución de contenedores Finalizar En la máquina workstation, ejecute el script lab containers-managing finish para terminar este ejercicio. [student@workstation ~]$ lab containers-managing finish Esto concluye el ejercicio guiado. 398 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores Realización de una administración avanzada de contenedores Objetivos Tras completar esta sección, deberá ser capaz de ejecutar contenedores con opciones avanzadas, enumerar los contenedores que se ejecutan en el sistema e iniciar, detener y finalizar contenedores. Administración de contenedores con Podman Puede usar Podman para ejecutar contenedores con opciones de configuración más avanzadas y administrar contenedores en ejecución o detenidos. En esta sección, aprenderá a usar Podman para administrar contenedores durante su ciclo de vida. Configuración de contenedores Usó el comando podman run para iniciar contenedores a partir de imágenes de contenedores en otro ejercicio. Cuando ejecuta un contenedor, inicia un proceso dentro del nuevo contenedor. El proceso podría ser una aplicación, como un servidor web o de base de datos. Es posible que esta aplicación necesite comunicarse con otros sistemas a través de la red y, por lo tanto, puede necesitar configuración. Para proporcionar acceso de red al contenedor, los clientes deben conectarse a los puertos en el host de contenedores que pasan el tráfico de red a través de los puertos en el contenedor. Para configurar el contenedor, a menudo puede pasar al contenedor algunas variables de entorno con parámetros personalizados en lugar de modificar la imagen de contenedor. Mapeo de puertos de hosts de contenedores al contenedor Cuando mapea un puerto de red en el host de contenedores a un puerto en el contenedor, el contenedor recibe el tráfico de red enviado al puerto de red del host. Por ejemplo, puede mapear el puerto 8000 en el host del contenedor al puerto 8080 en el contenedor. Es posible que el contenedor esté ejecutando un proceso httpd que escucha en el puerto 8080. Por lo tanto, el tráfico enviado al puerto del host de contenedores 8000 sería recibido por el servidor web que se ejecuta en el contenedor. Configure un mapeo de puertos con podman run mediante el uso de la opción -p. Toma dos números de puerto separados por dos puntos, el puerto en el host de contenedores, seguido por el puerto en el contenedor. En el siguiente ejemplo, se usa la opción -d para ejecutar el contenedor en modo independiente (como un daemon). Cuando se usa la opción -d, podman devuelve solo el ID de contenedor a la pantalla. La opción -p 8000:8080 mapea el puerto 8000 en el host de contenedores al puerto 8080 en el contenedor. La imagen de contenedor registry.redhat.io/rhel8/httpd-24 ejecuta un servidor HTTP Apache que escucha las conexiones en el puerto 8080. [user@host ~]$ podman run -d -p 8000:8080 registry.redhat.io/rhel8/httpd-24 4a24ee199b909cc7900f2cd73c07e6fce9bd3f53b14e6757e91368c561a8edf4 [user@host ~]$ RH134-RHEL8.2-es-1-20200928 399 capítulo 13 | Ejecución de contenedores Puede usar el comando podman port con un nombre o ID de contenedor para enumerar sus mapeos de puertos, o la opción -a para enumerar todos los mapeos de puertos en uso. En el siguiente ejemplo, se enumeran todos los mapeos de puertos definidos en el host de contenedores, y, en la salida, se muestra que el puerto 8000 en el host de contenedores se mapea al puerto 8080/tcp en el contenedor que tiene el ID que comienza con 4a24ee199b90. [user@host ~]$ podman port -a 4a24ee199b90 8080/tcp -> 0.0.0.0:8000 También debe asegurarse de que el firewall en su host de contenedores permita que los clientes externos se conecten a su puerto mapeado. En el ejemplo anterior, es posible que también deba agregar el puerto 8000/tcp a las reglas de firewall actuales en el host de contenedores: [root@host ~]# firewall-cmd --add-port=8000/tcp success Importante Un contenedor rootless no puede abrir un puerto en el host de contenedores inferior a 1024 (un "puerto privilegiado"). Es decir, -p 80:8080 no funcionará normalmente para un contenedor que sea ejecutado por un usuario que no sea root. Esta es una restricción para los usuarios que no sean root en un sistema Linux. Para mapear un puerto en el host de contenedores inferior a 1024 a un puerto de contenedores, debe ejecutar podman como usuario root o realizar otros ajustes en el sistema. Puede mapear un puerto superior a 1024 en el host de contenedores a un puerto con privilegios en el contenedor, incluso si está ejecutando un contenedor rootless. El mapeo de -p 8080:80 funciona si el contenedor proporciona un servicio que escucha en el puerto 80. Paso de variables de entorno para configurar un contenedor La configuración de un contenedor puede ser compleja porque, por lo general, no se desea modificar la imagen de contenedor para la configuración. Sin embargo, puede pasar variables de entorno al contenedor y el contenedor puede usar los valores de estas variables de entorno para configurar su aplicación. Para obtener información sobre las variables que están disponibles y sus funciones, use el comando podman inspect para inspeccionar la imagen de contenedor. Por ejemplo, esta es una imagen de contenedor de uno de los registros de Red Hat: [user@host ~]$ podman inspect registry.redhat.io/rhel8/mariadb-103:1-102 [ { ...output omitted... "Labels": { ...output omitted... "name": "rhel8/mariadb-103", "release": "102", "summary": "MariaDB 10.3 SQL database server", "url": "https://access.redhat.com/containers/#/registry.access.redhat.com/ rhel8/mariadb-103/images/1-102", 400 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores "usage": "podman run -d -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -p 3306:3306 rhel8/mariadb-103", "vcs-ref": "ab3c3f15b6180b967a312c93e82743e842a4ac7c", "vcs-type": "git", "vendor": "Red Hat, Inc.", "version": "1" }, ...output omitted... La etiqueta url apunta a una página web en Red Hat Container Catalog que documenta las variables de entorno y otra información acerca de cómo usar la imagen de contenedor. La etiqueta usage (uso) proporciona un ejemplo de un comando podman típico para ejecutar la imagen. En la página provista en los documentos de etiquetas url para esta imagen, se muestra que el contenedor usa el puerto 3306 para el servidor de la base de datos y que las siguientes variables de entorno están disponibles para configurar el servicio de base de datos: MYSQL_USER Nombre de usuario para la cuenta MySQL que se creará MYSQL_PASSWORD Contraseña para la cuenta de usuario MYSQL_DATABASE Nombre de la base de datos MYSQL_ROOT_PASSWORD Contraseña para el usuario root (opcional) Use el comando podman run con la opción -e para pasar variables de entorno a un proceso dentro del contenedor. En el siguiente ejemplo, el entorno y las opciones de puerto aplican los parámetros de configuración al contenedor. [user@host ~]$ podman run -d --name container_name -e MYSQL_USER=user_name -e MYSQL_PASSWORD=user_password -e MYSQL_DATABASE=database_name -e MYSQL_ROOT_PASSWORD=mysql_root_password -p 3306:3306 registry.redhat.io/rhel8/mariadb-103:1-102 abcb42ef2ff1b85a50e3cd9bc15877ef823979c8166d0076ce5ebc5ea19c0815 La opción --name asigna un nombre de su elección al contenedor, lo que facilita la identificación de un contenedor específico. Si no asigna un nombre a su contenedor, podman asignará un nombre seleccionado de forma aleatoria. Administración de contenedores Crear e iniciar un contenedor es solo el primer paso del ciclo de vida del contenedor. Este ciclo de vida también incluye detener, reiniciar o eliminar el contenedor. Los usuarios también pueden examinar el estado y los metadatos del contenedor para fines de depuración, actualización o informes. El comando podman ps muestra los contenedores que se están ejecutando: RH134-RHEL8.2-es-1-20200928 401 capítulo 13 | Ejecución de contenedores [user@host ~]$ podman ps CONTAINER ID IMAGE 89dd9b6354ba registry.redhat.io/rhel8/mariadb-103:1-102 COMMAND run-mysqld CREATED 10 minutes ago NAMES my-database STATUS Up 10 seconds PORTS 0.0.0.0:3306->3306/tcp A cada contenedor, cuando se crea, se le asigna un ID de contenedor hexadecimal único. El ID del contenedor no está relacionado con el ID de la imagen. La imagen de contenedor que se usó para iniciar el contenedor. El comando que se ejecutó cuando se inició el contenedor. La fecha y la hora en que se inició. Tiempo de actividad total del contenedor, si aún se está ejecutando, o tiempo desde que se finalizó. Los puertos que expuso el contenedor o los reenvíos de puertos, si se configuraron. Nombre del contenedor. De forma predeterminada, Podman no descarta los contenedores detenidos de inmediato. Podman conserva los sistemas de archivos locales y otros estados para facilitar el análisis post mortem, a menos que reinicie el contenedor. Si inicia un contenedor con la opción --rm con podman run, el contenedor se eliminará automáticamente cuando salga. El comando podman ps -a enumera todos los contenedores, incluidos los detenidos: [user@host ~]$ podman ps -a CONTAINER ID IMAGE 30b743973e98 registry.redhat.io/rhel8/httpd-24:1-105 COMMAND /bin/bash CREATED 17 minutes ago NAMES my-httpd STATUS PORTS Exited (0) 18 minutes ago 80/tcp nota Al crear contenedores, podman se cancela si el nombre del contenedor ya está en uso, incluso si el contenedor está en estado stopped (detenido). Esta protección evita que los nombres de contenedores estén duplicados. El comando podman stop detiene correctamente un contenedor que se está ejecutando. El comando stop envía una señal SIGTERM para finalizar un contenedor en ejecución. Si el contenedor no se detiene después de un período de gracia (10 segundos de manera predeterminada), Podman envía una señal de SIGKILL. [user@host ~]$ podman stop my-httpd-container 77d4b7b8ed1fd57449163bcb0b78d205e70d2314273263ab941c0c371ad56412 Importante Si un contenedor que se detiene usa una imagen de contenedor, la imagen no se puede eliminar con podman rmi ni podman image rm, a menos que incluya la opción -f, que eliminará todos los contenedores que usan la imagen en primer lugar. 402 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores El comando podman rm elimina un contenedor del host. El contenedor debe detenerse, a menos que incluya la opción -f, que también elimina los contenedores en ejecución. El comando podman rm -a elimina todos los contenedores detenidos del host. Se imprimen los ID de contenedor de cualquier contenedor que se elimine. [user@host ~]$ podman rm my-database abcb42ef2ff1b85a50e3cd9bc15877ef823979c8166d0076ce5ebc5ea19c0815 El comando podman restart reinicia un contenedor detenido. El comando crea un nuevo contenedor con el mismo ID de contenedor que el contenedor detenido y vuelve a usar su estado y el sistema de archivos. [user@host ~]$ podman restart my-httpd-container 77d4b7b8ed1fd57449163bcb0b78d205e70d2314273263ab941c0c371ad56412 El comando podman kill envía señales de UNIX al proceso principal del contenedor. Estas son las mismas señales usadas por el comando kill. Esto puede ser útil si el proceso principal en el contenedor puede realizar acciones cuando recibe ciertas señales o para solucionar problemas. Si no se especifica ninguna señal, podman kill envía la señal SIGKILL y finaliza el proceso principal y el contenedor. [user@host ~]$ podman kill my-httpd-container 77d4b7b8ed1fd57449163bcb0b78d205e70d2314273263ab941c0c371ad56412 Especifica la señal con la opción -s: [user@host ~]$ podman kill -s SIGKILL my-httpd-container 77d4b7b8ed1fd57449163bcb0b78d205e70d2314273263ab941c0c371ad56412 Cualquier señal de UNIX puede enviarse al proceso principal. El comando podman kill acepta el número o el nombre de la señal. nota El comando podman stop intenta ejecutar el comando stop para la imagen de contenedor, pero si el comando falla, envía señales SIGTERM y SIGKILL al contenedor. Ejecución de comandos en un contenedor Cuando se inicia un contenedor, ejecuta el comando de punto de entrada (entrypoint) de la imagen de contenedor. Sin embargo, es posible que deba ejecutar otros comandos para administrar el contenedor que se está ejecutando. Por ejemplo, es posible que desee conectar una shell interactiva a un contenedor en ejecución para inspeccionarlo o depurarlo. El comando podman exec inicia un proceso adicional dentro de un contenedor que ya está en ejecución: RH134-RHEL8.2-es-1-20200928 403 capítulo 13 | Ejecución de contenedores [user@host ~]$ podman exec 7ed6e671a600 cat /etc/redhat-release Red Hat Enterprise Linux release 8.2 (Ootpa) [user@host ~]$ En el ejemplo anterior, se usa el ID de contenedor para ejecutar el comando. A menudo, es más fácil usar el nombre del contenedor en su lugar. Si desea conectar una shell interactiva, debe especificar las opciones -i y -t para abrir una sesión interactiva y asignar un pseudoterminal para la shell. [user@host ~]$ podman exec -it my_webserver /bin/bash bash-4.4$ hostname 7ed6e671a600 bash-4.4$ exit [user@host ~]$ Podman recuerda el último contenedor usado en cualquier comando. Puede usar la opción -l para reemplazar el ID o nombre de contenedor anteriores en el comando Podman más reciente. [user@host ~]$ podman exec -l cat /etc/redhat-release Red Hat Enterprise Linux release 8.2 (Ootpa) [user@host ~]$ Referencias Páginas del manual podman-run(1), podman-exec(1), podman-ps(1), podmanstop(1), podman-restart(1), podman-kill(1), podman-rm(1), podman-rmi(1), podman-images(1) y podman-port(1) Para obtener más información, consulte el capítulo Trabajo con contenedores en la Guía de creación, ejecución y administración de contenedores de Red Hat Enterprise Linux 8 en https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/ html-single/building_running_and_managing_containers/index#working-withcontainers_building-running-and-managing-containers 404 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores Ejercicio Guiado Realización de una administración avanzada de contenedores En este ejercicio, usará podman para administrar contenedores que se ejecutan en su servidor. Resultados Deberá ser capaz de crear y administrar contenedores. Andes De Comenzar En la máquina workstation, ejecute el comando lab containers-advanced start. Este comando ejecuta un script de inicio para determinar si la máquina servera es accesible en la red. Además, instala el cliente MariaDB en servera, verifica y configura el registro de contenedores y garantiza que las imágenes de contenedores usadas para este ejercicio estén almacenada allí. [student@workstation ~]$ lab containers-advanced start Instrucciones 1. Use el comando ssh para iniciar sesión en servera como el usuario student. Los sistemas se configuran a fin de que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Inicie sesión en el registro de contenedores con el comando podman login. [student@servera ~]$ podman login registry.lab.example.com Username: admin Password: redhat321 Login Succeeded! 3. Cree un contenedor de base de datos MariaDB independiente según la especificación en los siguientes subpasos con el comando podman run. Confirme que el contenedor se esté ejecutando y publica los puertos correctos. nota Si inicia un contenedor con podman run y aún no ha extraído la imagen de contenedor especificada de registry.lab.example.com, el comando enviará automáticamente la imagen solicitada del registro. RH134-RHEL8.2-es-1-20200928 405 capítulo 13 | Ejecución de contenedores 3.1. Cree un contenedor independiente denominado mydb que use la imagen de contenedor registry.lab.example.com/rhel8/mariadb-103:1-102. Su comando debe publicar el puerto 3306 en el contenedor en el mismo número de puerto en el host. También debe declarar los siguientes valores de variables para configurar el contenedor con el usuario de la base de datos user1 (contraseña redhat), establecer la contraseña de root en redhat y crear los items de la base de datos. Variable Valor MYSQL_USER usuario1 MYSQL_PASSWORD redhat MYSQL_DATABASE items MYSQL_ROOT_PASSWORD redhat El siguiente comando podman run es muy extenso y debe ingresarse como una sola línea. Para su conveniencia, puede copiar y pegar el siguiente comando desde el archivo /tmp/containers-advanced/create-mydb.txt. [student@servera ~]$ podman run -d --name mydb -e MYSQL_USER=user1 -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=items -e MYSQL_ROOT_PASSWORD=redhat -p 3306:3306 registry.lab.example.com/rhel8/mariadb-103:1-102 Trying to pull registry.lab.example.com/rhel8/mariadb-103:1-102... Getting image source signatures Copying blob 71391dc11a78 done Copying blob 77c58f19bd6e done Copying blob 67b9f0b530d9 done Copying blob 47db82df7f3f done Copying config 11a47e0fbe done Writing manifest to image destination Storing signatures abcb42ef2ff1b85a50e3cd9bc15877ef823979c8166d0076ce5ebc5ea19c0815 [student@servera ~]$ 3.2. Confirme que el contenedor se esté ejecutando y publica los puertos correctos con el comando podman ps. [student@servera ~]$ podman ps CONTAINER ID IMAGE abcb42ef2ff1 registry.lab.example.com/rhel8/mariadb-103:1-102 CREATED STATUS PORTS bout a minute ago Up About a minute ago 0.0.0.0:3306->3306/tcp COMMAND run-mysqld NAMES mydb 4. Conéctese a la base de datos MariaDB en su contenedor mydb mediante el comando mysql. Confirme que existe la base de datos items y, luego, salga de MariaDB y detenga el contenedor mydb. 4.1. 406 Conéctese a MariaDB con el usuario user1 con redhat como contraseña. Especifique el puerto 3306 y la dirección IP de localhost, que es su host de contenedores (127.0.0.1). RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores [student@servera ~]$ mysql -u user1 -p --port=3306 --host=127.0.0.1 Enter password: redhat Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 8 Server version: 10.3.17-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> 4.2. Confirme que existe la base de datos items y, luego, salga de MariaDB. MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | items | | test | +--------------------+ 3 rows in set (0.001 sec) MariaDB [(none)]> exit Bye [student@servera ~]$ 4.3. Detenga el contenedor mydb: Su ID de contenedor será diferente del siguiente: [student@servera ~]$ podman stop mydb abcb42ef2ff1b85a50e3cd9bc15877ef823979c8166d0076ce5ebc5ea19c0815 5. Cree un contenedor que ejecute un servidor HTTP Apache que también inicie una shell de Bash interactiva en el contenedor. Ejecute un comando mediante la shell del contenedor y, luego, salga del contenedor y verifique que este ya no se esté ejecutando. 5.1. Cree un contenedor denominado myweb que ejecute un servidor HTTP Apache 2.4 que también inicie una shell interactiva en el contenedor. Use la imagen de contenedor registry.lab.example.com/rhel8/httpd-24:1-105. El siguiente comando podman run es muy extenso y debe ingresarse como una sola línea. [student@servera ~]$ podman run --name myweb -it registry.lab.example.com/rhel8/ httpd-24:1-105 /bin/bash ...output omitted... bash-4.4$ 5.2. En el prompt de la shell interactiva en el contenedor, ejecute el comando cat/etc/ redhat-release para mostrar el contenido del archivo /etc/redhat-release en el contenedor. Salga del contenedor. RH134-RHEL8.2-es-1-20200928 407 capítulo 13 | Ejecución de contenedores bash-4.4$ cat /etc/redhat-release Red Hat Enterprise Linux release 8.2 (Ootpa) bash-4.4$ exit exit [student@servera ~]$ 5.3. Verifique que el contenedor myweb ya no se esté ejecutando. [student@servera ~]$ podman ps -a CONTAINER ID IMAGE 6d95bd8559de registry.lab.example.com/rhel8/httpd-24:1-105 abcb42ef2ff1 registry.lab.example.com/rhel8/mariadb-103:1-102 CREATED About a minute ago 9 minutes ago STATUS Exited (0) 25 seconds ago Exited (0) 3 minutes ago COMMAND /bin/bash run-mysqld PORTS 0.0.0.0:3306->3306/tcp NAMES myweb mydb 6. Cree un contenedor de servidor web HTTPD independiente denominado mysecondweb. Conéctese al contenedor con su nombre y, luego, muestre el nombre y la versión del kernel. Conéctese al contenedor por segunda vez, pero use la opción (-l) para recordar el ID del contenedor del comando anterior y mostrar el promedio de carga del sistema. Deje el contenedor en ejecución. 6.1. Cree un contenedor independiente con el nombre mysecondweb. Su salida será diferente del ejemplo de este ejercicio. [student@servera ~]$ podman run --name mysecondweb -d registry.lab.example.com/ rhel8/httpd-24:1-105 9e8f14e74fd4d82d95a765b8aaaeb1e93b9fe63c54c2cc805509017315460028 6.2. Conéctese al contenedor mysecondweb para mostrar el nombre de Linux y la versión del kernel con el comando podman exec. [student@servera ~]$ podman exec mysecondweb uname -sr Linux 4.18.0-193.el8.x86_64 6.3. Ejecute el comando podman exec nuevamente, esta vez con la opción (-l) a fin de usar el ID del contenedor del comando anterior para mostrar el promedio de carga del sistema. [student@servera ~]$ podman exec -l uptime 00:14:53 up 2:15, 0 users, load average: 0.08, 0.02, 0.01 6.4. Deje el contenedor mysecondweb en ejecución. 7. Cree un contenedor con el nombre myquickweb que enumere el contenido del archivo / etc/redhat-release y, luego, salga y elimine automáticamente el contenedor. Confirme que el contenedor se haya eliminado. 7.1. 408 Cree el contenedor. RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores El siguiente comando podman run es muy extenso y debe ingresarse como una sola línea. [student@servera ~]$ podman run --name myquickweb --rm registry.lab.example.com/ rhel8/httpd-24:1-105 cat /etc/redhat-release Red Hat Enterprise Linux release 8.2 (Ootpa) 7.2. Use el comando podman ps -a para confirmar que se haya eliminado el contenedor myquickweb. El contenedor myquickweb no debería mostrarse en la salida del comando podman ps -a. [student@servera ~]$ podman ps -a | grep myquickweb [student@servera ~]$ 8. Realizar operaciones masivas en contenedores existentes con el comando podman: • Muestre todos los contenedores en ejecución o detenidos. • Asegúrese de que se hayan detenido todos los contenedores existentes. • Elimine todos los contenedores. • Verifique que se hayan eliminado todos los contenedores. 8.1. Muestre todos los contenedores en ejecución o detenidos. Su salida puede variar. [student@servera ~]$ podman ps -a CONTAINER ID IMAGE 9e8f14e74fd4 registry.lab.example.com/rhel8/httpd-24:1-105 6d95bd8559de registry.lab.example.com/rhel8/httpd-24:1-105 abcb42ef2ff1 registry.lab.example.com/rhel8/mariadb-103:1-102 CREATED STATUS 5 minutes ago Up 5 minutes ago 18 minutes ago Exited (0) 17 minutes ago 26 minutes ago Exited (0) 19 minutes ago 8.2. COMMAND /usr/bin/run-http /bin/bash run-mysqld PORTS NAMES mysecondweb myweb 0.0.0.0:3306->3306/tcp mydb Detenga todos los contenedores. [student@servera ~]$ podman stop -a 6d95bd8559de81486b0876663e72260a8108d83aef5c5d660cb8f133f439c025 abcb42ef2ff1b85a50e3cd9bc15877ef823979c8166d0076ce5ebc5ea19c0815 9e8f14e74fd4d82d95a765b8aaaeb1e93b9fe63c54c2cc805509017315460028 8.3. Elimine todos los contenedores. [student@servera ~]$ podman rm -a 6d95bd8559de81486b0876663e72260a8108d83aef5c5d660cb8f133f439c025 9e8f14e74fd4d82d95a765b8aaaeb1e93b9fe63c54c2cc805509017315460028 abcb42ef2ff1b85a50e3cd9bc15877ef823979c8166d0076ce5ebc5ea19c0815 8.4. Verifique que se hayan eliminado todos los contenedores. RH134-RHEL8.2-es-1-20200928 409 capítulo 13 | Ejecución de contenedores [student@servera ~]$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED [student@servera ~]$ STATUS PORTS NAMES 9. Salga de servera. [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En la máquina workstation, ejecute el script lab containers-advanced finish para terminar este ejercicio. [student@workstation ~]$ lab containers-advanced finish Esto concluye el ejercicio guiado. 410 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores Conexión de almacenamiento persistente a un contenedor Objetivos Tras completar esta sección, deberá ser capaz de proporcionar almacenamiento persistente para los datos del contenedor mediante el montaje de un directorio desde el host del contenedor dentro de un contenedor en ejecución. Preparación de las ubicaciones de almacenamiento persistente El almacenamiento en el contenedor es efímero, lo que significa que su contenido se pierde después de eliminar el contenedor. Si debe conservar los datos usados por su contenedor cuando este se reinicie, el almacenamiento efímero no es suficiente. Por ejemplo, su contenedor podría ser un servidor de base de datos, y usted debe conservar la base de datos cuando se reinicia el contenedor. Para soportar aplicaciones contenedorizadas con este requisito, debe proporcionar el contenedor con almacenamiento persistente. Provisión de almacenamiento persistente desde el host de contenedores Una manera fácil de proporcionar un contenedor con almacenamiento persistente es usar un directorio en el host de contenedores para almacenar los datos. Podman puede montar un directorio del host dentro de un contenedor en ejecución. La aplicación contenedorizada ve los directorios del host como parte del almacenamiento del contenedor, al igual que las aplicaciones normales ven el volumen de red remoto como si fuera parte del sistema de archivos del host. Cuando elimina el contenedor, el sistema no recupera el contenido del directorio del host de contenedores. Un contenedor nuevo puede montarlo para acceder a los datos. Por ejemplo, un contenedor de bases de datos puede usar un directorio de host para almacenar archivos de la base de datos. Si este contenedor de bases de datos falla, puede crear un nuevo contenedor con el mismo directorio de host y mantener los datos de la base de datos disponibles para las aplicaciones de clientes. No es importante para el contenedor de base de datos dónde se almacena este directorio de hosts. Puede residir en cualquier lugar, desde una partición de un disco duro local hasta un sistema de archivos remoto en red. Preparación del directorio del host Cuando prepara un directorio de hosts, debe configurarlo para que los procesos dentro del contenedor puedan acceder a él. La configuración del directorio incluye lo siguiente: • Configuración de la propiedad y los permisos del directorio. • Configuración del contexto de SELinux correspondiente. La cuenta de usuario que usa la aplicación dentro del contenedor debe tener acceso al directorio de hosts. Asegúrese de establecer los permisos correctos en el directorio de hosts para que la aplicación pueda acceder a él. RH134-RHEL8.2-es-1-20200928 411 capítulo 13 | Ejecución de contenedores Debe configurar también el directorio de host con el tipo de contexto de SELinux correcto, que es container_file_t. Podman usa el tipo de contexto de SELinux container_file_t para controlar a qué archivos del sistema host puede acceder el contenedor. Si hay un error de seguridad en la capa de contenedores, la protección adicional impide que la aplicación que se ejecuta dentro del contenedor acceda a los archivos de host que se encuentran fuera del directorio compartido. Esta protección es particularmente importante para las aplicaciones que se ejecutan con el usuario root dentro de un contenedor raíz. Sin esta protección adicional de SELinux, estas aplicaciones tendrían acceso root a todos los archivos en el sistema host y podrían comprometer tanto el host como los otros contenedores. Podman puede establecer por usted el contexto de SELinux del directorio de host cuando inicia el contenedor. Montaje de un volumen Después de crear y configurar el directorio del host, el siguiente paso es montar este directorio en un contenedor. Para montar un directorio de host en un contenedor, agregue la opción -volume (o -v) al comando podman run y especifique la ruta del directorio de host y la ruta de almacenamiento del contenedor, separadas por dos puntos: --volume host_dir:container_dir:Z Con la opción Z, Podman aplica automáticamente el tipo de contexto container_file_t SELinux al directorio de host. Por ejemplo, para usar el directorio de host /home/user/dbfiles para los archivos de la base de datos MariaDB como /var/lib/mysql dentro del contenedor, use el siguiente comando. El siguiente comando podman run es muy extenso y debe ingresarse como una sola línea. [user@host ~]$ podman run -d --name mydb -v /home/user/dbfiles:/var/lib/mysql:Z -e MYSQL_USER=user -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=inventory registry.redhat.io/rhel8/mariadb-103:1-102 Referencias Página del manual podman-run(1) Gestión de espacios de nombres de usuario y SELinux en contenedores rootless https://www.redhat.com/sysadmin/user-namespaces-selinux-rootless-containers 412 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores Ejercicio Guiado Conexión de almacenamiento persistente a un contenedor En este ejercicio, creará un contenedor que acceda al contenido web en el almacenamiento persistente provisto por el host del contenedor. Resultados Deberá ser capaz de implementar un contenedor con un almacenamiento persistente. Andes De Comenzar En la máquina workstation, inicie sesión con el usuario student con la contraseña student. En la máquina workstation, ejecute el comando lab containers-storage start. Este comando ejecuta un script de inicio que determina si la máquina servera es accesible en la red. También instala las herramientas de contenedor en servera. [student@workstation ~]$ lab containers-storage start Instrucciones 1. Use el comando ssh para iniciar sesión en servera como el usuario student. Los sistemas se configuran a fin de que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Cree el directorio /home/student/webcontent/html/ y, luego, cree una página de prueba index.html. Usará este directorio como almacenamiento persistente cuando implemente un contenedor de servidor web. 2.1. Cree el directorio ~/webcontent/html/. [student@servera ~]$ mkdir -p ~/webcontent/html/ [student@servera ~]$ 2.2. Cree el archivo index.html y agregue contenido. [student@servera ~]$ echo "Hello World" > ~/webcontent/html/index.html [student@servera ~]$ RH134-RHEL8.2-es-1-20200928 413 capítulo 13 | Ejecución de contenedores 2.3. Confirme que todos tengan acceso al directorio y al archivo index.html. El contenedor usa un usuario sin privilegios que debe poder leer el archivo index.html. [student@servera ~]$ ls -ld webcontent/html/ drwxrwxr-x. 2 student student 24 Aug 28 04:56 webcontent/html/ [student@servera ~]$ ls -l webcontent/html/index.html -rw-rw-r--. 1 student student 12 Aug 28 04:56 webcontent/html/index.html 3. Cree una instancia del contenedor del servidor HTTP Apache con almacenamiento persistente. 3.1. Inicie sesión en el registro registry.lab.example.com con el usuario admin y redhat321 como contraseña. [student@servera ~]$ podman login registry.lab.example.com Username: admin Password: redhat321 Login Succeeded! 3.2. Cree una instancia del contenedor independiente con el nombre myweb. Redirija el puerto 8080 en el host local al puerto del contenedor 8080. Monte el directorio ~/webcontent desde el host en el directorio /var/www del contenedor. Agregue el sufijo :Z a la opción de montaje de volumen para indicar al comando podman que vuelva a etiquetar el directorio y su contenido. Use la imagen registry.lab.example.com/rhel8/httpd-24:1-98. El siguiente comando podman run es muy extenso y debe ingresarse como una sola línea. [student@servera ~]$ podman run -d --name myweb -p 8080:8080 -v ~/webcontent:/var/ www:Z registry.lab.example.com/rhel8/httpd-24:1-98 ...output omitted... 3.3. Ejecute el comando podman ps para confirmar que el contenedor se esté ejecutando y, luego, use el comando curl para acceder al contenido web en el puerto 8080. [student@servera ~]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2f4844b376b7 registry.lab.example.com/rhel8/httpd-24:1-98 /usr/bin/run-http... About a minute ago Up About a minute ago 0.0.0.0:8080->8080/tcp myweb [student@servera ~]$ curl http://localhost:8080/ Hello World 4. En el paso anterior, usó la etiqueta 1-98 para seleccionar una versión específica de la imagen httpd-24. Hay una versión más reciente de esa imagen en el registro del aula. Use el comando skopeo inspect para obtener los detalles de la imagen registry.lab.example.com/rhel8/httpd-24 y recuperar la etiqueta para esa versión. El siguiente comando skopeo inspect es muy extenso y debe ingresarse como una sola línea. 414 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores [student@servera ~]$ skopeo inspect docker://registry.lab.example.com/rhel8/ httpd-24 { "Name": "registry.lab.example.com/rhel8/httpd-24", "Digest": "sha256:bafa...a12a", "RepoTags": [ "1-98", "1-104", "1-105", "latest" ], ...output omitted... En la sección RepoTags, observe que hay una versión más reciente con la etiqueta 1-105. 5. Detenga y elimine el contenedor myweb y, luego, inicie un nuevo contenedor con la etiqueta de imagen 1-105. Confirme que el contenido web en el almacenamiento persistente no ha cambiado. 5.1. Detenga y, luego, elimine el contenedor. [student@servera user]$ podman stop myweb 2f4844b376b78f8f7021fe3a4c077ae52fdc1caa6d877e84106ab783d78e1e1a [student@servera user]$ podman rm myweb 2f4844b376b78f8f7021fe3a4c077ae52fdc1caa6d877e84106ab783d78e1e1a 5.2. Vuelva a ejecutar el comando podman run que usó en un paso anterior para iniciar el contenedor myweb, pero reemplace la etiqueta de imagen 1-98 con 1-105. El siguiente comando podman run es muy extenso y debe ingresarse como una sola línea. [student@servera ~]$ podman run -d --name myweb -p 8080:8080 -v ~/webcontent:/var/ www:Z registry.lab.example.com/rhel8/httpd-24:1-105 ...output omitted... 5.3. Ejecute el comando podman ps para verificar que el contenedor se esté ejecutando. Use el comando curl para confirmar que se mantengan los datos del volumen persistente, incluso si inició un nuevo contenedor. [student@servera ~]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a648c286c653 registry.lab.example.com/rhel8/httpd-24:1-105 /usr/bin/run-http... About a minute ago Up About a minute ago 0.0.0.0:8080->8080/tcp myweb [student@servera ~]$ curl http://localhost:8080/ Hello World 5.4. Salga de servera. RH134-RHEL8.2-es-1-20200928 415 capítulo 13 | Ejecución de contenedores [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En la máquina workstation, ejecute el script lab containers-storage finish para terminar este ejercicio. [student@workstation ~]$ lab containers-storage finish Esto concluye el ejercicio guiado. 416 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores Administración de contenedores como servicios Objetivos Tras completar esta sección, deberá ser capaz de iniciar, detener y verificar el estado de un contenedor como un servicio systemd. Inicio automático de contenedores con el servidor Cuando implementa servicios, como bases de datos o servidores web como contenedores, normalmente desea que esos contenedores se inicien automáticamente con el servidor. Al crear archivos de unidad de usuario systemd para sus contenedores rootless, puede administrarlos con comandos systemctl, de manera similar a los servicios normales. Al habilitar esos servicios, se asegura de que los contenedores asociados se inicien cuando se inicia la máquina host. Si su contenedor se ejecuta en modo "rootless", puede administrar estos servicios desde una cuenta de usuario sin privilegios para aumentar la seguridad. Para un escalamiento y una orquestación más sofisticados de muchas aplicaciones y servicios basados en contenedores, puede usar una plataforma de orquestación empresarial basada en Kubernetes, como Red Hat OpenShift Container Platform. Ejecución de servicios systemd como usuario normal Además de administrar servicios del sistema, systemd también puede administrar servicios de usuario. Con los servicios de usuario systemd, los usuarios pueden crear archivos de unidad para sus propios servicios y administrar esos servicios con comandos systemctl, sin necesidad de acceso root. Cuando habilita un servicio de usuario con un usuario que no es root, ese servicio se inicia automáticamente cuando abre su primera sesión a través de consolas gráficas o de texto o mediante SSH. El servicio se detiene cuando cierra la última sesión. Este comportamiento difiere de los servicios del sistema, que se inician cuando el sistema se inicia y se detienen cuando el sistema se apaga. Sin embargo, puede cambiar este comportamiento predeterminado y obligar a los servicios habilitados a que se inicien con el servidor y se detengan durante el apagado mediante la ejecución del comando loginctl enable-linger. Para revertir la operación, use el comando loginctl disable-linger. Para ver el estado actual, use el comando loginctl showuser username con su nombre de usuario como parámetro. [user@host ~]$ loginctl enable-linger [user@host ~]$ loginctl show-user user ...output omitted... Linger=yes [user@host ~]$ loginctl disable-linger [user@host ~]$ loginctl show-user user ...output omitted... Linger=no RH134-RHEL8.2-es-1-20200928 417 capítulo 13 | Ejecución de contenedores Creación y administración de servicios de usuario de systemd Para definir los servicios de usuario systemd, cree el directorio ~/.config/systemd/user/ para almacenar sus archivos de unidad. La sintaxis de esos archivos es la misma que la de los archivos de unidad del sistema. Para obtener más detalles, consulte las páginas del manual systemd.unit(5) y systemd.service(5). Para controlar los nuevos servicios de usuario, use el comando systemctl con la opción -user. En el siguiente ejemplo, se enumeran los archivos de unidad en el directorio ~/.config/ systemd/user/, se obliga a systemd a volver a cargar su configuración y, luego, se habilita y se inicia el servicio de usuario myapp. [user@host ~]$ ls ~/.config/systemd/user/ myapp.service [user@host ~]$ systemctl --user daemon-reload [user@host ~]$ systemctl --user enable myapp.service [user@host ~]$ systemctl --user start myapp.service nota Para usar los comandos systemctl --user, debe iniciar sesión en la consola o directamente a través de SSH. Los comandos sudo o su no funcionan. El comando systemctl interactúa con un proceso systemd --user por usuario. El sistema solo inicia ese proceso cuando el usuario inicia sesión por primera vez desde la consola o SSH. En la siguiente tabla, se resumen las diferencias entre los servicios de usuario y del sistema systemd. Comparación de servicios de usuario y del sistema Almacenamiento de archivos de unidad personalizados Servicios del sistema /etc/systemd/system/unit.service Servicios de usuario ~/.config/systemd/user/unit.service Recarga de archivos de unidad Servicios del sistema # systemctl daemon-reload Servicios de usuario $ systemctl --user daemon-reload Inicio y detención de un servicio Servicios del sistema Servicios de usuario 418 # systemctl start UNIT # systemctl stop UNIT $ systemctl --user start UNIT $ systemctl --user stop UNIT RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores Inicio de un servicio cuando se inicia la máquina Servicios del sistema Servicios de usuario # systemctl enable UNIT $ loginctl enable-linger $ systemctl --user enable UNIT Administración de contenedores con servicios systemd Si tiene un único host de contenedores que ejecuta una pequeña cantidad de contenedores, puede configurar los archivos de unidad systemd basados en el usuario y configurarlos para que inicien los contenedores automáticamente con el servidor. Este es un enfoque simple, especialmente útil para implementaciones muy básicas y pequeñas que no necesitan escalamiento. En el caso de instalaciones de producción más prácticas, considere la posibilidad de usar Red Hat OpenShift Container Platform, que se analizará brevemente al final de esta sección. Creación de una cuenta de usuario dedicada para ejecutar contenedores Para simplificar la administración de los contenedores rootless, puede crear una cuenta de usuario dedicada que use para todos los contenedores. De esta manera, puede administrarlos desde una sola cuenta de usuario. nota La cuenta que crea para agrupar todos los contenedores debe ser una cuenta de usuario normal. Cuando crea una cuenta con useradd, el comando reserva un rango de ID de usuario para los contenedores del usuario en el archivo /etc/ subuid. Sin embargo, cuando crea una cuenta del sistema con la opción --system (o -r) de useradd, el comando no reserva un rango. Como consecuencia, no puede iniciar contenedores rootless con cuentas del sistema. Creación del archivo de unidad systemd Desde un contenedor existente, el comando podman puede generar el archivo de unidad systemd para usted. En el siguiente ejemplo, se usa el comando podman generate systemd para crear el archivo de unidad para el contenedor web existente: [user@host ~]$ cd ~/.config/systemd/user/ [user@host user]$ podman generate systemd --name web --files --new /home/user/.config/systemd/user/container-web.service El comando podman generate systemd usa un contenedor como modelo para crear el archivo de configuración. Después de que se crea el archivo, debe eliminar el contenedor, ya que systemd espera que el contenedor esté ausente inicialmente. El comando podman generate systemd acepta las siguientes opciones: --name container_name La opción --name especifica el nombre de un contenedor existente para usar como modelo para generar el archivo de unidad. Podman también usa ese nombre para compilar el nombre del archivo de unidad: container-container_name.service. RH134-RHEL8.2-es-1-20200928 419 capítulo 13 | Ejecución de contenedores --files La opción --files le indica a Podman que genere el archivo de unidad en el directorio actual. Sin la opción, Podman muestra el archivo en su salida estándar. --new La opción --new le indica a Podman que configure el servicio systemd para crear el contenedor cuando se inicie el servicio y eliminarlo cuando este se detenga. En este modo, el contenedor es efímero y, por lo general, necesita almacenamiento persistente para conservar los datos. Sin la opción --new, Podman configura el servicio para iniciar y detener el contenedor existente sin eliminarlo. En el siguiente ejemplo, se muestran las directivas start (iniciar) y stop (detener) en el archivo de unidad cuando ejecuta el comando podman generate systemd con la opción --new: [user@host ~]$ podman run -d --name web -v /home/user/www:/var/www:Z registry.redhat.io/rhel8/httpd-24:1-105 [user@host ~]$ podman generate systemd --name web --new ...output omitted... ExecStart=/usr/bin/podman run --conmon-pidfile %t/%n-pid --cidfile %t/%ncid --cgroups=no-conmon -d --name web -v /home/user/webcontent:/var/www:Z registry.redhat.io/rhel8/httpd-24:1-105 ExecStop=/usr/bin/podman stop --ignore --cidfile %t/%n-cid -t 10 ExecStopPost=/usr/bin/podman rm --ignore -f --cidfile %t/%n-cid ...output omitted... En start (iniciar), systemd ejecuta el comando podman run para crear y, luego, iniciar un nuevo contenedor. En stop (detener), systemd ejecuta el comando podman stop para detener el contenedor. Después de que systemd haya detenido el contenedor, systemd lo elimina mediante el comando podman rm. En cambio, en el siguiente ejemplo, se muestran las directivas start (iniciar) y stop (detener) cuando ejecuta el comando podman generate systemd sin la opción --new: [user@host ~]$ podman run -d --name web -v /home/user/www:/var/www:Z registry.redhat.io/rhel8/httpd-24:1-105 [user@host ~]$ podman generate systemd --name web ...output omitted... ExecStart=/usr/bin/podman start web ExecStop=/usr/bin/podman stop -t 10 web ...output omitted... En start (iniciar), systemd ejecuta el comando podman start para iniciar el contenedor existente. En stop (detener), systemd ejecuta el comando podman stop para detener el contenedor. Tenga en cuenta que systemd no elimina el contenedor. Inicio y detención de contenedores con systemd Use el comando systemctl para controlar sus contenedores. • Inicio del contenedor: [user@host ~]$ systemctl --user start container-web 420 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores • Detención del contenedor: [user@host ~]$ systemctl --user stop container-web • Obtención del estado del contenedor: [user@host ~]$ systemctl --user status container-web Importante Los contenedores administrados con el comando systemctl son controlados por systemd. systemd monitorea el estado de los contenedores y los reinicia si fallan. No use el comando podman para iniciar o detener estos contenedores. Si lo hace, puede interferir con el monitoreo de systemd. Configuración de contenedores para que se inicien cuando se inicia la máquina host De forma predeterminada, los servicios de usuario systemd se inician cuando un usuario abre la primera sesión y se detienen cuando el usuario cierra la última sesión. Para que los servicios de usuario se inicien automáticamente con el servidor, ejecute el comando loginctl enablelinger: [user@host ~]$ loginctl enable-linger Para permitir que un contenedor se inicie cuando se inicia la máquina host, use el comando systemctl: [user@host ~]$ systemctl --user enable container-web Para deshabilitar el inicio de un contenedor cuando se inicia la máquina host, use el comando systemctl con la opción disable: [user@host ~]$ systemctl --user disable container-web Administración de contenedores que se ejecutan como root con systemd También puede configurar los contenedores que desea ejecutar como root para que se administren con los archivos de unidad systemd. Una de las ventajas de este enfoque es que puede configurar esos archivos de unidad para que funcionen exactamente igual que los archivos de unidad normales del sistema, en lugar de como un usuario en particular. El procedimiento para configurarlos es similar al que se detalló anteriormente para los contenedores rootless, excepto: • No es necesario que configure un usuario dedicado. • Cuando cree el archivo de unidad con podman generate systemd, hágalo en el directorio / etc/systemd/system, en lugar de en el directorio ~/.config/systemd/user. RH134-RHEL8.2-es-1-20200928 421 capítulo 13 | Ejecución de contenedores • Cuando configure el servicio del contenedor con systemctl, no usará la opción --user. • No es necesario que ejecute loginctl enable-linger como root. Para obtener una demostración, consulte el video de YouTube del canal de videos de Red Hat que se detalla en las referencias al final de esta sección. Orquestación de contenedores a escala En este capítulo, aprendió a configurar y administrar manualmente contenedores desde la línea de comandos en un solo host, y a configurar systemd para que los contenedores se inicien automáticamente con el servidor. Esto es útil a una escala muy pequeña y para obtener más información sobre los contenedores. Sin embargo, en la práctica, la mayoría de las implementaciones empresariales necesita más. La introducción a este capítulo menciona que Kubernetes generalmente se usa para administrar aplicaciones complejas que constan de múltiples contenedores que cooperan entre sí. Red Hat OpenShift es una plataforma de Kubernetes que agrega una interfaz de usuario basada en la Web, monitoreo, la capacidad de ejecutar contenedores en cualquier lugar de un clúster de hosts de contenedores, escalamiento automático, registro y auditoría, entre otras cosas. La explicación de estas herramientas no está incluida en el alcance de este curso. Si desea obtener más información, la capacitación de Red Hat Training ofrece otros cursos, que comienzan con el curso de descripción general técnica gratuito Implementación de aplicaciones en contenedores (DO080) y continúan con Red Hat OpenShift I: contenedores y kubernetes (DO180). Si desea más información, visite https://www.redhat.com/training. También puede obtener más información sobre Kubernetes y Red Hat OpenShift en https:// www.openshift.com. Allí hay una cantidad de recursos disponibles, que incluyen las formas de probar OpenShift usted mismo mediante el uso de herramientas como Contenedores de CodeReady [https://developers.redhat.com/products/codeready-containers/overview]. Consulte https://www.openshift.com/try para obtener más información. Referencias Páginas del manual loginctl(1), systemd.unit(5), systemd.service(5), subuid(5) y podman-generate-systemd(1) Integración de systemd mejorada con Podman 2.0 https://www.redhat.com/sysadmin/improved-systemd-podman Administración de contenedores en Podman con archivos de unidad systemd https://www.youtube.com/watch?v=AGkM2jGT61Y Qué es OpenShift https://www.openshift.com/learn/what-is-openshift Introducción a OpenShift https://www.openshift.com/try Para obtener más información, consulte el capítulo Ejecución de contenedores como servicios systemd con Podman en la Guía de creación, ejecución y administración de contenedores de Red Hat Enterprise Linux 8 en https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/htmlsingle/building_running_and_managing_containers/index#using-systemd-withcontainers_building-running-and-managing-containers 422 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores Ejercicio Guiado Administración de contenedores como servicios En este ejercicio, configurará un contenedor que se administra como un servicio systemd y, luego, usa los comandos systemctl para administrar ese contenedor, de modo que se inicie automáticamente cuando se inicia la máquina host. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear archivos de unidad systemd para administrar contenedores. • Iniciar y detener contenedores con comandos systemctl. • Configurar cuentas de usuario para que los servicios de usuario systemd se inicien cuando se inicia la máquina host. Andes De Comenzar En la máquina workstation, inicie sesión con el usuario student con la contraseña student. En la máquina workstation, ejecute el comando lab containers-services start. Este comando ejecuta un script de inicio que determina si la máquina servera es accesible en la red. También instala las herramientas de contenedor en servera. [student@workstation ~]$ lab containers-services start Instrucciones 1. Use el comando ssh para iniciar sesión en servera como el usuario student. Los sistemas se configuran a fin de que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 2. Use el comando sudo -i para cambiar al usuario root. La contraseña del usuario student es student. [student@servera ~]$ sudo -i [sudo] password for student: student [root@servera ~]# 3. Cree una cuenta de usuario con el nombre contsvc con redhat como contraseña. Configure la cuenta para acceder al registro de imágenes de contenedores en RH134-RHEL8.2-es-1-20200928 423 capítulo 13 | Ejecución de contenedores registry.lab.example.com. Usará esta cuenta para ejecutar contenedores como servicios systemd, en lugar de usar su cuenta de usuario normal. 3.1. Use el comando useradd para crear la cuenta y, luego, use el comando passwd para establecer la contraseña en redhat. [root@servera ~]# useradd contsvc [root@servera ~]# passwd contsvc Changing password for user contsvc. New password: redhat BAD PASSWORD: The password is shorter than 8 characters Retype new password: redhat passwd: all authentication tokens updated successfully. 3.2. Para administrar los servicios de usuario systemd con la cuenta contsvc, debe iniciar sesión directamente como el usuario contsvc. No puede usar los comandos su y sudo. Cierre sesión en servera y, luego, use el comando ssh para iniciar sesión con el usuario contsvc. Los sistemas se configuran a fin de que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [root@servera ~]# exit logout [student@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ ssh contsvc@servera ...output omitted... [contsvc@servera ~]$ 3.3. Cree el directorio ~/.config/containers/. [contsvc@servera ~]$ mkdir -p ~/.config/containers/ [contsvc@servera ~]$ 3.4. El script lab preparó el archivo registries.conf en el directorio /tmp/ containers-services/. Copie ese archivo en ~/.config/containers/. El siguiente comando cp es muy extenso y debe ingresarse en una sola línea. [contsvc@servera ~]$ cp /tmp/containers-services/registries.conf ~/.config/ containers/ 3.5. Para confirmar que puede acceder al registro registry.lab.example.com, ejecute el comando podman search ubi como una prueba. Si todo funciona según lo previsto, el comando debe enumerar algunas imágenes. [contsvc@servera ~]$ podman search ubi INDEX NAME DESCRIPTION example.com registry.lab.example.com/ubi8/ubi example.com registry.lab.example.com/ubi7/ubi 424 STARS 0 0 OFFICIAL AUTOMATED RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores 4. Cree el directorio /home/contsvc/webcontent/html/ y, luego, cree una página de prueba index.html. Usará ese directorio como almacenamiento persistente cuando implemente un contenedor de servidor web. 4.1. Cree el directorio ~/webcontent/html/. [contsvc@servera ~]$ mkdir -p ~/webcontent/html/ [contsvc@servera ~]$ 4.2. Cree el archivo index.html y agregue contenido. [contsvc@servera ~]$ echo "Hello World" > ~/webcontent/html/index.html [contsvc@servera ~]$ 4.3. Confirme que todos tengan acceso al directorio y al archivo index.html. El contenedor usa un usuario sin privilegios que debe poder leer el archivo index.html. [contsvc@servera ~]$ ls -ld webcontent/html/ drwxrwxr-x. 2 contsvc contsvc 24 Aug 28 04:56 webcontent/html/ [contsvc@servera ~]$ ls -l webcontent/html/index.html -rw-rw-r--. 1 contsvc contsvc 12 Aug 28 04:56 webcontent/html/index.html 5. Cree un contenedor independiente con el nombre myweb. Redirija el puerto 8080 en el host local al puerto del contenedor 8080. Monte el directorio ~/ webcontent desde el host en el directorio /var/www del contenedor. Use la imagen registry.lab.example.com/rhel8/httpd-24:1-105. 5.1. Inicie sesión en el registro registry.lab.example.com con el usuario admin y redhat321 como contraseña. [contsvc@servera ~]$ podman login registry.lab.example.com Username: admin Password: redhat321 Login Succeeded! 5.2. Cree el contenedor. Puede copiar y pegar el siguiente comando desde el archivo / tmp/containers-services/start-container.txt. El siguiente comando podman run es muy extenso y debe ingresarse como una sola línea. [contsvc@servera ~]$ podman run -d --name myweb -p 8080:8080 -v ~/webcontent:/var/ www:Z registry.lab.example.com/rhel8/httpd-24:1-105 ...output omitted... 5.3. Para verificar su trabajo, use el comando curl para acceder al contenido web en el puerto 8080. [contsvc@servera ~]$ curl http://localhost:8080/ Hello World RH134-RHEL8.2-es-1-20200928 425 capítulo 13 | Ejecución de contenedores 6. Cree el archivo de unidad systemd para administrar el contenedor myweb con comandos systemctl. Cuando finalice, detenga y, luego, elimine el contenedor myweb. Systemd administra el contenedor y no espera que el contenedor exista inicialmente. 6.1. Cree el directorio ~/.config/systemd/user/. [contsvc@servera ~]$ mkdir -p ~/.config/systemd/user/ [contsvc@servera ~]$ 6.2. Cambie al directorio ~/.config/systemd/user/ y, luego, ejecute el comando podman generate systemd para crear el archivo de unidad para el contenedor myweb. Use la opción --new para que systemd cree un nuevo contenedor al iniciar el servicio y elimine el contenedor al detenerlo. [contsvc@servera ~]$ cd ~/.config/systemd/user [contsvc@servera user]$ podman generate systemd --name myweb --files --new /home/contsvc/.config/systemd/user/container-myweb.service 6.3. Detenga y, luego, elimine el contenedor myweb. [contsvc@servera user]$ podman stop myweb 2f4844b376b78f8f7021fe3a4c077ae52fdc1caa6d877e84106ab783d78e1e1a [contsvc@servera user]$ podman rm myweb 2f4844b376b78f8f7021fe3a4c077ae52fdc1caa6d877e84106ab783d78e1e1a 7. Fuerce systemd para que vuelva a cargar su configuración y, luego, habilite e inicie su nuevo servicio de usuario container-myweb. Para probar su trabajo, detenga y, luego, inicie el servicio y controle el estado del contenedor con los comandos curl y podman ps. 7.1. Use el comando systemctl --user daemon-reload para systemd a fin de tener en cuenta el nuevo archivo de unidad. [contsvc@servera user]$ systemctl --user daemon-reload [contsvc@servera user]$ 7.2. Habilite e inicie el servicio container-myweb. [contsvc@servera user]$ systemctl --user enable --now container-myweb Created symlink /home/contsvc/.config/systemd/user/multi-user.target.wants/ container-myweb.service → /home/contsvc/.config/systemd/user/containermyweb.service. Created symlink /home/contsvc/.config/systemd/user/default.target.wants/containermyweb.service → /home/contsvc/.config/systemd/user/container-myweb.service. 7.3. 426 Use los comandos podman ps y curl para verificar que el contenedor se esté ejecutando. RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores [contsvc@servera user]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a648c286c653 registry.lab.example.com/rhel8/httpd-24:1-105 /usr/bin/run-http... About a minute ago Up About a minute ago 0.0.0.0:8080->8080/tcp myweb [contsvc@servera user]$ curl http://localhost:8080/ Hello World Tome nota del ID del contenedor. Usará esta información para confirmar que systemd crea un nuevo contenedor cuando reinicia el servicio. 7.4. Detenga el servicio container-myweb y, luego, confirme que el contenedor ya no existe. Cuando detenga el servicio, systemd se detiene y, luego, elimina el contenedor. [contsvc@servera user]$ systemctl --user stop container-myweb [contsvc@servera user]$ podman ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7.5. Inicie el servicio container-myweb y, luego, confirme que el contenedor se esté ejecutando. [contsvc@servera user]$ systemctl --user start container-myweb [contsvc@servera user]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6f5148b27726 registry.lab.example.com/rhel8/httpd-24:1-105 /usr/bin/run-http... 5 seconds ago Up 4 seconds ago 0.0.0.0:8080->8080/tcp myweb Observe que el ID del contenedor ha cambiado. Cuando inicia el servicio, systemd crea un nuevo contenedor. 8. Para garantizar que los servicios de usuario para el usuario contsvc se inicien con el servidor, ejecute el comando loginctl enable-linger. Cuando finalice, reinicie servera. 8.1. Ejecute el comando loginctl enable-linger. [contsvc@servera user]$ loginctl enable-linger [contsvc@servera user]$ 8.2. Confirme que la opción Linger esté establecida para el usuario contsvc. [contsvc@servera user]$ loginctl show-user contsvc ...output omitted... Linger=yes 8.3. Cambie al usuario root y, luego, use el comando systemctl reboot para reiniciar servera. RH134-RHEL8.2-es-1-20200928 427 capítulo 13 | Ejecución de contenedores [contsvc@servera user]$ su Password: redhat Last login: Fri Aug 28 07:43:40 EDT 2020 on pts/0 [root@servera ~]# systemctl reboot Connection to servera closed by remote host. Connection to servera closed. [student@workstation ~]$ 9. Espere a que se reinicie la máquina servera, que tarda algunos minutos y, luego, inicie sesión en servera con el usuario contsvc. Confirme que systemd inició el contenedor myweb y que el contenido web esté disponible. 9.1. En workstation, use el comando ssh para iniciar sesión en servera con el usuario contsvc. [student@workstation ~]$ ssh contsvc@servera ...output omitted... [contsvc@servera ~]$ 9.2. Use el comando podman ps para confirmar que el contenedor se esté ejecutando. [contsvc@servera ~]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1d174e79f08b registry.lab.example.com/rhel8/httpd-24:1-105 /usr/bin/run-http... 3 minutes ago Up 3 minutes ago 0.0.0.0:8080->8080/tcp myweb 9.3. Use el comando curl para acceder al contenido web. [contsvc@servera ~]$ curl http://localhost:8080/ Hello World 9.4. Salga de servera. [contsvc@servera ~]$ exit logout Connection to servera closed. [student@workstation ~]$ Finalizar En la máquina workstation, ejecute el script lab containers-services finish para terminar este ejercicio. [student@workstation ~]$ lab containers-services finish Esto concluye el ejercicio guiado. 428 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores Trabajo de laboratorio Ejecución de contenedores En este trabajo de laboratorio, configurará un contenedor en su servidor que proporciona un servicio de base de datos MariaDB, almacena su base de datos en un almacenamiento persistente y se inicia automáticamente con el servidor. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear contenedores independientes. • Configurar el redireccionamiento de puertos y el almacenamiento persistente. • Configurar systemd para que los contenedores se inicien cuando se inicia la máquina host. Andes De Comenzar En la máquina workstation, inicie sesión con el usuario student con la contraseña student. En la máquina workstation, ejecute el comando lab containers-review start. Este comando ejecuta un script de inicio que determina si la máquina serverb es accesible en la red. También instala el cliente MariaDB y crea la cuenta de usuario podsvc que usa para ejecutar un contenedor MariaDB. [student@workstation ~]$ lab containers-review start Instrucciones 1. En serverb, instale las herramientas del contenedor. Inicie sesión en serverb con el usuario student y, luego, use el comando sudo. La contraseña del usuario student es student. 2. El registro de imágenes de contenedores en registry.lab.example.com almacena la imagen rhel8/mariadb-103 con varias etiquetas. En serverb, con el usuario podsvc, enumere esas etiquetas y tome nota de la etiqueta con el número de versión más bajo. Usará esa etiqueta de imagen para iniciar un contenedor más adelante en este ejercicio. La contraseña para el usuario podsvc es redhat. Para consultar el registro registry.lab.example.com, use la cuenta admin con la contraseña redhat321. 3. En serverb, con el usuario podsvc, cree el directorio /home/podsvc/db_data. Prepare el directorio para que los contenedores tengan acceso de lectura/escritura. Usará este directorio para el almacenamiento persistente. 4. En serverb, con el usuario podsvc, cree un contenedor de MariaDB independiente denominado inventorydb. Use la imagen rhel8/mariadb-103 del registro registry.lab.example.com y especifique la etiqueta con el número de versión más bajo de esa imagen, que encontró en un paso anterior. Mapee el puerto 3306 en el contenedor al RH134-RHEL8.2-es-1-20200928 429 capítulo 13 | Ejecución de contenedores puerto 13306 en el host. Monte el directorio /home/podsvc/db_data en el host como / var/lib/mysql/data en el contenedor. Declare los siguientes valores de variables: Variable Valor MYSQL_USER operator1 MYSQL_PASSWORD redhat MYSQL_DATABASE inventory MYSQL_ROOT_PASSWORD redhat Puede copiar y pegar estos parámetros del archivo /home/podsvc/containersreview/variables en serverb. Para confirmar que la base de datos de MariaDB se esté ejecutando, use el comando mysql. Puede encontrar este comando en el script /home/podsvc/containers-review/ testdb.sh. También puede ejecutar directamente el script para probar la base de datos. En serverb, con el usuario podsvc, configure systemd para que el contenedor inventorydb se inicie automáticamente con el servidor. 5. Evaluación Inicie sesión con el usuario student en la máquina workstation y use el comando lab para calificar su trabajo. Corrija los errores informados y vuelva a ejecutar el comando hasta obtener un resultado satisfactorio. [student@workstation ~]$ lab containers-review grade Finalizar En la máquina workstation, ejecute el script lab containers-services finish para terminar este ejercicio. [student@workstation ~]$ lab containers-review finish Esto concluye el trabajo de laboratorio. 430 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores Solución Ejecución de contenedores En este trabajo de laboratorio, configurará un contenedor en su servidor que proporciona un servicio de base de datos MariaDB, almacena su base de datos en un almacenamiento persistente y se inicia automáticamente con el servidor. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear contenedores independientes. • Configurar el redireccionamiento de puertos y el almacenamiento persistente. • Configurar systemd para que los contenedores se inicien cuando se inicia la máquina host. Andes De Comenzar En la máquina workstation, inicie sesión con el usuario student con la contraseña student. En la máquina workstation, ejecute el comando lab containers-review start. Este comando ejecuta un script de inicio que determina si la máquina serverb es accesible en la red. También instala el cliente MariaDB y crea la cuenta de usuario podsvc que usa para ejecutar un contenedor MariaDB. [student@workstation ~]$ lab containers-review start Instrucciones 1. En serverb, instale las herramientas del contenedor. Inicie sesión en serverb con el usuario student y, luego, use el comando sudo. La contraseña del usuario student es student. 1.1. Use el comando ssh para iniciar sesión en serverb como el usuario student. Los sistemas se configuran a fin de que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh student@serverb ...output omitted... [student@serverb ~]$ 1.2. Instale el módulo de Yum container-tools con el comando yum. RH134-RHEL8.2-es-1-20200928 431 capítulo 13 | Ejecución de contenedores [student@serverb ~]$ sudo yum module install container-tools [sudo] password for student: student ...output omitted... Is this ok [y/N]: y ...output omitted... Complete! El registro de imágenes de contenedores en registry.lab.example.com almacena la imagen rhel8/mariadb-103 con varias etiquetas. En serverb, con el usuario podsvc, enumere esas etiquetas y tome nota de la etiqueta con el número de versión más bajo. Usará esa etiqueta de imagen para iniciar un contenedor más adelante en este ejercicio. 2. La contraseña para el usuario podsvc es redhat. Para consultar el registro registry.lab.example.com, use la cuenta admin con la contraseña redhat321. 2.1. Salga de la cuenta student en serverb. [student@serverb ~]$ exit logout Connection to serverb closed. [student@workstation ~]$ 2.2. Use el comando ssh para iniciar sesión en serverb con el usuario podsvc. Los sistemas se configuran a fin de que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh podsvc@serverb ...output omitted... [podsvc@serverb ~]$ 2.3. Inicie sesión en el registro de contenedores con el comando podman login. [podsvc@serverb ~]$ podman login registry.lab.example.com Username: admin Password: redhat321 Login Succeeded! 2.4. Use el comando skopeo inspect para ver información acerca de la imagen registry.lab.example.com/rhel8/mariadb-103. El siguiente comando skopeo inspect es muy extenso y debe ingresarse como una sola línea. [podsvc@serverb ~]$ skopeo inspect docker://registry.lab.example.com/rhel8/ mariadb-103 { "Name": "registry.lab.example.com/rhel8/mariadb-103", "Digest": "sha256:a95b...4816", "RepoTags": [ "1-86", "1-102", "latest" ], ...output omitted... 432 RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores La etiqueta con el número más bajo es 1-86. 3. En serverb, con el usuario podsvc, cree el directorio /home/podsvc/db_data. Prepare el directorio para que los contenedores tengan acceso de lectura/escritura. Usará este directorio para el almacenamiento persistente. 3.1. Cree el directorio /home/podsvc/db_data. [podsvc@serverb ~]$ mkdir /home/podsvc/db_data [podsvc@serverb ~]$ 3.2. Establezca el modo de acceso del directorio en 777 para que todos tengan acceso de lectura/escritura. [podsvc@serverb ~]$ chmod 777 /home/podsvc/db_data [podsvc@serverb ~]$ 4. En serverb, con el usuario podsvc, cree un contenedor de MariaDB independiente denominado inventorydb. Use la imagen rhel8/mariadb-103 del registro registry.lab.example.com y especifique la etiqueta con el número de versión más bajo de esa imagen, que encontró en un paso anterior. Mapee el puerto 3306 en el contenedor al puerto 13306 en el host. Monte el directorio /home/podsvc/db_data en el host como / var/lib/mysql/data en el contenedor. Declare los siguientes valores de variables: Variable Valor MYSQL_USER operator1 MYSQL_PASSWORD redhat MYSQL_DATABASE inventory MYSQL_ROOT_PASSWORD redhat Puede copiar y pegar estos parámetros del archivo /home/podsvc/containersreview/variables en serverb. Para confirmar que la base de datos de MariaDB se esté ejecutando, use el comando mysql. Puede encontrar este comando en el script /home/podsvc/containers-review/ testdb.sh. También puede ejecutar directamente el script para probar la base de datos. 4.1. Use el comando podman run para crear el contenedor. El siguiente comando podman run es muy extenso y debe ingresarse como una sola línea. [podsvc@serverb ~]$ podman run -d --name inventorydb -p 13306:3306 -v / home/podsvc/db_data:/var/lib/mysql/data:Z -e MYSQL_USER=operator1 -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=inventory -e MYSQL_ROOT_PASSWORD=redhat registry.lab.example.com/rhel8/mariadb-103:1-86 ...output omitted... 4.2. Confirme que la base de datos se esté ejecutando. RH134-RHEL8.2-es-1-20200928 433 capítulo 13 | Ejecución de contenedores [podsvc@serverb ~]$ ~/containers-review/testdb.sh Testing the access to the database... SUCCESS En serverb, con el usuario podsvc, configure systemd para que el contenedor inventorydb se inicie automáticamente con el servidor. 5. 5.1. Si usó sudo o su para iniciar sesión con el usuario podsvc, salga de serverb y use el comando ssh para iniciar sesión directamente en serverb con el usuario podsvc. Recuerde que systemd requiere que el usuario abra una sesión directa desde la consola o a través de SSH. [student@workstation ~]$ ssh podsvc@serverb ...output omitted... [podsvc@serverb ~]$ 5.2. Cree el directorio ~/.config/systemd/user/. [podsvc@serverb ~]$ mkdir -p ~/.config/systemd/user/ [podsvc@serverb ~]$ 5.3. Use el comando podman generate systemd para crear el archivo de unidad systemd desde el contenedor en ejecución. [podsvc@serverb ~]$ cd ~/.config/systemd/user/ [podsvc@serverb user]$ podman generate systemd --name inventorydb --files --new /home/podsvc/.config/systemd/user/container-inventorydb.service 5.4. Detenga y, luego, elimine el contenedor inventorydb. [podsvc@serverb user]$ podman stop inventorydb 0d28f0e0a4118ff019691e34afe09b4d28ee526079b58d19f03b324bd04fd545 [podsvc@serverb user]$ podman rm inventorydb 0d28f0e0a4118ff019691e34afe09b4d28ee526079b58d19f03b324bd04fd545 5.5. Indique a systemd que vuelva a cargar su configuración y, luego, habilite e inicie el servicio container-inventorydb. [podsvc@serverb user]$ systemctl --user daemon-reload [podsvc@serverb user]$ systemctl --user enable --now container-inventorydb.service Created symlink /home/podsvc/.config/systemd/user/multi-user.target.wants/ container-inventorydb.service → /home/podsvc/.config/systemd/user/containerinventorydb.service. Created symlink /home/podsvc/.config/systemd/user/default.target.wants/ container-inventorydb.service → /home/podsvc/.config/systemd/user/containerinventorydb.service. 5.6. 434 Confirme que el contenedor se esté ejecutando. RH134-RHEL8.2-es-1-20200928 capítulo 13 | Ejecución de contenedores [podsvc@serverb user]$ ~/containers-review/testdb.sh Testing the access to the database... SUCCESS [podsvc@serverb user]$ podman ps CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES 3ab24e7f000d registry.lab.example.com/rhel8/mariadb-103:1-86 run-mysqld seconds ago Up 46 seconds ago 0.0.0.0:13306->3306/tcp inventorydb 5.7. CREATED 47 Ejecute el comando loginctl enable-linger para que los servicios de usuario se inicien automáticamente cuando se inicia el servidor. [podsvc@serverb ~]$ loginctl enable-linger [podsvc@serverb ~]$ 5.8. Salga de serverb. [podsvc@serverb ~]$ exit logout Connection to serverb closed. [student@workstation ~]$ Evaluación Inicie sesión con el usuario student en la máquina workstation y use el comando lab para calificar su trabajo. Corrija los errores informados y vuelva a ejecutar el comando hasta obtener un resultado satisfactorio. [student@workstation ~]$ lab containers-review grade Finalizar En la máquina workstation, ejecute el script lab containers-services finish para terminar este ejercicio. [student@workstation ~]$ lab containers-review finish Esto concluye el trabajo de laboratorio. RH134-RHEL8.2-es-1-20200928 435 capítulo 13 | Ejecución de contenedores Resumen En este capítulo, aprendió lo siguiente: • Los contenedores proporcionan una manera ligera de distribuir y ejecutar una aplicación y sus dependencias que pueden entrar en conflicto con el software instalado en el host. • Los contenedores se ejecutan desde imágenes de contenedores que puede descargar desde un registro de contenedor o que puede crear usted mismo. • Podman, provisto por Red Hat Enterprise Linux, ejecuta y administra directamente los contenedores y las imágenes de contenedores en un único host. • Los contenedores se pueden ejecutar como root o como contenedores rootless sin privilegios para una mayor seguridad. • Puede mapear puertos de red en el host del contenedor para pasar el tráfico a los servicios que se ejecutan en sus contenedores. También puede usar variables de entorno para configurar el software en contenedores. • El almacenamiento de contenedores es temporal, pero puede conectar almacenamiento persistente a un contenedor con el contenido de un directorio en el host del contenedor, por ejemplo. • Puede configurar systemd para ejecutar automáticamente contenedores cuando se inicia el sistema. 436 RH134-RHEL8.2-es-1-20200928 capítulo 14 Revisión completa Meta Revisar tareas de Administración de sistemas Red Hat II . Objetivos • Revisar tareas de Administración de sistemas Red Hat II . Secciones • Revisión exhaustiva Trabajo de laboratorio • Trabajo de laboratorio: Corrección de problemas de arranque y mantenimiento de servidores • Trabajo de laboratorio: Configuración y administración de sistemas de archivos y almacenamiento • Trabajo de laboratorio: Configuración y administración de seguridad del servidor • Trabajo de laboratorio: Ejecución de contenedores RH134-RHEL8.2-es-1-20200928 437 capítulo 14 | Revisión completa Revisión completa Objetivos Tras finalizar esta sección, usted debería haber revisado y actualizado las habilidades y los conocimientos aprendidos en Administración de sistemas Red Hat II . Revisión de Administración de sistemas Red Hat II Antes de comenzar la revisión completa de este curso, debe sentirse cómodo con los temas que se abordaron en cada capítulo. Puede consultar las secciones anteriores del libro de texto para realizar lecturas complementarias. Capítulo 1, Mejora de la productividad con la línea de comandos Ejecutar los comandos de manera más eficiente mediante el uso de las funciones avanzadas de la shell de Bash, los scripts de shell y diversas utilidades proporcionadas por Red Hat Enterprise Linux. • Automatizar las secuencias de comandos escribiendo un simple script de shell. • Ejecutar comandos con eficiencia con listas de ítems en un script o desde la línea de comandos usando bucles for y condicionales. • Encontrar texto que coincida con un patrón en los archivos de registro y la salida del comando con el comando grep y las expresiones regulares. Capítulo 2, Programación de tareas futuras Programar tareas para que se ejecuten automáticamente en el futuro • Configurar un comando que se ejecute una vez en algún momento en el futuro • Programar comandos para que se ejecuten en un horario de repetición usando el archivo crontab de un usuario • Programar comandos para que se ejecuten en un horario de repetición usando el archivo crontab del sistema y directorios • Habilitar y deshabilitar los temporizadores de systemd y configurar un temporizador que administre archivos temporales Capítulo 3, Ajuste del rendimiento del sistema Mejorar el rendimiento del sistema estableciendo parámetros de ajuste y ajustando la prioridad de programación de los procesos. • Optimizar el rendimiento del sistema seleccionando un perfil de ajuste administrado por el daemon tuned. • Dar o quitar la prioridad a procesos específicos con los comandos nice y renice. 438 RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa Capítulo 4, Control de acceso a archivos con ACL Interpretar y establecer listas de control de acceso (ACL) en archivos para manejar situaciones que requieren permisos complejos de acceso de usuarios y grupos. • Describir los casos de uso de las ACL, identificar los archivos que tienen ACL configuradas e interpretar el efecto de esas ACL. • Establecer y eliminar las ACL de los archivos y definir las ACL predeterminadas establecidas automáticamente por un directorio en los archivos recién creados. Capítulo 5, Administración de seguridad de SELinux Proteger y administrar la seguridad de un servidor con SELinux. • Describir cómo SELinux protege los recursos y cómo seleccionar el modo de cumplimiento. • Configurar el contexto de SELinux de un archivo para controlar la interacción de los procesos con ese archivo. • Configurar los booleanos de SELinux para permitir cambios en la política de tiempo de ejecución para diferentes necesidades de acceso. • Investigar los mensajes de registro de SELinux y solucionar los problemas de denegación de AVC de SELinux. Capítulo 6, Administración de almacenamiento básico Crear y administrar dispositivos de almacenamiento, particiones, sistemas de archivos y espacios de intercambio desde la línea de comandos. • Crear particiones de almacenamiento, formatearlas con sistemas de archivos y montarlas para su uso. • Crear y administrar espacios de intercambio para complementar la memoria física. Capítulo 7, Administración de volúmenes lógicos Crear y administrar volúmenes lógicos que contengan sistemas de archivos y espacios de intercambio desde la línea de comandos. • Crear y administrar volúmenes lógicos desde dispositivos de almacenamiento y formatearlos con sistemas de archivos o prepararlos con espacios de intercambio. • Agregar y eliminar el almacenamiento asignado a los grupos de volúmenes y ampliar en forma no destructiva el tamaño de un volumen lógico formateado con un sistema de archivos. Capítulo 8, Implementación de funciones avanzadas de almacenamiento Administrar el almacenamiento con el sistema de administración de almacenamiento local Stratis y usar los volúmenes VDO para optimizar el espacio de almacenamiento en uso. • Administrar múltiples capas de almacenamiento con la administración de almacenamiento local Stratis. • Optimizar el uso del espacio de almacenamiento con VDO para comprimir y desduplicar datos en dispositivos de almacenamiento. RH134-RHEL8.2-es-1-20200928 439 capítulo 14 | Revisión completa Capítulo 9, Acceso al almacenamiento conectado a la red Acceder al almacenamiento conectado a la red con el protocolo NFS. • Montar, usar y desmontar una exportación de NFS desde la línea de comandos y en el momento del arranque. • Configurar el servicio de automontaje con mapas directos e indirectos para montar automáticamente un sistema de archivos NFS a pedido, y desmontarlo cuando ya no esté en uso. Capítulo 10, Control del proceso de arranque Administrar el proceso de arranque para controlar los servicios ofrecidos y para solucionar y reparar problemas. • Describir el proceso de arranque de Red Hat Enterprise Linux, configurar el objetivo predeterminado que se usa en el arranque e iniciar un sistema con un objetivo no predeterminado. • Iniciar sesión en un sistema y cambiar la contraseña de root cuando la actual se haya perdido. • Reparar manualmente la configuración del sistema de archivos o problemas de daños que detengan el proceso de arranque. Capítulo 11, Administración de la seguridad de redes Controlar las conexiones de red a los servicios mediante el firewall del sistema y las reglas de SELinux. • Aceptar o rechazar las conexiones de red a los servicios del sistema por medio de las reglas de firewalld. • Controlar si los servicios de red pueden usar puertos de red específicos al administrar las etiquetas de puertos de SELinux. Capítulo 12, Instalación de Red Hat Enterprise Linux Instalar Red Hat Enterprise Linux en servidores y máquinas virtuales. • Instalar Red Hat Enterprise Linux en un servidor. • Automatizar el proceso de instalación por medio de Kickstart. • Instalar una máquina virtual en su servidor Red Hat Enterprise Linux por medio de Cockpit. Capítulo 13, Ejecución de contenedores Obtener, ejecutar y administrar servicios livianos simples como contenedores en un único servidor de Red Hat Enterprise Linux. • Explicar qué es un contenedor y cómo usar uno para administrar e implementar aplicaciones con dependencias y librerías de software que necesitan las aplicaciones para funcionar. • Instalar las herramientas de administración de contenedores y ejecutar un contenedor rootless simple. • Buscar, recuperar, inspeccionar y administrar imágenes de contenedores obtenidas de un registro de contenedores remoto y almacenadas en su servidor. 440 RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa • Ejecutar contenedores con opciones avanzadas, enumerar los contenedores que se ejecutan en el sistema e iniciar, detener y finalizar contenedores. • Proporcionar almacenamiento persistente para los datos del contenedor mediante el montaje de un directorio desde el host del contenedor dentro de un contenedor en ejecución. • Iniciar, detener y verificar el estado de un contenedor como un servicio systemd. RH134-RHEL8.2-es-1-20200928 441 capítulo 14 | Revisión completa Trabajo de laboratorio Corrección de problemas de arranque y mantenimiento de servidores En esta revisión, solucionará y reparará los problemas de arranque y actualizará el destino predeterminado del sistema. También programará tareas para que se ejecuten en un cronograma recurrente como un usuario normal. Resultados Usted deberá ser capaz de realizar lo siguiente: • Diagnosticar problemas y recuperar el sistema del modo de emergencia. • Cambiar el destino predeterminado de graphical.target a multi-user.target. • Programar trabajos recurrentes para que se ejecuten como un usuario normal. Andes De Comenzar Copie los archivos o el trabajo que desee preservar en otros sistemas antes de restablecer el sistema. Restablezca los sistemas workstation, servera y serverb ahora. Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute lab rhcsa-compreview1 start para iniciar la revisión completa. Este script crea los archivos necesarios para configurar el entorno correctamente. [student@workstation ~]$ lab rhcsa-compreview1 start Instrucciones Realice las siguientes tareas en serverb para completar la revisión completa: • En workstation, ejecute el comando lab rhcsa-compreview1 break1. Este script de ruptura hace que el proceso de arranque falle en serverb. También establece un tiempo de espera más largo en el menú GRUB2 para ayudar a interrumpir el proceso de arranque, y reinicia serverb. Solucione la causa posible y repare el error de arranque. La corrección debe garantizar que serverb se reinicie sin intervención. Use la contraseña redhat para el superusuario cuando sea necesario. • En workstation, ejecute el comando lab rhcsa-compreview1 break2. Este script de ruptura hace que el destino predeterminado cambie del destino multi-user al destino graphical en serverb. También establece un tiempo de espera más largo para el menú GRUB2 para ayudar a interrumpir el proceso de arranque, y reinicia serverb. En serverb, corrija el destino predeterminado para usar el destino multi-user. La configuración de destino predeterminada debe persistir después del reinicio sin intervención manual. Use el comando sudo como el usuario student con student como contraseña para ejecutar comandos con privilegios. 442 RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa • Programe un trabajo recurrente con el usuario student que ejecuta el script /home/ student/backup-home.sh por hora entre las 7 p. m. y las 9 p. m. todos los días excepto sábados y domingos. Descargue el script de copia de seguridad de http://materials.example.com/ labs/backup-home.sh. El script de copia de seguridad backup-home.sh realiza una copia de seguridad del directorio /home/student de serverb a servera en el directorio /home/student/serverb-backup. Use el script backup-home.sh para programar el trabajo recurrente como el usuario student en serverb. • Reinicie el sistema y espere a que el arranque finalice antes de calificar. Evaluación En workstation, ejecute el script lab rhcsa-compreview1 grade para confirmar que ha realizado correctamente este ejercicio. Corrija los errores informados y vuelva a ejecutar el script hasta obtener un resultado satisfactorio. [student@workstation ~]$ lab rhcsa-compreview1 grade Finalizar En workstation, ejecute lab rhcsa-compreview1 finish para terminar este ejercicio. Este script elimina los archivos y recursos creados durante el ejercicio para garantizar que el entorno esté limpio. [student@workstation ~]$ lab rhcsa-compreview1 finish Guarde los archivos o trabajos que desee conservar en otros sistemas y, luego, restablezca workstation, servera y serverb antes del siguiente ejercicio. Con esto concluye la revisión completa. RH134-RHEL8.2-es-1-20200928 443 capítulo 14 | Revisión completa Solución Corrección de problemas de arranque y mantenimiento de servidores En esta revisión, solucionará y reparará los problemas de arranque y actualizará el destino predeterminado del sistema. También programará tareas para que se ejecuten en un cronograma recurrente como un usuario normal. Resultados Usted deberá ser capaz de realizar lo siguiente: • Diagnosticar problemas y recuperar el sistema del modo de emergencia. • Cambiar el destino predeterminado de graphical.target a multi-user.target. • Programar trabajos recurrentes para que se ejecuten como un usuario normal. Andes De Comenzar Copie los archivos o el trabajo que desee preservar en otros sistemas antes de restablecer el sistema. Restablezca los sistemas workstation, servera y serverb ahora. Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute lab rhcsa-compreview1 start para iniciar la revisión completa. Este script crea los archivos necesarios para configurar el entorno correctamente. [student@workstation ~]$ lab rhcsa-compreview1 start Instrucciones Realice las siguientes tareas en serverb para completar la revisión completa: • En workstation, ejecute el comando lab rhcsa-compreview1 break1. Este script de ruptura hace que el proceso de arranque falle en serverb. También establece un tiempo de espera más largo en el menú GRUB2 para ayudar a interrumpir el proceso de arranque, y reinicia serverb. Solucione la causa posible y repare el error de arranque. La corrección debe garantizar que serverb se reinicie sin intervención. Use la contraseña redhat para el superusuario cuando sea necesario. • En workstation, ejecute el comando lab rhcsa-compreview1 break2. Este script de ruptura hace que el destino predeterminado cambie del destino multi-user al destino graphical en serverb. También establece un tiempo de espera más largo para el menú GRUB2 para ayudar a interrumpir el proceso de arranque, y reinicia serverb. En serverb, corrija el destino predeterminado para usar el destino multi-user. La configuración de destino predeterminada debe persistir después del reinicio sin intervención manual. Use el comando sudo como el usuario student con student como contraseña para ejecutar comandos con privilegios. 444 RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa • Programe un trabajo recurrente con el usuario student que ejecuta el script /home/ student/backup-home.sh por hora entre las 7 p. m. y las 9 p. m. todos los días excepto sábados y domingos. Descargue el script de copia de seguridad de http://materials.example.com/ labs/backup-home.sh. El script de copia de seguridad backup-home.sh realiza una copia de seguridad del directorio /home/student de serverb a servera en el directorio /home/student/serverb-backup. Use el script backup-home.sh para programar el trabajo recurrente como el usuario student en serverb. • Reinicie el sistema y espere a que el arranque finalice antes de calificar. 1. En workstation, ejecute el comando lab rhcsa-compreview1 break1. 1.1. [student@workstation ~]$ lab rhcsa-compreview1 break1 2. Una vez que serverb se haya iniciado, acceda a la consola y observe que el proceso de arranque se detuvo antes de tiempo. Tómese un momento para especular sobre la posible causa de este comportamiento. 2.1. Localice el icono de la consola de serverb, según corresponda para el entorno del aula. Abra la consola. 2.2. Si observa el error, parece que al menos ciertas partes del sistema aún están funcionando. 2.3. Presione Ctrl+Alt+Del para reiniciar serverb. Cuando el menú del cargador de arranque aparezca, presione cualquier tecla excepto Enter para interrumpir la cuenta regresiva. 2.4. Edite la entrada predeterminada del cargador de arranque en la memoria para iniciar sesión en modo de emergencia. Presione e para editar la entrada actual. 2.5. Use las teclas de dirección para navegar hacia la línea que comienza con linux. Agregue systemd.unit=emergency.target en el final de la línea. 2.6. Presione Ctrl+x para realizar el arranque con la configuración modificada. 2.7. Inicie sesión en el modo de emergencia. La contraseña de root es redhat. Give root password for maintenance (or press Control-D to continue): redhat [root@serverb ~]# 3. Vuelva a montar el sistema de archivos / con acceso de lectura-escritura. Use el comando mount -a para intentar montar todos los demás sistemas de archivos. 3.1. Vuelva a montar el sistema de archivos / con acceso de lectura-escritura para editarlo. [root@serverb ~]# mount -o remount,rw / RH134-RHEL8.2-es-1-20200928 445 capítulo 14 | Revisión completa 3.2. Use el comando mount -a para intentar montar todos los demás sistemas de archivos. Observe que uno de los sistemas de archivos no se puede montar. [root@serverb ~]# mount -a mount: /FakeMount: can't find UUID=fake. 3.3. Edite /etc/fstab para corregir el problema. Elimine o comente la línea incorrecta. [root@serverb ~]# vim /etc/fstab ...output omitted... #UUID=fake /FakeMount xfs defaults 3.4. 0 0 Actualice systemd para que el sistema registre la configuración de /etc/fstab nueva. [root@serverb ~]# systemctl daemon-reload [ 206.828912] systemd[1]: Reloading. 3.5. Verifique que su /etc/fstab ahora sea correcto al intentar montar todas las entradas. [root@serverb ~]# mount -a 3.6. Reinicie serverb y espere a que el arranque finalice. Ahora el sistema debería arrancar normalmente. [root@serverb ~]# systemctl reboot En workstation, ejecute el comando lab rhcsa-compreview1 break2. 4. 4.1. [student@workstation ~]$ lab rhcsa-compreview1 break2 Espere a que se complete el reinicio antes de continuar. En serverb, cambie al destino multi-user. Establezca el destino predeterminado en multi-user. Use el comando sudo para ejecutar cualquier comando administrativo requerido y, si se le solicita, use student como contraseña. 5. 5.1. Desde workstation, abra una sesión de SSH en serverb con el usuario student. [student@workstation ~]$ ssh student@serverb ...output omitted... [student@serverb ~]$ 5.2. Como el usuario student en serverb, determine el destino predeterminado. [student@serverb ~]$ systemctl get-default graphical.target 5.3. 446 Cambie al destino multi-user. Use el comando sudo y, si se le solicita, use student como la contraseña. RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa [student@serverb ~]$ sudo systemctl isolate multi-user.target [sudo] password for student: student 5.4. Configure serverb para que use el destino multi-user como destino predeterminado. [student@serverb ~]$ sudo systemctl set-default multi-user.target Removed /etc/systemd/system/default.target. Created symlink /etc/systemd/system/default.target -> /usr/lib/systemd/system/ multi-user.target. 5.5. Reinicie serverb para verificar que el destino multi-user esté configurado como destino predeterminado. [student@serverb ~]$ sudo systemctl reboot Connection to serverb closed by remote host. Connection to serverb closed. [student@workstation ~]$ 5.6. Después del reinicio, abra una sesión de SSH en serverb como el usuario student. Verifique que el destino multi-user esté configurado como destino predeterminado. [student@workstation ~]$ ssh student@serverb ...output omitted... [student@serverb ~]$ systemctl get-default multi-user.target 6. Programe un trabajo recurrente con el usuario student que ejecuta el script /home/ student/backup-home.sh por hora entre las 7 p. m. y las 9 p. m. todos los días excepto sábados y domingos. Use el script backup-home.sh para programar el trabajo recurrente. Descargue el script de copia de seguridad desde http://materials.example.com/labs/backup-home.sh. 6.1. En serverb, descargue el script de copia de seguridad desde http:// materials.example.com/labs/backup-home.sh. Use chmod para hacer que el script de copia de seguridad sea ejecutable. [student@serverb ~]$ wget http://materials.example.com/labs/backup-home.sh ...output omitted... [student@serverb ~]$ chmod +x backup-home.sh 6.2. Use el comando crontab -e para abrir el archivo crontab con el editor de texto predeterminado. [student@serverb ~]$ crontab -e 6.3. Edite el archivo y agregue la siguiente línea: 0 19-21 * * Mon-Fri /home/student/backup-home.sh RH134-RHEL8.2-es-1-20200928 447 capítulo 14 | Revisión completa Guarde los cambios y salga del editor. 6.4. Use el comando crontab -l para enumerar los trabajos recurrentes programados. [student@serverb ~]$ crontab -l 0 19-21 * * Mon-Fri /home/student/backup-home.sh Reinicie serverb y espere a que el arranque finalice antes de calificar. 7. 7.1. [student@serverb ~]$ sudo systemctl reboot [sudo] password for student: student Connection to serverb closed by remote host. Connection to serverb closed. [student@workstation ~]$ Evaluación En workstation, ejecute el script lab rhcsa-compreview1 grade para confirmar que ha realizado correctamente este ejercicio. Corrija los errores informados y vuelva a ejecutar el script hasta obtener un resultado satisfactorio. [student@workstation ~]$ lab rhcsa-compreview1 grade Finalizar En workstation, ejecute lab rhcsa-compreview1 finish para terminar este ejercicio. Este script elimina los archivos y recursos creados durante el ejercicio para garantizar que el entorno esté limpio. [student@workstation ~]$ lab rhcsa-compreview1 finish Guarde los archivos o trabajos que desee conservar en otros sistemas y, luego, restablezca workstation, servera y serverb antes del siguiente ejercicio. Con esto concluye la revisión completa. 448 RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa Trabajo de laboratorio Configuración y administración de sistemas de archivos y almacenamiento En esta revisión, creará un volumen lógico de LVM, montará un sistema de archivos de red, creará una partición de intercambio que se activará automáticamente en el arranque, configurará los archivos temporales no usados para que se limpien del sistema y usará las ACL para proteger un directorio. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear un volumen lógico de LVM. • Montar un sistema de archivos de red • Crear una partición de intercambio que se active automáticamente en el arranque. • Configurar los archivos temporales no usados para que se limpien del sistema. • Usar las ACL para proteger un directorio. Andes De Comenzar Copie los archivos o el trabajo que desee preservar en otros sistemas antes de restablecer el sistema. Restablezca los sistemas workstation, servera y serverb ahora, a menos que recién los haya restablecido al final del último ejercicio. Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute lab rhcsa-compreview2 start para iniciar la revisión completa. Este script crea los archivos necesarios para configurar el entorno correctamente. [student@workstation ~]$ lab rhcsa-compreview2 start Instrucciones Realice las siguientes tareas en serverb para completar la revisión completa. • Configure un nuevo volumen lógico de 1 GiB denominado vol_home en un nuevo grupo de volúmenes de 2 GiB denominado extra_storage. Use el disco sin particiones /dev/ vdb para crear particiones. • El volumen lógico vol_home debe formatearse con el tipo de sistema de archivos XFS y montarse en /home-directories de manera persistente. • Asegúrese de que el sistema de archivos de red llamado /share esté montado de manera persistente en /local-share después del reinicio. El servidor NFS servera.lab.example.com exporta el sistema de archivos de red /share. La ruta de exportación de NFS es servera.lab.example.com:/share. • Cree una nueva partición de 512 MiB en el disco /dev/vdc para usarla como espacio de intercambio. Este espacio de intercambio debe activarse automáticamente en el arranque. RH134-RHEL8.2-es-1-20200928 449 capítulo 14 | Revisión completa • Cree un nuevo grupo llamado production. Cree los usuarios production1, production2, production3 y production4. Asegúrese de que usen el nuevo grupo llamado production como su grupo adicional. • Configure su sistema para que use un nuevo directorio llamado /run/volatile para almacenar archivos temporales. Los archivos en este directorio deben estar sujetos a una limpieza basada en el tiempo si no se accede a ellos durante más de 30 segundos. Los permisos octales para el directorio deben ser 0700. Asegúrese de utilizar el archivo /etc/ tmpfiles.d/volatile.conf para configurar la limpieza basada en el tiempo para los archivos en /run/volatile. • Cree el nuevo directorio denominado /webcontent. Tanto el propietario como el grupo del directorio deben ser root. Los miembros del grupo production deben ser capaces de leer y escribir en este directorio. El usuario production1 solo debe ser capaz de leer este directorio. Estos permisos se deben aplicar a todos los archivos y directorios nuevos creados en el directorio /webcontent. Evaluación En workstation, ejecute el script lab rhcsa-compreview2 grade para confirmar que ha realizado correctamente este ejercicio. Corrija los errores informados y vuelva a ejecutar el script hasta obtener un resultado satisfactorio. [student@workstation ~]$ lab rhcsa-compreview2 grade Finalizar En workstation, ejecute lab rhcsa-compreview2 finish para terminar este ejercicio. Este script elimina los archivos y recursos creados durante el ejercicio para garantizar que el entorno esté limpio. [student@workstation ~]$ lab rhcsa-compreview2 finish Con esto concluye la revisión completa. 450 RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa Solución Configuración y administración de sistemas de archivos y almacenamiento En esta revisión, creará un volumen lógico de LVM, montará un sistema de archivos de red, creará una partición de intercambio que se activará automáticamente en el arranque, configurará los archivos temporales no usados para que se limpien del sistema y usará las ACL para proteger un directorio. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear un volumen lógico de LVM. • Montar un sistema de archivos de red • Crear una partición de intercambio que se active automáticamente en el arranque. • Configurar los archivos temporales no usados para que se limpien del sistema. • Usar las ACL para proteger un directorio. Andes De Comenzar Copie los archivos o el trabajo que desee preservar en otros sistemas antes de restablecer el sistema. Restablezca los sistemas workstation, servera y serverb ahora, a menos que recién los haya restablecido al final del último ejercicio. Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute lab rhcsa-compreview2 start para iniciar la revisión completa. Este script crea los archivos necesarios para configurar el entorno correctamente. [student@workstation ~]$ lab rhcsa-compreview2 start Instrucciones Realice las siguientes tareas en serverb para completar la revisión completa. • Configure un nuevo volumen lógico de 1 GiB denominado vol_home en un nuevo grupo de volúmenes de 2 GiB denominado extra_storage. Use el disco sin particiones /dev/ vdb para crear particiones. • El volumen lógico vol_home debe formatearse con el tipo de sistema de archivos XFS y montarse en /home-directories de manera persistente. • Asegúrese de que el sistema de archivos de red llamado /share esté montado de manera persistente en /local-share después del reinicio. El servidor NFS servera.lab.example.com exporta el sistema de archivos de red /share. La ruta de exportación de NFS es servera.lab.example.com:/share. • Cree una nueva partición de 512 MiB en el disco /dev/vdc para usarla como espacio de intercambio. Este espacio de intercambio debe activarse automáticamente en el arranque. RH134-RHEL8.2-es-1-20200928 451 capítulo 14 | Revisión completa • Cree un nuevo grupo llamado production. Cree los usuarios production1, production2, production3 y production4. Asegúrese de que usen el nuevo grupo llamado production como su grupo adicional. • Configure su sistema para que use un nuevo directorio llamado /run/volatile para almacenar archivos temporales. Los archivos en este directorio deben estar sujetos a una limpieza basada en el tiempo si no se accede a ellos durante más de 30 segundos. Los permisos octales para el directorio deben ser 0700. Asegúrese de utilizar el archivo /etc/ tmpfiles.d/volatile.conf para configurar la limpieza basada en el tiempo para los archivos en /run/volatile. • Cree el nuevo directorio denominado /webcontent. Tanto el propietario como el grupo del directorio deben ser root. Los miembros del grupo production deben ser capaces de leer y escribir en este directorio. El usuario production1 solo debe ser capaz de leer este directorio. Estos permisos se deben aplicar a todos los archivos y directorios nuevos creados en el directorio /webcontent. Desde workstation, abra una sesión de SSH en serverb como student. 1. 1.1. [student@workstation ~]$ ssh student@serverb ...output omitted... Cambie al usuario root. 2. 2.1. [student@serverb ~]$ sudo -i [sudo] password for student: student [root@serverb ~]# Cree una partición de 2 GiB en /dev/vdb. 3. 3.1. [root@serverb ~]# parted /dev/vdb mklabel msdos [root@serverb ~]# parted /dev/vdb mkpart primary 1GiB 3GiB [root@serverb ~]# parted /dev/vdb set 1 lvm on Cree un volumen lógico llamado vol_home con la partición de 2 GiB que creó en /dev/vdb. Asigne al grupo de volúmenes el nombre extra_storage. 4. 4.1. Declare el dispositivo de bloque /dev/vdb1 como volumen físico. [root@serverb ~]# pvcreate /dev/vdb1 ...output omitted... 4.2. Cree el grupo de volúmenes extra_storage con /dev/vdb1. [root@serverb ~]# vgcreate extra_storage /dev/vdb1 ...output omitted... 452 RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa 4.3. Cree un volumen lógico de 1 GiB llamado vol_home. [root@serverb ~]# lvcreate -L 1GiB -n vol_home extra_storage ...output omitted... 5. Asigne a vol_home el formato de tipo de sistema de archivos XFS y móntelo en /homedirectories. 5.1. Cree un directorio denominado /home-directories. [root@serverb ~]# mkdir /home-directories 5.2. Asigne a /dev/extra_storage/vol_home el formato de tipo de sistema de archivos XFS. [root@serverb ~]# mkfs -t xfs /dev/extra_storage/vol_home ...output omitted... 5.3. Monte de manera persistente /dev/extra_storage/vol_home en /homedirectories. Use el UUID de la estructura al crear la entrada en /etc/fstab. [root@serverb ~]# lsblk -o UUID /dev/extra_storage/vol_home UUID 988cf149-0667-4733-abca-f80c6ec50ab6 [root@serverb ~]# echo "UUID=988c...0ab6 /home-directories \ xfs defaults 0 0" >> /etc/fstab [root@serverb ~]# mount -a 6. Asegúrese de que el sistema de archivos de red llamado /share esté montado de manera persistente en /local-share después del reinicio. El servidor NFS servera.lab.example.com exporta el sistema de archivos de red /share. La ruta de exportación de NFS es servera.lab.example.com:/share. 6.1. Cree el directorio /local-share. [root@serverb ~]# mkdir /local-share 6.2. Adjunte la entrada correspondiente a /etc/fstab para que el sistema de archivos de red disponible en servera.lab.example.com:/share monte de manera persistente en /local-share después del reinicio. [root@serverb ~]# echo "servera.lab.example.com:/share /local-share \ nfs rw,sync 0 0" >> /etc/fstab 6.3. Monte el sistema de archivos de red en /local-share en función de la entrada en / etc/fstab. [root@serverb ~]# mount /local-share 7. Cree una nueva partición de 512 MiB en el disco /dev/vdc para usarlo como espacio de intercambio. Este espacio de intercambio debe activarse automáticamente en el momento del arranque. RH134-RHEL8.2-es-1-20200928 453 capítulo 14 | Revisión completa 7.1. Cree una partición de 512 MiB en /dev/vdc. [root@serverb ~]# parted /dev/vdc mklabel msdos [root@serverb ~]# parted /dev/vdc mkpart primary linux-swap 1MiB 513MiB 7.2. Cree el espacio de intercambio en /dev/vdc1. [root@serverb ~]# mkswap /dev/vdc1 ...output omitted... 7.3. Active el espacio de intercambio para que persista después del reinicio. Use el UUID de la estructura al crear la entrada en /etc/fstab. [root@serverb ~]# lsblk -o UUID /dev/vdc1 UUID cc18ccb6-bd29-48a5-8554-546bf3471b69 [root@serverb ~]# echo "UUID=cc18...1b69 swap \ swap defaults 0 0" >> /etc/fstab [root@serverb ~]# swapon -a Cree los usuarios production1, production2, production3 y production4. Asegúrese de que usen el nuevo grupo llamado production como su grupo adicional. 8. 8.1. [root@serverb ~]# groupadd production [root@serverb ~]# for i in 1 2 3 4; do useradd -G production production$i; done Configure su sistema para que use un nuevo directorio llamado /run/volatile para almacenar archivos temporales. Los archivos en este directorio deben estar sujetos a una limpieza basada en el tiempo si no se accede a ellos durante más de 30 segundos. Los permisos octales para el directorio deben ser 0700. Asegúrese de utilizar el archivo /etc/ tmpfiles.d/volatile.conf para configurar la limpieza basada en el tiempo para los archivos en /run/volatile. 9. 9.1. Cree un nuevo archivo denominado /etc/tmpfiles.d/volatile.conf wcon el siguiente contenido. d /run/volatile 0700 root root 30s 9.2. Use el comando systemd-tmpfiles --create para crear el directorio /run/ volatile si no existe. [root@servera ~]# systemd-tmpfiles --create /etc/tmpfiles.d/volatile.conf 10. Cree un nuevo directorio denominado /webcontent. Tanto el propietario como el propietario del grupo del directorio deben ser root. Los miembros del grupo production deben ser capaces de leer y escribir en este directorio. El usuario production1 solo debe ser capaz de leer este directorio. Estos permisos se deben aplicar a todos los archivos y directorios nuevos creados en el directorio /webcontent. 10.1. Cree el directorio /webcontent. 454 RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa [root@serverb ~]# mkdir /webcontent 10.2. Use setfacl para configurar permisos en /webcontent de manera que los miembros del grupo de productiontengan permisos de lectura y de escritura, con la excepción del usuario production1, a quien solo se le debe otorgar permiso de lectura. [root@serverb ~]# setfacl -m u:production1:rx /webcontent [root@serverb ~]# setfacl -m g:production:rwx /webcontent 10.3. Use setfacl para establecer los permisos predeterminados en /webcontent de modo que los permisos que aplicó en el paso anterior también se apliquen a todos los archivos y directorios nuevos creados en el directorio /webcontent. [root@serverb ~]# setfacl -m d:u:production1:rx /webcontent [root@serverb ~]# setfacl -m d:g:production:rwx /webcontent 10.4. Salga de la shell del usuario root. [root@serverb ~]# exit logout 10.5. Cierre sesión en serverb. [student@serverb ~]$ exit logout Connection to serverb closed. Evaluación En workstation, ejecute el script lab rhcsa-compreview2 grade para confirmar que ha realizado correctamente este ejercicio. Corrija los errores informados y vuelva a ejecutar el script hasta obtener un resultado satisfactorio. [student@workstation ~]$ lab rhcsa-compreview2 grade Finalizar En workstation, ejecute lab rhcsa-compreview2 finish para terminar este ejercicio. Este script elimina los archivos y recursos creados durante el ejercicio para garantizar que el entorno esté limpio. [student@workstation ~]$ lab rhcsa-compreview2 finish Con esto concluye la revisión completa. RH134-RHEL8.2-es-1-20200928 455 capítulo 14 | Revisión completa Trabajo de laboratorio Configuración y administración de seguridad del servidor En esta revisión, configurará la autenticación basada en claves de SSH, cambiará la configuración del cortafuegos, ajustará el modo de SELinux y un booleano de SELinux, y solucionará problemas de SELinux. Resultados Usted deberá ser capaz de realizar lo siguiente: • Configurar claves de SSH para la autenticación basada en claves. • Configurar parámetros de firewall. • Ajustar el modo de SELinux y los booleanos de SELinux. • Solucionar problemas de SELinux. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute lab rhcsa-compreview3 start para iniciar la revisión completa. Este script crea los archivos necesarios para configurar el entorno correctamente. [student@workstation ~]$ lab rhcsa-compreview3 start Instrucciones Realice las siguientes tareas para completar la revisión completa: • Genere claves de SSH para el usuario student en serverb. No proteja la clave privada con una frase de contraseña. • En servera, configure el usuario student para que acepte la autenticación de inicio de sesión con el par de claves de SSH creado para student en serverb. El usuario student en serverb debe poder iniciar sesión en servera con SSH sin ingresar una contraseña. Use student como la contraseña para el usuario student, si se le solicita. • En servera, cambie el modo predeterminado de SELinux a permissive. • Configure serverb para que monte automáticamente el directorio de inicio del usuario production5 cuando el usuario inicie sesión, con el sistema de archivos de red /homedirectories/production5. Este sistema de archivos de red se exporta desde servera.lab.example.com. Ajuste el booleano correspondiente de SELinux para que production5 pueda usar el directorio de inicio montado en NFS en serverb después de la autenticación basada en claves de SSH. La contraseña del usuario production5 es redhat. • En serverb, ajuste la configuración del firewall para que se rechacen las conexiones de SSH que se originan en servera. 456 RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa • En serverb, investigue y corrija el problema con el daemon HTTPD de Apache, que está configurado para escuchar en el puerto 30080/TCP, pero que no se puede iniciar. Ajuste la configuración del firewall según corresponda para que el puerto 30080/TCP esté abierto para conexiones entrantes. Evaluación En workstation, ejecute el script lab rhcsa-compreview3 grade para confirmar que ha realizado correctamente este ejercicio. Corrija los errores informados y vuelva a ejecutar el script hasta obtener un resultado satisfactorio. [student@workstation ~]$ lab rhcsa-compreview3 grade Finalizar En workstation, ejecute lab rhcsa-compreview3 finish para terminar este ejercicio. Este script elimina los archivos y recursos creados durante el ejercicio para garantizar que el entorno esté limpio. [student@workstation ~]$ lab rhcsa-compreview3 finish Guarde los archivos o trabajos que desee conservar en otros sistemas y restablezca workstation, servera y serverb. Con esto concluye la revisión completa. RH134-RHEL8.2-es-1-20200928 457 capítulo 14 | Revisión completa Solución Configuración y administración de seguridad del servidor En esta revisión, configurará la autenticación basada en claves de SSH, cambiará la configuración del cortafuegos, ajustará el modo de SELinux y un booleano de SELinux, y solucionará problemas de SELinux. Resultados Usted deberá ser capaz de realizar lo siguiente: • Configurar claves de SSH para la autenticación basada en claves. • Configurar parámetros de firewall. • Ajustar el modo de SELinux y los booleanos de SELinux. • Solucionar problemas de SELinux. Andes De Comenzar Inicie sesión en workstation como student con la contraseña student. En workstation, ejecute lab rhcsa-compreview3 start para iniciar la revisión completa. Este script crea los archivos necesarios para configurar el entorno correctamente. [student@workstation ~]$ lab rhcsa-compreview3 start Instrucciones Realice las siguientes tareas para completar la revisión completa: • Genere claves de SSH para el usuario student en serverb. No proteja la clave privada con una frase de contraseña. • En servera, configure el usuario student para que acepte la autenticación de inicio de sesión con el par de claves de SSH creado para student en serverb. El usuario student en serverb debe poder iniciar sesión en servera con SSH sin ingresar una contraseña. Use student como la contraseña para el usuario student, si se le solicita. • En servera, cambie el modo predeterminado de SELinux a permissive. • Configure serverb para que monte automáticamente el directorio de inicio del usuario production5 cuando el usuario inicie sesión, con el sistema de archivos de red /homedirectories/production5. Este sistema de archivos de red se exporta desde servera.lab.example.com. Ajuste el booleano correspondiente de SELinux para que production5 pueda usar el directorio de inicio montado en NFS en serverb después de la autenticación basada en claves de SSH. La contraseña del usuario production5 es redhat. • En serverb, ajuste la configuración del firewall para que se rechacen las conexiones de SSH que se originan en servera. 458 RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa • En serverb, investigue y corrija el problema con el daemon HTTPD de Apache, que está configurado para escuchar en el puerto 30080/TCP, pero que no se puede iniciar. Ajuste la configuración del firewall según corresponda para que el puerto 30080/TCP esté abierto para conexiones entrantes. 1. Desde workstation, abra una sesión de SSH en serverb como student. 1.1. [student@workstation ~]$ ssh student@serverb ...output omitted... 2. Genere claves de SSH para el usuario student en serverb con el comando ssh-keygen. No proteja la clave privada con una frase de contraseña. 2.1. [student@serverb ~]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/student/.ssh/id_rsa): Enter Created directory '/home/student/.ssh'. Enter passphrase (empty for no passphrase): Enter Enter same passphrase again: Enter Your identification has been saved in /home/student/.ssh/id_rsa. Your public key has been saved in /home/student/.ssh/id_rsa.pub. The key fingerprint is: SHA256:1TPZ4TXYwiGWfExUGtRTHgfKQbF9hVuLa+VmH4vgkFY student@serverb.lab.example.com The key's randomart image is: +---[RSA 2048]----+ | .+@BO**| | .=.#+B*| | . X.*o=| | . E +.+ | | S o + | | + . o = | | . o o + +| | . . ..| | | +----[SHA256]-----+ 3. En servera, configure el usuario student para que acepte la autenticación de inicio de sesión con el par de claves de SSH que creó para student en serverb. El usuario student en serverb debe poder iniciar sesión en servera con SSH sin ingresar una contraseña. Use student como la contraseña para el usuario student, cuando se le solicite. 3.1. Use el comando ssh-copy-id para transferir la clave pública del par de claves SSH de student en serverb a student en servera. Use student como la contraseña para el usuario student, si se le solicita. [student@serverb ~]$ ssh-copy-id student@servera /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/student/.ssh/ id_rsa.pub" The authenticity of host 'servera (172.25.250.10)' can't be established. RH134-RHEL8.2-es-1-20200928 459 capítulo 14 | Revisión completa ECDSA key fingerprint is SHA256:g/fIMtVzDWTbTi1l0OwC30sL6cHmro9Tf563NxmeyyE. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys student@servera's password: student Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'student@servera'" and check to make sure that only the key(s) you wanted were added. 3.2. Use el comando ssh para verificar que el usuario student pueda iniciar sesión en servera desde serverb sin introducir una contraseña. [student@serverb ~]$ ssh student@servera ...output omitted... [student@servera ~]$ En servera, cambie el modo predeterminado de SELinux a permissive. 4. 4.1. Edite /etc/sysconfig/selinux para establecer el valor del parámetro SELINUX en permissive. Puede usar el comando sudo vi /etc/sysconfig/selinux para editar el archivo de configuración como superusuario. Use la contraseña student, si se le solicita. ...output omitted... #SELINUX=enforcing SELINUX=permissive ...output omitted... 4.2. Use el comando sudo systemctl reboot para reiniciar el sistema como el superusuario. [student@servera ~]$ sudo systemctl reboot Connection to servera closed by remote host. Connection to servera closed. [student@serverb ~]$ Configure serverb para que monte automáticamente el directorio de inicio del usuario production5 cuando el usuario inicie sesión, con el sistema de archivos de red /homedirectories/production5. Este sistema de archivos de red se exporta desde servera.lab.example.com. Ajuste el booleano correspondiente de SELinux para que production5 pueda usar el directorio de inicio montado en NFS en serverb después de la autenticación basada en claves de SSH. La contraseña del usuario production5 es redhat. 5. 5.1. En serverb, use el comando sudo -i para cambiar a la cuenta de usuario root. [student@serverb ~]$ sudo -i [sudo] password for student: student [root@serverb ~]# 460 RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa 5.2. Instale el paquete autofs. [root@serverb ~]# yum install autofs ...output omitted... Is this ok [y/N]: y ...output omitted... Installed: autofs-1:5.1.4-29.el8.x86_64 Complete! 5.3. Cree el archivo de asignación maestro de autofs denominado /etc/ auto.master.d/production5.autofs con el siguiente contenido. /- /etc/auto.production5 5.4. Recupere los detalles del usuario production5 para obtener la ruta del directorio de inicio. [root@serverb ~]# getent passwd production5 production5:x:5001:5001::/localhome/production5:/bin/bash 5.5. Cree el archivo /etc/auto.production5 con el siguiente contenido. /localhome/production5 -rw servera.lab.example.com:/home-directories/production5 5.6. Reinicie el servicio autofs. [root@serverb ~]# systemctl restart autofs 6. En servera, verifique que el usuario production5 no pueda iniciar sesión en serverb con la autenticación de clave pública SSH. Un booleano SELinux causa este problema que solucionará en los siguientes pasos. 6.1. Desde workstation, abra una sesión de SSH para servera como student. [student@workstation ~]$ ssh student@servera ...output omitted... [student@servera ~]$ 6.2. Cambie al usuario production5 con redhat como contraseña. [student@servera ~]$ su - production5 Password: redhat [production5@servera ~]$ 6.3. Use el comando ssh-keygen para generar claves SSH como production5. [production5@servera ~]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/production5/.ssh/id_rsa): Enter RH134-RHEL8.2-es-1-20200928 461 capítulo 14 | Revisión completa Created directory '/home/production5/.ssh'. Enter passphrase (empty for no passphrase): Enter Enter same passphrase again: Enter Your identification has been saved in /home/production5/.ssh/id_rsa. Your public key has been saved in /home/production5/.ssh/id_rsa.pub. The key fingerprint is: SHA256:zmin1nmCt4H8LA+4FPimtdg81nl7ATbInUFW3HSPxk4 production5@servera.lab.example.com The key's randomart image is: +---[RSA 2048]----+ | .oo.o. . | | .. . .o o | | . o o E .| | . o * + | | . . .So . | | . + = . | | *.*+=. . | | Oo+***.o | | o.=o.=** | +----[SHA256]-----+ 6.4. Use el comando ssh-copy-id para transferir la clave pública del par de claves SSH de production5 en servera a production5 en serverb. Use redhat como la contraseña para el usuario production5, si se le solicita. [production5@servera ~]$ ssh-copy-id production5@serverb /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ production5/.ssh/id_rsa.pub" The authenticity of host 'serverb (172.25.250.11)' can't be established. ECDSA key fingerprint is SHA256:ciCkaRWF4g6eR9nSdPxQ7KL8czpViXal6BousK544TY. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys production5@serverb's password: redhat Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'production5@serverb'" and check to make sure that only the key(s) you wanted were added. 6.5. Use la autenticación basada en clave pública SSH en lugar de la autenticación basada en contraseña para iniciar sesión en serverb como production5. Este comando debería fallar. [production5@servera ~]$ ssh -o pubkeyauthentication=yes \ -o passwordauthentication=no production5@serverb production5@serverb: Permission denied (publickey,gssapi-keyex,gssapi-withmic,password). 462 RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa 7. Establezca la configuración correspondiente del booleano de SELinux en serverb, de modo que production5 pueda iniciar sesión en serverb con la autenticación basada en clave pública SSH y use el directorio de inicio. 7.1. En serverb como root, establezca el booleano de SELinux use_nfs_home_dirs en true. [root@serverb ~]# setsebool -P use_nfs_home_dirs true 7.2. Use la autenticación basada en clave pública SSH en lugar de la autenticación basada en contraseña para iniciar sesión en serverb como production5. Este comando debe arrojar resultados satisfactorios. [production5@servera ~]$ ssh -o pubkeyauthentication=yes \ -o passwordauthentication=no production5@serverb ...output omitted... [production5@serverb ~]$ 8. En serverb, ajuste la configuración del firewall para que se rechacen las conexiones de SSH que se originan en servera. El sistema servera usa la dirección IPv4 172.25.250.10. 8.1. Use el comando firewall-cmd para agregar la dirección IPv4 de servera a la zona de firewalld denominada block. [root@serverb ~]# firewall-cmd --add-source=172.25.250.10/32 \ --zone=block --permanent success 8.2. Use el comando firewall-cmd --reload para volver a cargar los cambios en la configuración del firewall. [root@serverb ~]# firewall-cmd --reload success 9. En serverb, investigue y corrija el problema con el daemon HTTPD de Apache, que está configurado para escuchar en el puerto 30080/TCP, pero que no se puede iniciar. Ajuste la configuración del firewall según corresponda para que el puerto 30080/TCP esté abierto para conexiones entrantes. 9.1. Use el comando systemctl para reiniciar el servicio httpd. Este comando no puede reiniciar el servicio. [root@serverb ~]# systemctl restart httpd.service Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details. 9.2. Use el comando systemctl status para investigar el motivo del error del servicio httpd. [root@serverb ~]# systemctl status httpd.service ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) RH134-RHEL8.2-es-1-20200928 463 capítulo 14 | Revisión completa Active: failed (Result: exit-code) since Mon 2019-04-15 06:42:41 EDT; 5min ago Docs: man:httpd.service(8) Process: 27313 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE) Main PID: 27313 (code=exited, status=1/FAILURE) Status: "Reading configuration..." Apr 15 06:42:41 serverb.lab.example.com systemd[1]: Starting The Apache HTTP Server... Apr 15 06:42:41 serverb.lab.example.com httpd[27313]: (13)Permission denied: AH00072: make_sock: could not bind to address [::]:30080 Apr 15 06:42:41 serverb.lab.example.com httpd[27313]: (13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:30080 Apr 15 06:42:41 serverb.lab.example.com httpd[27313]: no listening sockets available, shutting down Apr 15 06:42:41 serverb.lab.example.com httpd[27313]: AH00015: Unable to open logs Apr 15 06:42:41 serverb.lab.example.com systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE Apr 15 06:42:41 serverb.lab.example.com systemd[1]: httpd.service: Failed with result 'exit-code'. Apr 15 06:42:41 serverb.lab.example.com systemd[1]: Failed to start The Apache HTTP Server. Observe el error de permiso en la salida anterior, lo que significa que el daemon httpd no pudo vincularse con el puerto 30080/TCP. La política de SELinux puede ser una restricción potencial para que una aplicación se vincule con un puerto. Presione q para salir del comando systemctl anterior. 9.3. Use el comando sealert para determinar si una política de SELinux está impidiendo que httpd se vincule con el puerto 30080/TCP. [root@serverb ~]# sealert -a /var/log/audit/audit.log 100% done found 1 alerts in /var/log/audit/audit.log -------------------------------------------------------------------------------SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket port 30080. ***** Plugin bind_ports (92.2 confidence) suggests ************************ If you want to allow /usr/sbin/httpd to bind to network port 30080 Then you need to modify the port type. Do # semanage port -a -t PORT_TYPE -p tcp 30080 where PORT_TYPE is one of the following: http_cache_port_t, http_port_t, jboss_management_port_t, jboss_messaging_port_t, ntop_port_t, puppet_port_t. ...output omitted... El mensaje de registro anterior revela que el puerto 30080/TCP no tiene el contexto apropiado de SELinux http_port_t, por lo que SELinux impide que httpd se vincule con este puerto. El mensaje de registro también produce la sintaxis del comando semanage port para que pueda corregir fácilmente el problema. 464 RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa 9.4. Use el comando semanage port para establecer el contexto apropiado de SELinux en el puerto 30080/TCPpara que httpd se vincule con él. [root@serverb ~]# semanage port -a -t http_port_t -p tcp 30080 9.5. Use el comando systemctl para reiniciar httpd. Este comando debe reiniciar el servicio correctamente. [root@serverb ~]# systemctl restart httpd 9.6. Agregue el puerto 30080/TCP a la zona firewalld predeterminada llamada public (público). [root@serverb ~]# firewall-cmd --add-port=30080/tcp --permanent success [root@serverb ~]# firewall-cmd --reload success 9.7. Salga de la shell del usuario root. [root@serverb ~]# exit logout 9.8. Cierre sesión en serverb. [student@serverb ~]$ exit logout Connection to serverb closed. Evaluación En workstation, ejecute el script lab rhcsa-compreview3 grade para confirmar que ha realizado correctamente este ejercicio. Corrija los errores informados y vuelva a ejecutar el script hasta obtener un resultado satisfactorio. [student@workstation ~]$ lab rhcsa-compreview3 grade Finalizar En workstation, ejecute lab rhcsa-compreview3 finish para terminar este ejercicio. Este script elimina los archivos y recursos creados durante el ejercicio para garantizar que el entorno esté limpio. [student@workstation ~]$ lab rhcsa-compreview3 finish Guarde los archivos o trabajos que desee conservar en otros sistemas y restablezca workstation, servera y serverb. Con esto concluye la revisión completa. RH134-RHEL8.2-es-1-20200928 465 capítulo 14 | Revisión completa Trabajo de laboratorio Ejecución de contenedores En esta revisión, configurará un contenedor en su servidor que proporciona contenido web desde el almacenamiento persistente y se inicia automáticamente con el servidor. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear contenedores rootless independientes. • Configurar el redireccionamiento de puertos y el almacenamiento persistente. • Configurar systemd para que los contenedores se inicien cuando se inicia la máquina host. Andes De Comenzar En la máquina workstation, inicie sesión con el usuario student con la contraseña student. En la máquina workstation, ejecute el comando lab rhcsa-compreview4 start. Este comando ejecuta un script de inicio que determina si la máquina serverb es accesible en la red. También crea una colección de archivos con cierto contenido web y la cuenta de usuario containers que usa para ejecutar un contenedor de servidor HTTP Apache. [student@workstation ~]$ lab rhcsa-compreview4 start Instrucciones Realice las siguientes tareas en serverb con el usuario containers para completar la revisión integral: • En serverb, cree el directorio /srv/web/ y, luego, extraiga la colección de archivos /home/containers/rhcsa-compreview4/web-content.tgz en ese directorio. Configure el directorio para que un contenedor rootless pueda usarlo para el almacenamiento persistente. • En serverb, instale las herramientas del contenedor. • En serverb, con el usuario containers, cree un contenedor de servidor HTTP Apache independiente con el nombre web. Use la imagen rhel8/httpd-24 con la etiqueta 1-105 desde el registro registry.lab.example.com. Mapee el puerto 8080 en el contenedor al puerto 8888 en el host. Monte el directorio /srv/web en el host como / var/www en el contenedor. Declare la variable de entorno HTTPD_MPM con el valor event. • En serverb, con el usuario containers, configure systemd para que el contenedor web se inicie automáticamente con el servidor. La contraseña para el usuario containers es redhat. Para acceder al registro de imágenes de contenedores en registry.lab.example.com, use la cuenta admin con la contraseña redhat321. Puede copiar y pegar los parámetros del contenedor web desde el archivo /home/containers/rhcsa-compreview4/variables en serverb. 466 RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa Evaluación Inicie sesión con el usuario student en la máquina workstation y use el comando lab rhcsacompreview4 grade para calificar su trabajo. Corrija los errores informados y vuelva a ejecutar el comando hasta obtener un resultado satisfactorio. [student@workstation ~]$ lab rhcsa-compreview4 grade Finalizar Con el usuario student en la máquina workstation, use el comando lab rhcsacompreview4 finish para terminar este ejercicio. [student@workstation ~]$ lab rhcsa-compreview4 finish Con esto concluye la revisión exhaustiva. RH134-RHEL8.2-es-1-20200928 467 capítulo 14 | Revisión completa Solución Ejecución de contenedores En esta revisión, configurará un contenedor en su servidor que proporciona contenido web desde el almacenamiento persistente y se inicia automáticamente con el servidor. Resultados Usted deberá ser capaz de realizar lo siguiente: • Crear contenedores rootless independientes. • Configurar el redireccionamiento de puertos y el almacenamiento persistente. • Configurar systemd para que los contenedores se inicien cuando se inicia la máquina host. Andes De Comenzar En la máquina workstation, inicie sesión con el usuario student con la contraseña student. En la máquina workstation, ejecute el comando lab rhcsa-compreview4 start. Este comando ejecuta un script de inicio que determina si la máquina serverb es accesible en la red. También crea una colección de archivos con cierto contenido web y la cuenta de usuario containers que usa para ejecutar un contenedor de servidor HTTP Apache. [student@workstation ~]$ lab rhcsa-compreview4 start Instrucciones Realice las siguientes tareas en serverb con el usuario containers para completar la revisión integral: • En serverb, cree el directorio /srv/web/ y, luego, extraiga la colección de archivos /home/containers/rhcsa-compreview4/web-content.tgz en ese directorio. Configure el directorio para que un contenedor rootless pueda usarlo para el almacenamiento persistente. • En serverb, instale las herramientas del contenedor. • En serverb, con el usuario containers, cree un contenedor de servidor HTTP Apache independiente con el nombre web. Use la imagen rhel8/httpd-24 con la etiqueta 1-105 desde el registro registry.lab.example.com. Mapee el puerto 8080 en el contenedor al puerto 8888 en el host. Monte el directorio /srv/web en el host como / var/www en el contenedor. Declare la variable de entorno HTTPD_MPM con el valor event. • En serverb, con el usuario containers, configure systemd para que el contenedor web se inicie automáticamente con el servidor. La contraseña para el usuario containers es redhat. Para acceder al registro de imágenes de contenedores en registry.lab.example.com, use la cuenta admin con la contraseña redhat321. Puede copiar y pegar los parámetros del contenedor web desde el archivo /home/containers/rhcsa-compreview4/variables en serverb. 468 RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa 1. En serverb, cree el directorio /srv/web/ y, luego, extraiga la colección de archivos /home/containers/rhcsa-compreview4/web-content.tgz en ese directorio. Configure el directorio para que un contenedor rootless pueda usarlo para el almacenamiento persistente. 1.1. Use el comando ssh para iniciar sesión en serverb con el usuario containers. Los sistemas se configuran a fin de que usen claves SSH para la autenticación, por lo que no se necesita una contraseña. [student@workstation ~]$ ssh containers@serverb ...output omitted... [containers@serverb ~]$ 1.2. Use el comando sudo -i para cambiar al usuario root. La contraseña para el usuario containers es redhat. [containers@serverb ~]$ sudo -i [sudo] password for containers: redhat [root@serverb ~]# 1.3. Cree el directorio /srv/web/. [root@serverb ~]# mkdir /srv/web/ [root@serverb ~]# 1.4. Extraiga la colección de archivos /home/containers/rhcsa-compreview4/webcontent.tgz en el directorio /srv/web/. [root@serverb ~]# cd /srv/web/ [root@serverb web]# tar xvf /home/containers/rhcsa-compreview4/web-content.tgz html/ html/index.html [root@serverb web]# 1.5. Los contenedores rootless requieren acceso de lectura al directorio /srv/web/ y a su contenido. Además, el comando podman que se ejecuta con el usuario containers debe ser capaz de volver a etiquetar el directorio para SELinux. Establezca el propietario del directorio en containers y, luego, confirme que todos tengan acceso al contenido. [root@serverb web]# chown -R containers: /srv/web [root@serverb web]# ls -ld /srv/web/ drwxr-xr-x. 3 containers containers 18 Sep 7 04:43 /srv/web/ [root@serverb web]# ls -ld /srv/web/html/ drwxr-xr-x. 2 containers containers 24 Sep 7 04:01 /srv/web/html/ [root@serverb web]# ls -l /srv/web/html/index.html -rw-r--r--. 1 containers containers 546 Sep 7 04:01 /srv/web/html/index.html 2. En serverb, instale las herramientas del contenedor. 2.1. Instale el módulo de Yum container-tools con el comando yum. RH134-RHEL8.2-es-1-20200928 469 capítulo 14 | Revisión completa [root@serverb web]# yum module install container-tools ...output omitted... Is this ok [y/N]: y ...output omitted... Complete! 2.2. Salga de la cuenta root. [root@serverb web]# exit logout [containers@serverb ~]$ En serverb, con el usuario containers, cree un contenedor independiente con el nombre web. Use la imagen rhel8/httpd-24 con la etiqueta 1-105 desde el registro registry.lab.example.com. Mapee el puerto 8080 en el contenedor al puerto 8888 en el host. Monte el directorio /srv/web en el host como /var/www en el contenedor. Declare la variable de entorno HTTPD_MPM con un valor event. 3. Puede copiar y pegar estos parámetros desde el archivo /home/containers/rhcsacompreview4/variables en serverb. 3.1. Inicie sesión en el registro de imágenes de contenedores en registry.lab.example.com, con la cuenta admin con la contraseña redhat321. [containers@serverb ~]$ podman login registry.lab.example.com Username: admin Password: redhat321 Login Succeeded! 3.2. Use el comando podman run para crear el contenedor. El siguiente comando podman run es muy extenso y debe ingresarse como una sola línea. [containers@serverb ~]$ podman run -d --name web -p 8888:8080 -v /srv/web:/var/ www:Z -e HTTPD_MPM=event registry.lab.example.com/rhel8/httpd-24:1-105 ...output omitted... 3.3. Use el comando curl para confirmar que el servidor HTTP Apache se esté ejecutando. [containers@serverb ~]$ curl http://localhost:8888/ Comprehensive Review Web Content Test Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sit amet lacus vestibulum, varius magna sit amet, tempus neque. ...output omitted... Ese contenido proviene de la colección de archivos web-content.tgz que extrajo anteriormente. 4. 470 En serverb, con el usuario containers, configure systemd para que el contenedor web se inicie automáticamente con el servidor. RH134-RHEL8.2-es-1-20200928 capítulo 14 | Revisión completa 4.1. Si usó sudo o su para iniciar sesión con el usuario containers, salga de serverb y use el comando ssh para iniciar sesión directamente en serverb con el usuario containers. [student@workstation ~]$ ssh containers@serverb ...output omitted... [containers@serverb ~]$ 4.2. Cree el directorio ~/.config/systemd/user/. [containers@serverb ~]$ mkdir -p ~/.config/systemd/user/ [containers@serverb ~]$ 4.3. Use el comando podman generate systemd para crear el archivo de unidad systemd desde el contenedor en ejecución. [containers@serverb ~]$ cd ~/.config/systemd/user/ [containers@serverb user]$ podman generate systemd --name web --files --new /home/containers/.config/systemd/user/container-web.service 4.4. Detenga y, luego, elimine el contenedor web. [containers@serverb user]$ podman stop web d16a826c936efc7686d8d8e5617b727f5d272361c54f8a0ca65c57d012347784 [containers@serverb user]$ podman rm web d16a826c936efc7686d8d8e5617b727f5d272361c54f8a0ca65c57d012347784 4.5. Indique a systemd que vuelva a cargar su configuración y, luego, habilite e inicie el servicio container-web. [containers@serverb user]$ systemctl --user daemon-reload [containers@serverb user]$ systemctl --user enable --now container-web.service Created symlink /home/containers/.config/systemd/user/multi-user.target.wants/ container-web.service → /home/containers/.config/systemd/user/containerweb.service. Created symlink /home/containers/.config/systemd/user/default.target.wants/ container-web.service → /home/containers/.config/systemd/user/containerweb.service. 4.6. Confirme que el contenedor se esté ejecutando. [containers@serverb user]$ curl http://localhost:8888/ Comprehensive Review Web Content Test Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sit amet lacus vestibulum, varius magna sit amet, tempus neque. ...output omitted... 4.7. Ejecute el comando loginctl enable-linger para que los servicios de usuario se inicien automáticamente con el servidor. RH134-RHEL8.2-es-1-20200928 471 capítulo 14 | Revisión completa [containers@serverb ~]$ loginctl enable-linger [containers@serverb ~]$ 4.8. Salga de serverb. [containers@serverb ~]$ exit logout Connection to serverb closed. [student@workstation ~]$ Evaluación Inicie sesión con el usuario student en la máquina workstation y use el comando lab rhcsacompreview4 grade para calificar su trabajo. Corrija los errores informados y vuelva a ejecutar el comando hasta obtener un resultado satisfactorio. [student@workstation ~]$ lab rhcsa-compreview4 grade Finalizar Con el usuario student en la máquina workstation, use el comando lab rhcsacompreview4 finish para terminar este ejercicio. [student@workstation ~]$ lab rhcsa-compreview4 finish Con esto concluye la revisión exhaustiva. 472 RH134-RHEL8.2-es-1-20200928