Вы находитесь на странице: 1из 221

Esta obra usa la fuente Spranq eco Sans,

la cual ahorra hasta un 50% de tóner en las impresiones

ADMINISTRACIÓN DE
GNU/LINUX WWW.SUGEEK.CO

Obra basada en Debian GNU/Linux

Frank Harbey Sanabria Florez


Esta obra está bajo licencia de Creative Commons, la cual le permitirá
distribuir y copiar esta obra cuantas veces quiera, y si piensa realizar
alguna derivación de esta deberá de dar crédito a la obra
mencionándola como fuente, y dicha obra derivada debe de estar bajo
esta misma licencia o alguna similar, además esta obra no podrá usarse
para fines comerciales a menos que cuente con la autorización del autor.

Autor: Frank Harbey Sanabria Florez

No le presto mucha atención a lo que se hace con otros sistemas operativos. No compito,
Solo me preocupa hacer que Linux se supere así mismo, no a los otros.

- Linus Torvalds -

2 www.sugeek.co
SOBRE EL AUTOR
Twitter: @franksanabria
Facebook: frankharbey
LinkedIn: franksanabria

Frank Harbey Sanabria Florez es un Tecnólogo en


Telecomunicaciones y Sistemas egresado del SENA de
la ciudad de Ibagué. Especialista en la migración de
plataformas privativas a soluciones OpenSource Y
Especializado en Seguridad Informática.

Desde sus inicios laborales a estado en diferentes empresas todas


enfocadas al negocio de las comunicaciones o sistemas como
Compusystem Ibagué, Solusoft Ibagué, Telefónica Telecom (Movistar),
Andicall S.A.S, No More Cards S.A.S, BPM Consulting LTDA, además de
ser ponente en eventos como SFD Bogotá, Flisol Bogotá, Alcaldía de
Bogotá e instructor en institutos privados como Net Security Solutions
(Instructor Linux), y AulaMatriz (Instructor integraciones de sistemas
Windows y Linux).

Conocimientos académicos: Certificaciones:


• ISO27000 • LFCS
• ITILv3 • LFCE
• ISO9001
• CCNAv4 Security
• CCNAv5 Networking
• PANDUIT
• MCSA: Windows Server 2008

Administración de Servidores GNU/Linux 3


4 www.sugeek.co
ÍNDICE DE CONTENIDO
PROLOGO.......................................................................................... 13
¿Que es Linux?.....................................................................13
¿Que es GNU?......................................................................13
¿Que es GNU/Linux?.............................................................14
Resumen Histórico...............................................................14
Contenido Digital.................................................................15
¿POR QUE GNU/LINUX?......................................................................17
GNU/Linux en Empresas/Gobierno.......................................17
GNU/Linux en la Educación..................................................17
GNU/Linux Para Usted..........................................................18
¿DONDE ESTA LINUX?.......................................................................19
Distribuciones......................................................................19
SELECCIÓN DE LA DISTRIBUCIÓN E INSTALACIÓN.............................21
Instalación............................................................................22
Proceso de Arranque de GNU/Linux.....................................31
Trabajando con GRUB2........................................................32
Recuperar Password de Root por GRUB...........................33
Init SystemV.........................................................................34
Niveles de Ejecución........................................................34
Archivo /etc/inittab..........................................................35
Archivo /etc/init.d/rc........................................................36
Servicios en /etc/init.d.....................................................37
SystemD..............................................................................37
Ventajas Generales..........................................................37
Desventajas Generales....................................................38
Unidades Objetos y Servicios...........................................38
Servicios..........................................................................38
Acciones..........................................................................39
Registros del Sistema......................................................40
SISTEMA DE ARCHIVOS (FHS)............................................................41
Directorio y Arquitecturas....................................................41
Tipos de Archivos.................................................................43
Inodo....................................................................................43
Identificando Dispositivos....................................................44
Periféricos............................................................................45
TRABAJANDO CON GNU/LINUX...........................................................47
Estructura de los Comandos................................................48
Comando MAN.....................................................................48
Apagar el Sistema................................................................50
Verificando el estado del Sistema........................................51

Administración de Servidores GNU/Linux 5


Comando TOP..................................................................51
Comando free..................................................................52
Comando w......................................................................52
Comando vmstat -s..........................................................53
Comando who y whoami..................................................53
Comando id y groups.......................................................53
Comando lspci.................................................................54
Comando lsusb................................................................54
Comando lscpu................................................................54
Comando uname.............................................................55
Comando lshw.................................................................55
Comando lsblk.................................................................55
Comando df.....................................................................56
Comando blkid.................................................................56
Comando fdisk -l..............................................................56
Comando last y lastb.......................................................57
Comando du....................................................................58
Comando dmesg..............................................................58
Comando arch.................................................................58
Comando pstree..............................................................58
Comando ps.....................................................................58
Comandos ifconfig, ip......................................................60
Comando netstat.............................................................61
Comando ss.....................................................................61
Comandos route -e y arp -e.............................................62
Archivos de Estado del Sistema.......................................62
Archivo /etc/services........................................................62
Alias.....................................................................................63
Manejo de Archivos y Directorios.........................................63
Directorios.......................................................................63
Rutas Absolutas...............................................................64
Rutas Relativas................................................................64
Trabajando con Directorios..............................................64
Trabajando con Archivos.................................................65
Trabajando con Archivos y Directorios.............................65
Trabajando con la familia del comando z.........................66
Shell globing....................................................................66
Archivos Enlaces..............................................................67
COMPILANDO EL KERNEL...................................................................69
Eliminar un kernel Antiguo...................................................70
Gestión de Módulos..............................................................70
Comando lsmod...............................................................71
Comando modinfo...........................................................72

6 www.sugeek.co
Comando depmod...........................................................72
Comando insmod.............................................................72
Comando rmmod.............................................................73
Comando modprobe........................................................73
Archivo /etc/sysctl.conf y comando sysctl............................73
Algunas Opciones de Interés...........................................74
HERRAMIENTAS GNU/LINUX...............................................................75
Comando find.......................................................................75
Comando locate...................................................................76
Comando date......................................................................76
Comando ntpdate................................................................77
Comando Calc......................................................................78
Comando history..................................................................78
Comando time......................................................................79
Comprimir y Descomprimir..................................................79
Comando tar....................................................................79
Comando zip y unzip.......................................................79
Comando gzip y gunzip...................................................79
Comando wget.....................................................................80
Comando bc.........................................................................80
EDITOR DE TEXTO VI.........................................................................83
Funcionamiento...................................................................83
Comandos............................................................................83
Inserción de datos...........................................................83
Salir y Guardar.................................................................84
Corrección.......................................................................84
Desplazamiento...............................................................85
Búsqueda de Texto..........................................................86
Comandos de Sustitución................................................86
Copiar y Pegar.................................................................87
Sustitución.......................................................................87
Edición Avanzada............................................................87
Comando set...................................................................88
EDITOR DE TEXTO NANO...................................................................89
GESTIÓN DE PAQUETES.....................................................................91
Comando aptitude y apt.......................................................91
Archivo /etc/apt/source.list...................................................93
Comando ldd........................................................................94
Comando ldconfig................................................................94
Comando dpkg.....................................................................95
Instalación desde las fuentes...............................................96
ADMINISTRACIÓN DE USUARIOS........................................................97
Usuario root.........................................................................97

Administración de Servidores GNU/Linux 7


Directorio /home/.................................................................98
Directorio /etc/skel/..............................................................98
Archivo /etc/passwd.............................................................98
Archivo /etc/group................................................................99
Archivo /etc/shadow.............................................................99
Archivo /etc/default/useradd................................................100
Archivo .basrc......................................................................100
Comandos useradd, adduser, passwd, chage, userdel y deluser
............................................................................................. 100
Comando adduser...........................................................100
Comando useradd...........................................................101
Comando passwd............................................................101
Comando chage...............................................................102
Comandos deluser y userdel............................................102
Comandos groupadd, addgroup, delgroup, groupdel...........102
Comandos usermod y groupmod.........................................103
Comando usermod..........................................................103
Comando groupmod........................................................103
Comando gpasswd...............................................................104
Comandos chsh y chfn.........................................................104
Comando chsh.................................................................104
Comando chfn.................................................................104
Comando su.........................................................................104
Archivo /etc/login.defs..........................................................105
Archivo /etc/nsswitch...........................................................105
Archivos /etc/issue /etc/issue.net /etc/motd.........................106
PERMISOS DE ARCHIVOS Y CARPETAS...............................................107
Permisos Absolutos..............................................................108
Permisos Relativos...............................................................109
Comando chown..................................................................109
Comando chgrp....................................................................110
Comando umask..................................................................110
Comando chmod..................................................................110
Permisos avanzados.............................................................111
Sticky bit..........................................................................111
set gid y set uid...............................................................111
GESTIÓN DE PROCESOS Y SERVICIOS................................................113
Procesos en Background......................................................114
Procesos en Foreground.......................................................114
Prioridad de los Procesos.....................................................115
Comando nice..................................................................115
Comando renice..............................................................115
Comando nohup...................................................................115

8 www.sugeek.co
Comando update-rc.d..........................................................115
Servicios..............................................................................116
REDIRECCIONES, TUBERÍAS Y FILTROS..............................................117
Redirección de salida con > y >>........................................117
Redirección de errores con 2>.............................................118
Redirección de entrada con <..............................................118
Redirección con here-documment <<.................................118
Tuberías y Filtros..................................................................118
Comando basename y dirname.......................................119
Comando tee...................................................................119
Comando grep.................................................................119
Comando egrep...............................................................120
Comando cut...................................................................121
Comando column.............................................................121
Comando tr......................................................................122
Comando sort..................................................................122
Comando uniq.................................................................123
Comando paste...............................................................123
Comando diff...................................................................124
Comando sed.......................................................................124
Coincidencia con más caracteres....................................125
Ejemplos..........................................................................126
LA SHELL DE GNU/LINUX...................................................................129
Regionalización e Internacionalización.................................129
Regionalización(l10n)......................................................129
Internacionalización (i18n)..............................................129
Usos Horarios..................................................................131
Codificación de Caracteres..............................................131
Operadores de Control Shell................................................132
Operador &&...................................................................132
Operador ||......................................................................132
Operador &......................................................................132
Operador ;.......................................................................132
Operador \.......................................................................132
Operador #......................................................................133
Agrupación de Comandos................................................133
Argumentos del Shell...........................................................133
Comando echo.................................................................134
Comillas Doble “”............................................................134
Comillas Simples ' '..........................................................134
Comillas invertidas ` `.....................................................134
Variables Shell.....................................................................134
Declaración de Variables.................................................135

Administración de Servidores GNU/Linux 9


Variables Tipadas............................................................136
Programación en Shell.........................................................136
Nuestro primer script.......................................................137
Control de Flujo...............................................................138
Ciclos...............................................................................140
Funciones........................................................................142
Operaciones lógicas y de comparación............................145
Interacciones con el Usuario............................................145
ADMINISTRACIÓN DE UNIDADES DE ALMACENAMIENTO...................147
Superbloque.........................................................................147
MBR......................................................................................148
Particiones soportadas.........................................................148
Archivo /etc/fstab.................................................................149
Comando lsscsi....................................................................151
Comando hdparm................................................................152
Montar y desmontar una unidad de almacenamiento..........153
Comando mount..............................................................153
Comando umount............................................................154
Comando lsof.......................................................................154
Particiones de las Unidades.................................................155
Comando fdisk.................................................................155
Comando gdisk................................................................159
Formatear Unidades.............................................................162
Unidad SWAP o memoria de Intercambio.............................164
Verificar el estado del disco con fsck...................................166
Las Cuotas de Disco.............................................................167
Habilitar las Cuotas..........................................................167
Habilitar las Cuotas a Usuarios........................................168
Habilitar las Cuotas a Grupos..........................................169
Unidades RAID (Arreglo de Discos)......................................170
Preparar los Discos Duros................................................170
Creando RAID con mdadm...............................................170
Eliminar un RAID del sistema...........................................174
Unidades LVM (Logical Volume Manager)............................174
Volúmenes Físicos (Physical Volumen)............................174
Grupo Volúmenes (Volumen Group)................................176
Volúmenes Lógicos (Logical Volumen).............................177
Ampliar y Reducir un VG..................................................179
Ampliar y Reducir un LV..................................................182
Mover el contenido de un PV a otro PV............................185
Suprimir un VG................................................................188
Crear un Snapshot…………………………………………………190
Cifrar Unidades de Almacenamiento....................................191

10 www.sugeek.co
Comando Smartctl...............................................................192
ADMINISTRACIÓN DE RED.................................................................193
Archivo /etc/network/interfaces............................................193
Archivo /etc/protocols..........................................................193
Archivo /etc/resolv.conf........................................................194
Archivo /etc/hosts................................................................194
Comando ifconfig.................................................................194
Comando ip..........................................................................194
Comando route....................................................................196
Comando whois....................................................................196
Comando mtr.......................................................................197
Comando arp.......................................................................197
Comando ping......................................................................197
Comando traceroute............................................................198
Comando nslookup...............................................................198
Comando dig........................................................................199
Comando IPTraf....................................................................199
Archivo /etc/networks..........................................................200
REGISTROS DEL SISTEMA..................................................................201
Servicio rsyslog....................................................................201
sysklogd..........................................................................202
RainerScript.....................................................................203
Servicio logrotate.................................................................204
Probando los logs locales.....................................................206
Archivo /var/log/messages...................................................206
TAREAS PLANIFICADAS......................................................................207
Archivo /etc/crontab.............................................................207
Comando crontab.................................................................209
Comando at.........................................................................209
SEGURIDAD EN GNU/LINUX...............................................................211
Archivo /etc/securetty..........................................................211
Rootkits................................................................................211
Virus.....................................................................................212
Bloquear USB.......................................................................213
Herramienta SUDO...............................................................213
Archivo /etc/sudoers........................................................214
Autenticación PAM...............................................................216
Tipo de Modulo................................................................217
Control.............................................................................218
Modulo.............................................................................218
Limites del Usuario...............................................................218
Proteger el GRUB2 con contraseñas.....................................219
BIBLIOGRAFÍA....................................................................................221

Administración de Servidores GNU/Linux 11


12 www.sugeek.co
PRÓLOGO
La presente obra se realiza con el fin de que usted, con pocos o
medianos conocimientos en GNU/Linux pueda desenvolverse en un
mercado con demanda de profesionales cada vez mayor en la utilización
de este sistema operativo. GNU/Linux se está convirtiendo en la mejor
alternativa para las Pymes y empresas en crecimiento.

Espero que esta obra sea de su agrado y la aproveche al máximo.

¡IMPORTANTE!
Esta obra tiene como requisito que el lector tenga nociones básicas
sobre sistemas informáticos como redes y sistemas operativos.

¿Qué es Linux?
Linux por si solo, es la base de muchos sistemas operativos, los cuales
van desde dispositivos móviles, pasando por electrodomésticos,
llegando a grandes proyectos como bolsas de valores y misiones
espaciales.

Cabe destacar el hecho que Linux no es igual a GNU/Linux ya que como


se menciona en el párrafo anterior, Linux es la base y GNU es el
software, la fusión de estos dos hace un Sistema Operativo funcional
para cualquier persona.

Linux es bien conocido como el Kernel, el cual se encarga de hacer la


interacción maquina – software – usuario - software – maquina, y en
cualquier distribución, llámese como se llame, tendrá el mismo Kernel,
diferenciado uno del otro con las modificaciones que cada distribución le
haga a este para mejorar ciertos apartados del software usado.

Desde la versión 0.12, Linux está licenciado con GPLv2, la cual permite
que cualquier persona u empresa copie, modifique y realice la actividad
que desee con este, dicha libertad permitió que muchas empresas usen
Linux hoy en día como, IBM, HP, DELL, Google, Facebook, NASA,
Amazon, y la misma Microsoft usa Linux en algunos de sus
colaboradores.

Administración de Servidores GNU/Linux 13


¿Que es GNU?
GNU es un proyecto fundado por Richard Stallman el 27 de septiembre
de 1983, con el objetivo de crear un sistema operativo completamente
libre. GNU ya posee la suficiente cantidad de Software para completar el
sistema operativo, pero le hace falta el Núcleo, la comunicación entre
sus programas y la maquina, para ello crearon el Kernel Hurd basándose
en Unix, pero dicho kernel esta aun muy inmaduro para su correcto
funcionamiento, así que se decidió usar el kernel Linux para integrar el
software que ya estaba desarrollado.

GNU es el acrónimo de “GNU is not Unix” o en español “GNU no es Unix”

¿Que es GNU/Linux?
GNU/Linux es la combinación de los anteriores desarrollos mencionados,
así que en pocas palabras podría indicarse lo siguiente.

GNU → Provee el software y herramientas para que Linux sea mas


amigable con el usuario final.

Linux → Provee el núcleo (Kernel) con el cual estas herramientas se


comuniquen con el Hardware.

Resumen Histórico
A continuación enumeramos los hitos más importantes dentro de la
historia de GNU/Linux.

• 1983 Richard Stallman libera el proyecto GNU.


• Linux, Desarrollado por Linus Torvalds en la universidad de
Helsinki como un hobby y es escrito en lenguaje C. Basado en
Minix mas no derivado. Nombre “Interno” inicial Freax
• 1991 17 de Septiembre 1ra versión pública de Linux
• 1992 Nace MCC Interim Linux la primera distribución Linux
• 1993 Se adapta al proyecto GNU y nace Slakeware la distribución
GNU/Linux mas antigua -Tener en cuenta que se agrego GNU-.
• Marzo del '94 lanzada la versión 1 de Linux
• 1996 la versión 2 es lanzada soportando gran cantidad de
procesadores
• 1998 IBM, Compaq -Hoy parte de HP-, y Oracle anuncian el
soporte oficial a GNU/Linux.
• Torvalds escoge a Tux como mascota dibujado Por Larry Ewing.

14 www.sugeek.co
• 2002 El primer gusano conocido para GNU/Linux, Slapper-worm.
• 2007 Google presenta Android el sistema operativo para
Smartphones y Tablet's el cual está basado en GNU/Linux .
• Mayo de 2011 sale la versión 3.0
• 2013 GNU/Linux es el sistema base más usado en todo el mundo

Contenido Digital
El presente Libro posee contenido digital, el cual son vídeo tutoriales que
sirven como complemento de estudio y capacitación.

Los vídeos están alojados en la plataforma de Youtube® para un fácil


acceso.

Canal de Youtube: /SuGE3K

Curso Básico de GNU/Linux


Curso Medio GNU/Linux

Administración de Servidores GNU/Linux 15


16 www.sugeek.co
¿POR QUÉ GNU/LINUX?
GNU/Linux hoy en día es la mejor opción para muchas
empresas/gobiernos, educación y usuarios finales, ya sea para trabajos
de oficina, juegos, navegación por Internet, desarrollos, y prestar
servicios como servidores de alto rendimiento.

GNU/Linux en Empresas/Gobierno
GNU/Linux está en la capacidad de prestar la gran mayoría -por no decir
todos- los servicios que esta necesita, ya sea para estaciones de trabajo
o servidores, dándole la oportunidad a no depender directamente de una
tercera empresa extranjera para soportar su plataforma y la inversión
realizada al ser menor a largo plazo, puede ser reinvertida en la
empresa.

GNU/Linux es la mejor alternativa para aquellas entidades que desean,


seguridad, estabilidad, fiabilidad, sumándole a todo esto, el ahorro de
costos a largo plazo que una empresa obtiene al implementar una
solución de software libre.

En 5 puntos que se divide el gasto de una empresa al migrar de una


plataforma a otra, GNU/Linux solo requiere la inversión en tres.

En la siguiente tabla se relaciona los gastos que se incurren al


implementar software privativo y software libre.

S. Privado S. Libre
Licencia ✔ ✘
Capacitación ✔ ✔
Implementación ✔ ✔
Soporte ✔ ✔
Renovación ✔ ✘

GNU/Linux en la Educación
Usar GNU/Linux en entidades educacionales fomenta el desarrollo

Administración de Servidores GNU/Linux 17


mental de los estudiantes, ya que los alienta a desarrollar o indagar más
sobre dicho sistema, ayudando así al desarrollo integral del alumno y
depender de sí mismo y no de un tercero. Además de dicho desarrollo
integral que tendría el alumno, la utilización de herramientas de
software libre, hace que las instituciones inviertan menos en software y
mas en material didáctico.

Existen muchas distribuciones GNU/Linux enfocadas a la educación y


software para que los alumnos aprendan el manejo de este sistema,
pero GNU/Linux no solo se enfoca en el aprendizaje de su
funcionamiento, también alienta a los mas pequeños a aprender con
software sobre Matemáticas, Física, Cálculo, Química y muchas más
áreas de interés según sea el enfoque de cada institución.

Cabe destacar que la gran mayoría de estas herramientas son gratuitas


y acceso público, se recomienda realizar donaciones a las empresas
desarrolladoras de estos software, como ética y moral profesional.

GNU/Linux para Usted


Es y sera la mejor alternativa, ya que el uso normal de los usuarios es la
navegación por Internet, cliente de correo, y software ofimático, todo
esto se encuentra en GNU/Linux. GNU/Linux tiene una distribución para
cada uno, para el científico, matemático, diseñador, DJ, desarrollador,
etc.

Además dejar a un lado la piratería y estar tranquilo de que el software


que usa es totalmente legal, es otra de las ventajas de GNU/Linux, y
mencionar que no tendrá que preocuparse por los virus, troyanos y
demás infecciones que afectan al software privativo, esto no quiere decir
que no existan virus para GNU/Linux, solo que es mas difícil que sea
infectado.

18 www.sugeek.co
¿DONDE ESTA LINUX?
Actualmente Linux se encuentra en cualquier dispositivo que
imaginemos, solo por mencionar algunos:

• Automóviles
• Teléfonos Inteligentes
• Neveras
• Hornos Microondas
• Lavadoras
• Televisores
• Satélites
• Servidores
• Portátiles
• Tablets
• Navíos
• Y un largo etc.

Además grandes compañías y gobiernos usan hoy en día Software Libre


y GNU/Linux.

• Facebook
• Google
• IBM
• Gobierno Alemán
• Bolsas de Valores
• Ejércitos
• El 80% de los sitios web están sobre GNU/Linux
• El 98% de los 500 servidores de mayor rendimiento

Distribuciones
Como ya mencionamos, GNU/Linux tiene diferentes sabores para cada
uno, en esta ocasión mencionaremos algunos con sus derivados y a
quienes están enfocados.

• Debian (Servidores y Usuario Final)


◦ Ubuntu (Servidores y Usuario Final)
▪ Kubuntu (Usuario Final)
▪ Edubuntu (Instituciones educativas)
▪ Lubuntu (Usuario Final)

Administración de Servidores GNU/Linux 19


▪ Xubuntu (Usuario Final)
▪ Ubuntu Studio (Editores Multimedia)
▪ Linux Mint (Usuario Final)
▪ Zentyal (Servidores)
▪ ElementaryOS (Usuario Final)
• Slackware (Servidores y Usuario Final)
◦ Suse (Servidores)
▪ OpenSUSE (Servidores y Usuario Final)
• RedHat (Servidores)
◦ Fedora (Servidores y Usuario Final)
◦ Centos (Servidores y Usuario Final)
▪ Elastix (Servidor de Voz IP)

Faltan muchas distribuciones, las cuales las podrá observar en el sitio de


Distrowatch (www.distrowatch.com).

20 www.sugeek.co
SELECCIÓN DE LA DISTRIBUCIÓN E
INSTALACIÓN
Seleccionar la distribución ideal para lo que deseamos hacer, es muy
importante, aunque todas tengan el mismo núcleo, no todas se van a
comportar lo mismo. Por mencionar algunos aspectos, CentOS es la
distribución predilecta para servidores y la mejor alternativa para
implementar sistemas de PBX con Asterisk ya que la mayoría de
controladores para dichas implementaciones están desarrollados para
esta distribución pero no significa que no se pueda usar en otras tareas.
La otra distribución por excelencia es Debian, la cual es la alternativa
que en esta ocasión vamos a usar, ya que es una de las distribuciones
que mas se encuentran instaladas en el mercado de servidores, además
Ubuntu ha iniciado un proceso de expansión significativo, por lo tanto
este libro le servirá para la una como para la otra.

Ya que tenemos nuestra distribución seleccionada procederemos con la


descarga de la imagen y instalación.

La imagen de Debian la podremos descargar de


http://www.debian.org/CD/http-ftp/#stable.

Antes de iniciar una instalación, debemos de tener en cuenta lo


siguiente.

Finalidad: Se va usar como servidor o como estación de trabajo?


Teniendo en cuenta esto podremos guiarnos adecuadamente, la
finalidad de la distribución en este libro será como servidor.

Hardware: En algunas ocasiones Debian no es la mejor opción en cuanto


a drivers privativos, por tal motivo debe de tenerse en cuenta si el
hardware que tiene nuestro servidor es soportado por Debian, CentOS
en cambio posee en su interior ya dichos drivers privativos. Además de
esto debemos de tener en cuenta cuántos usuarios se van a conectar al
servidor y que servicio va a prestar, por que el consumo de un servidor
de correo no es lo mismo que un servidor web o de archivos.

Limitaciones: Si vamos a instalar a nuestro riesgo un servidor y no


poseemos la experiencia o conocimiento suficiente sobre la distribución
y servicio a implementar, es muy probable que se nos presenten muchos
problemas en el transcurso de la instalación. Por este motivo, es muy

Administración de Servidores GNU/Linux 21


importante documentarse bastante sobre lo que vayamos a hacer.

Instalación
Después de haber descargado y grabado en un DVD/USB la imagen de
Debian procederemos a realizar la instalación. Al iniciar el servidor con
el medio dentro de la unidad lectora, aparecerá la ventana de
instalación. Debian posee dos formas de realizar la instalación -además
de la forma avanzada-, una es la clásica y la otra es usando un entorno
gráfico, seleccionamos la normal la cual es sin interfaz gráfica.

Lo primero que vamos a ver es la selección del idioma, seleccionamos el


idioma que vamos a usar en el proceso de instalación.

Luego sigue la selección de ubicación del sistema (País) y la distribución


del teclado.

22 www.sugeek.co
Esperamos un momento a que algunos componentes se carguen para
poder continuar con la instalación.

Procederá a solicitar nombre del host, configuración de la red -si no


posee servidor DHCP-, dominio, contraseña para el usuario root, la
creación del usuario del sistema y su respectiva contraseña.

Administración de Servidores GNU/Linux 23


24 www.sugeek.co
Después de un tiempo de carga, nos encontraremos frente al sistema de
particionado del sistema.

• Guiado – Utilizar todo el disco


Esta opción realiza de forma automatizada el particionado y la
instalación del sistema.
• Guiado – Utilizar el disco completo y configurar LVM
Esta opción es usar todo el disco y de paso configurar el LVM
(Logical Volume Manager)
• Guiado – Utilizar todo el disco y configurar LVM Cifrado.
Lo mismo que la opción anterior solo que le agrega cifrado al
disco.
• Manual
Como su nombre lo indica, es crear de forma manual las
particiones y demás, esta es la que vamos a escoger.

Administración de Servidores GNU/Linux 25


Como observamos, muestra los discos que se tienen en este momento
configurados, el que se muestra es un SCSI3 en el puerto 0,0,0 y está
identificado como sda, además cuenta con una capacidad de 8,6GB y es
de referencia VBOX HARDDISK. Procedemos a seleccionarlo y a crear la
tabla de particiones, quedando como se muestra en la siguiente imagen.

26 www.sugeek.co
Seleccionamos el espacio libre y creamos una nueva partición de 250
MB -Tener cuidado con las unidades, escribir 250 MB tal cual, con el
espacio- luego nos preguntara que tipo de partición es, si primaria o
lógica, la seleccionamos como primaria e indicamos que va a ser en el
principio del disco, al indicarle que va a estar al principio del disco, sera
un poco mas rápido el arranque del sistema ya que en esta partición
vamos a crear la unidad de arranque.

En la siguiente pantalla se nos indicará las propiedades para particionar


el disco.

Administración de Servidores GNU/Linux 27


Esta partición al ser tan pequeña no tendrá mucha información pero será
una de las más importantes, ya que contará con los archivos necesarios
para arrancar el sistema. Desde este apartado podremos crear los
Volúmenes Lógicos, los RAIDS por software etc.

• Utilizar Como → Ingresamos y seleccionamos el sistema de


archivos ext4
• Punto de Montaje → Seleccionamos la ruta que deseamos montar
en dicha partición. En esta ocasión seleccionamos la ruta /boot.
• Opciones de Montaje → Por defecto
• Etiqueta → Indicar el nombre de la partición, no es necesario.
• Bloques Reservados → Se recomienda dejar 1%, el objetivo de
esta reserva es para que root pueda trabajar si se llena la
partición.
• Uso habitual → Podemos definir que vamos a hacer con esa
partición. Sin modificaciones.
• Marcar Como Arranque → Esta opción la activamos, ya que esta
partición es la que contiene los archivos de arranque.

Por último seleccionamos “Se ha terminado de definir la partición” y nos


devolverá a la configuración del disco nuevamente, pero esta vez ya
muestra la partición que está por escribirse.

28 www.sugeek.co
Seleccionamos el espacio libre, asignamos el restante de espacio,
indicamos que es una partición lógica, estará al principio del disco y
definimos el punto de montaje la raiz (/), indicamos el sistema de
archivos ext4 y seleccionamos nuevamente “Se ha terminado de definir
la partición”.

Ya con esto, vamos a finalizar el particionado y escribimos los cambios


en el disco, aparecerá una advertencia indicando que hace falta definir
el área de intercambio o /swap, esta partición es necesaria cuando el
equipo tiene poca memoria RAM, pero la veremos mas adelante para
administrarla mas eficazmente. A dicha advertencia le indicamos que
NO, y por último pide confirmación de querer continuar con la
instalación, procedemos con un SI y empezara la instalación. Dicha
instalación se demorara unos 10 minutos dependiendo del servidor
donde se esté realizando la instalación.

Luego de esperar un tiempo, solicitara si deseamos insertar otro DVD,


Marcamos NO.

Administración de Servidores GNU/Linux 29


Luego seleccionamos la descarga de repositorios por red, aparecerá
desde donde queremos descargar los diferentes repositorios, buscamos
nuestro país -o el país mas cercano, el cual, en ocasiones, no es la mejor
opción-, lo seleccionamos y continuamos con la instalación. Algunas
ocasiones mostrara mas de un solo servidor en dicho país,
seleccionamos el que mejor nos parezca.

Después de haber esperado un tiempo, preguntara si deseamos


participar en popularity-contest el cual enviará de forma anónima
información a los desarrolladores sobre los paquetes que usamos -es a
criterio de cada uno- y luego listara los programas que podemos instalar,
solo seleccionamos Utilidades de sistema y Servidor SSH -se selecciona
con la tecla espaciadora-.

Ya por último nos preguntará si deseamos instalar el GRUB a lo cual


respondemos afirmativamente.

30 www.sugeek.co
Esperamos a que termine la configuración, procederá a reiniciar y ya
tendremos el sistema listo para ingresar, ya sea con la cuenta root o con
el usuario que hemos creado durante el proceso de instalación.

Proceso de Arranque de GNU/Linux

• Inicio de la BIOS (UEFI/EFI)→ Esto es normal en cualquier sistema


ya sea Linux o no, la BIOS (Basic Input Output System) es el
encargado de reconocer todos los dispositivos que se encuentren
conectados al sistema o placa base del servidor o computador
(Unidades, RAM, Procesador, Bus, Etc) y según la configuración
se iniciará con la unidad seleccionada -normalmente para
ingresar a esta y cambiar algunas configuraciones se oprime F2,
F9, o Supr-.

¡IMPORTANTE!
Tener cuidado si se ingresa a esta memoria ya que podría dañar el
servidor. Se recomienda leer el manual de dicho sistema antes de hacer
cualquier actividad.

Hoy en día, la BIOS fue reemplazada por el EFI o UEFI el cual requiere
que el hardware instalado este firmado por el fabricante, esto con la
finalidad de que ningún hardware no firmado pueda tomar control sobre
el sistema.

• Ejecución del Disco con GNU/Linux → Después que la BIOS


detecta todos los dispositivos y arranca con la unidad
seleccionada, esta buscara dentro del MBR -O partición 0 de la
tabla GPT- de dicho disco la información necesaria o el encargado
de administrar la ejecución del(os) sistema(s) como podría ser el
GRUB.

Administración de Servidores GNU/Linux 31


• Selección del Sistema y Kernel → Luego que el GRUB carga, este
mostrará -o puede que no- los distintos sistemas instalados en el
servidor, así como las diferentes versiones de kernel instalados si
es un servidor GNU/Linux.

Trabajando con GRUB2


GRand Unified Bootloader es el encargado de la gestión de arranque de
los distintos Kernel o Sistemas Operativos que se encuentren instalados
en los discos del servidor.

GRUB2 Presente ya en la gran mayoría de distribuciones GNU/Linux, es


una versión reescrita de GRUB, mejorando notablemente la
compatibilidad con varios sistemas de discos, BIOS, etc.

Los archivos de inicio de GRUB2 se encuentra en /boot/grub, la


configuración del menú está en /boot/grub/menu.cfg, pero cuidado,
estos archivos NO se editan, ya que son los usados por el sistema, para
modificarlo, se usa el archivo /etc/default/grub, el cual contiene las
variables que define las opciones del GRUB2 y opciones por defecto de
los núcleos GNU/Linux.

Variable Significado
GRUB_DEFAULT Entrada del menú, seleccionado por defecto
es el 0
GRUB_HIDDEN_TIMEOUT Tiempo de menú Oculto, para después iniciar
el sistema predeterminado, para mostrarlo el
usuario tiene que oprimir [ESC] o [SHIFT]
GRUB_TIMEOUT Duración del menú del GRUB2 antes de
iniciar el sistema
GRUB_HIDDEN_TIMEOUT Define si se muestra o no el contador con
_QUIET true o false
GRUB_DISTRIBUTOR Linea de comandos que define la generación
automática del texto en la entrada del menú
GRUB_CMDLINE_LINUX_D Parámetros pasados al núcleo Linux,
EFAULT únicamente para entradas “normales”
GRUB_CMDLINE_LINUX Parámetros por defecto para todos los
núcleos Linux
GRUB_GFXMODE Resolución utilizada por el GRUB2

32 www.sugeek.co
Variable Significado
GRUB_TERMINAL Sin comentar y con valor console, se activa el
modo texto

Los menús se guardan en /etc/grub.d/

root@sugeek:~# ls -l /etc/grub.d/
total 56
-rwxr-xr-x 1 root root 7806 dic 6 05:06 00_header
-rwxr-xr-x 1 root root 5522 jul 19 2013 05_debian_theme
-rwxr-xr-x 1 root root 7877 dic 6 05:06 10_linux
-rwxr-xr-x 1 root root 6449 dic 6 05:06 20_linux_xen
-rwxr-xr-x 1 root root 6675 dic 6 05:06 30_os-prober
-rwxr-xr-x 1 root root 1388 jul 19 2013 30_uefi-firmware
-rwxr-xr-x 1 root root 214 jul 19 2013 40_custom
-rwxr-xr-x 1 root root 95 jul 19 2013 41_custom
-rw-r--r-- 1 root root 483 jul 19 2013 README

Estos archivos se ejecutan en orden de listado -orden alfanumérico de


forma predeterminada-. Es por este motivo que empieza con un valor
numérico. Los dos scripts de interés son 10_linux y 30_os-pober.

Si se verifica el primero, se encontrara como elemento particular los


bucles que buscan los núcleos Linux en /boot y en la raíz, así como
ramdisk iniciales, para detectar los distintos núcleos Linux y crear
automáticamente las entradas asociadas añadiendo los parámetros por
defecto.

En el segundo, verá que se ejecuta el comando os-prober, que busca el


resto de sistemas operativos en los restantes discos o dispositivos, como
Windows, Mac OS, Unix, etc.

Se puede agregar uno de forma manual utilizando la plantilla 40_custom


y para actualizar las tablas de grub se usa update-grub.

Recuperar Password de root por GRUB


En ocasiones se presenta que por algún motivo, se perdió la contraseña
del usuario root, para poderla recuperar se puede realizar por medio del
GRUB, acá explicamos como.

Al iniciar nuestro sistema y tener al frente el menú de GRUB, vemos en


la parte inferior que la opción e nos permite editar las líneas de boot,

Administración de Servidores GNU/Linux 33


luego nos dejará ver las líneas de arranque, seleccionamos la que
indican kernel y nuevamente presionamos e para poder editarlas, al
final de la línea del kernel -la que indica vmlinuz- agregamos
init=/bin/bash . Este cambio es temporal, en el próximo reinicio el
sistema restaura la configuración. Luego solo queda arrancar el sistema
con la combinación de tecla [CTRL] + [X].

Ya dentro del sistema nos queda solo montar las unidades en forma de
escritura, ya que están montadas en solo lectura, para ello ejecutamos
el comando mount -n -o remount,rw / ya con esto tenemos permisos de
root, y podremos cambiar nuestra contraseña con el comando passwd.

Después de haberlo cambiado, solo queda reiniciar el sistema y listo.

Init System V
El Proceso init, es el primer proceso que arranca y el último en ser
cerrado al apagarse el sistema, tiene como función principal ejecutar
todos los demás procesos de forma ordenada según sea la necesidad. Se
podría decir que el INIT es el proceso padre de los demás procesos y
tiene como identificador de proceso 1.

Este sistema de arranque secuencial tiene un defecto, el cual demora el


proceso de arranque del sistema, dicho problema es solventado con
SystemD.

La configuración del init lo podemos encontrar en /etc/inittab, sin este


archivo el sistema no podrá arrancar, y se tendría que recuperar desde
un medio externo.

¡IMPORTANTE!
Init o SystemV fue soportado hasta la versión 7 de Debian, desde la
versión 8 se inició el proceso de migración a systemd.

Niveles de Ejecución
Existen 6 niveles por el cual init podría iniciar al arrancar el sistema

• Init 0 o runlevel 0 → Apaga el Sistema


• init 1 → Monousuario sin entorno de red ni gráfico.
• init 2 → Multiusuario sin gestor de red ni gráfico.
• init 3 → Multiusuario sin entorno gráfico pero con entorno de red.
• init 4 → Sin uso.

34 www.sugeek.co
• init 5 → Predeterminado, con GUI, red y multiusuario.
• Init 6 → Reinicia el sistema

Dicha formas de arranque se podrán configurar en el archivo /etc/inittab,


además algunas distribuciones usan los niveles del 7 al 9 los cuales son
totalmente válidos.

Archivo /etc/inittab
A continuación se definen las variables de dicho archivo, así como su
estructura.

Id:Niveles:acción:comando

Campo Descripción
id Identificador único del proceso
Niveles Muestra los niveles de ejecución a los que se aplica esta
entrada.
Acción Identifica el modo en que el proceso que está
especificado en el campo del proceso se ejecutará.
Comando Define el comando o la secuencia de comandos para
ejecutar.

La acción es muy importante, ya que define las actividades de init


durante el arranque y cambio de nivel, las principales acciones son:

Acción Significado
initdefault Define el nivel por defecto durante el boot y el inicio de
init
sysinit Se ejecuta una única vez durante el arranque del
sistema
boot Idéntico al anterior pero después del sysinit
bootwait init espera el final de la ejecución del comando antes de
continuar leyendo el archivo inittab
off Se ignora la línea
once Se ejecuta el comando a cada cambio de nivel para los
niveles especificados

Administración de Servidores GNU/Linux 35


wait init espera al final de la ejecución antes de proseguir
respawn El comando se ejecuta para los niveles correspondientes.
Si el proceso termina, vuelve a arrancarse de nuevo
automáticamente. Es el caso para los terminales si un
usuario se desconecta de ellos.
powerwait Inicia el comando si el servidor es alimentado mediante
una UPS
powerfail Idéntico al anterior pero sin esperar el final de ejecución
del comando
powerokwait Se ejecuta el comando cuando se restablece la corriente
powerfailnow Comando de último recurso cuando la alimentación de
emergencia está casi vacía
ctrlaltdel Init recibe una señal SIGINT procedente de una
secuencia [CTRL][ALT][SUPR]

En este archivo también encontramos configuradas las consolas


virtuales conocidas como tty, las cuales se acceden con la combinación
de teclas [Ctrl ] + [Alt ] + [F1-F6 ] la [F7] en la mayoría de
distribuciones esta asociada a la interfaz gráfica.

Archivo /etc/init.d/rc
Dicho archivo o script inicia el nivel de ejecución deseado, es
responsable del inicio y de la parada de los servicios asociados cuando
el nivel de ejecución cambia.

Después que inicia nuestro sistema con sus respectivos demonios, se


procede a iniciar el servicio getty el cual es el encargado de iniciar la
sesión en una terminal, getty solicita usuario y contraseña para poder
ingresar al CLI, getty obtiene dicha información de los archivos
/etc/passwd y /etc/shadow así como los correspondientes mensajes de
bienvenida desde /etc/motd . Cuando se cierra la sesión de un terminal
getty realiza un respawn para solicitar nuevamente usuario y
contraseña.

Servicios en /etc/init.d
En este directorio se define qué servicios se inician, paran, o reinician
según el nivel seleccionado. Para cada nivel de ejecución podemos
encontrar un directorio.

36 www.sugeek.co
root@sugeek:~# ls /etc/rc
rc0.d/ rc2.d/ rc4.d/ rc6.d/ rcS.d/
rc1.d/ rc3.d/ rc5.d/ rc.local

Cuando el init arranca, llama primero a los scripts dentro del directorio
/etc/rcS.d que son servicios single, luego procederá a iniciar el sistema
según el runlevel seleccionado.

Cuando verifiquemos dichos directorios veremos algo como:

root@sugeek:~# ls /etc/rc5.d/
README S14nfs-common S17acpid S17exim4 S20rc.local
S01motd S16rsyslog S17atd S17ssh S20rmnologin
S13rpcbind S16virtualbox-guest-utils S17cron S19bootlogs

Como se podrá observar, cada servicio inicia con una S pero también
podría iniciar con una K, la S indica que inicia el servicio, la K que lo
“Mata”, luego le precede un número, el cual es el orden de inicio o
“Muerte” y por último el servicio que se ve afectado.

Systemd
Este demonio reemplaza a init o SystemV en Debian a partir de la
versión 8, aunque en algunas distribuciones como Fedora ya lo
implementan. Lo malo de este nuevo “Gestor de Procesos”, es el hecho
que solo es compatible con Linux, por este motivo hubo un revuelo
dentro de la comunidad Debian, ya que este no solo tiene núcleo Linux si
no también versiones con núcleo BSD y Hurd, haciéndolo
completamente incompatible.

Uno de los principales objetivos de systemd es unificar configuraciones


básicas de Linux y los comportamientos de servicios en todas las
distribuciones

Ventajas Generales
• Ejecución de procesos de inicio de forma asíncrona, permitiendo
ejecutar varios procesos al tiempo, aprovechando los hilos del
procesador y ejecutando el sistema más rápido.
• Gestión de dependencias de procesos más veloz al utilizar
invocaciones a funciones en el núcleo Linux.
• Posee interfaz gráfica en GTK para la gestión de procesos
llamada systemadm.

Administración de Servidores GNU/Linux 37


• Se genera registro de absolutamente todo.

Desventajas Generales
• Solo disponible para núcleo Linux
• Realiza funciones que no le corresponde como la gestión de Logs
y de dispositivos de forma dictatorial.
• Requiere reinicio para aplicar cambios al kernel correspondiente
a los modules que SystemD administra.
• Se apropia de las tareas programadas (Elimina a crontab)
• Los logs ya no se crean en texto plano si no en un archivo binario.

Unidades Objetos y Servicios


En Systemd, el concepto de nivel de ejecución ya solo existe para la
compatibilidad con SystemV. El estado deseado por el sistema después
de haber ejecutado los servicios se llama la unidad objetivo o target unit.
El componente básico de systemd es la unidad o unit. Existen Varias:
servicios (.services), sockets (.socket), dispositivos (.devices), o puntos
de montaje (.mount). Un objetivo es básicamente el punto de
sincronización entre unidades en espera. De este modo, dispondrá, por
ejemplo, de unidades objetivos correspondientes a cada nivel de
ejecución, pero puede llamarles como desee.

Las definiciones de las distintas unidades se encuentran en


/lib/systemd/system. Las unidades objetivos o los servicios que deben
ser gestionados por el sistema durante el arranque se ubican en
/etc/system/system, en forma de enlaces simbólicos o copias de los
archivos anteriores.

Puede activar o definir varios objetivos al mismo tiempo, no limitarse a


uno solo, único y pesado. Por ejemplo, un objetivo contendrá la
activación de los servicios de red, otro, los servicios de audio y un último
para el inicio del entorno gráfico, etc. Un Objetivo se puede agrupar en
otro.

Servicios
Los servicios acaban con el sufijo .service (Aunque SystemD intentará
determinar el objetivo de forma automática si no se le indica el sufijo). A
continuación se muestra un ejemplo con el contenido del servicio
bluetooth que representa sus dependencias y su comando de ejecución:

38 www.sugeek.co
root@sugeek:/lib/systemd/system# cat bluetooth.service
[Unit]
Description=Bluetooth service
After=syslog.target
[Service]
Type=dbus
BusName=org.bluez
ExecStart=/usr/sbin/bluetoothd -n
StandardOutput=syslog

[Install]
WantedBy=bluetooth.target

La línea WantedBy, indica que este servicio es necesario para el objetivo


bluetooth.target. Un objetivo no define qué servicios gestiona, pero cada
servicio define qué unidad es necesaria, por lo tanto, es factible
construir un árbol de dependencias.

Acciones
El comando sytemctl permite controlar la ejecución de unidades.

• Systemctl → Lista las unidades activas (Igual a sytemctl list-units).


• Systemctl –all → Muestra todas las unidades (activas, inactivas)
• systemctl –failed → Lista las unidades que han tenido problemas.
• systemctl stop unidad → Parar la unidad
• systemctl restart unidad → Reiniciar la unidad
• systemctl start unidad → Iniciar la unidad
• systemctl reload unidad → Recarga la configuración de la unidad.
• systemctl status unidad → Muestra el estado de la unidad.
• Systemctl is-enabled unidad → Comprueba si la unidad está
habilitada.
• Systemctl enable unidad → Activa la unidad para el arranque.
• Systemctl disable unidad → Desactiva la unidad para el arranque.
• Systemctl daemon-reload → Recarga systemd para tomar
cambios realizados.
• Systemctl reboot → Reinicia el sistema
• Systemctl poweroff → Apaga el Sistema
• Systemctl suspend → Suspende el sistema
• Systemctl hibernate → Hiberna el Sistema
• Systemctl hybrid-sleep → Pone el sistema el modo de reposo
híbrido o suspensión combinada.

Administración de Servidores GNU/Linux 39


Registros del Sistema
SystemD reemplaza al demonio SyslogD y Rsyslog, lo cual empieza a
controlar todos los mensajes generados por el sistema -esto es un
cambio paulatino, por el momento se tiene coexistencia-, y maneja los
registros con la herramienta journalctl.

El archivo de configuración de este nuevo sistema se encuentra en


/etc/systemd/journald.conf

• journalctl → Gestiona el Demonio systemd-journald.service


• journalctl -b → Muestra los mensajes de arranque, se puede
indicar el arranque que se desea observar, journalctl -b -2
muestra los mensajes desde los 2 últimos arranques.
• Journalctl -f → Muestra los registros que se van generando poco a
poco
• journalctl _PID=1 → Muestra el log de un proceso específico.
• Journalctl /bin/fsck → Muestra el log de un ejecutables específico.

Para mayor información de actividades con SystemD se recomienda


visitar el sitio oficial http://www.freedesktop.org/wiki/Software/systemd/
o usar las páginas manuales de systemd.unit, systemctl, journalctl.

40 www.sugeek.co
SISTEMA DE ARCHIVOS
GNU/Linux Tiene el sistema de archivos ext de forma predeterminada,
este a su vez ha ido evolucionando para irse adaptando a las
necesidades del mercado, ya que en su versión mas reciente, ext4, el
cual fue desarrollado por Mingming Cao, Dave Kleikamp, Alex Tomas,
Andrew Morton y otro grupo de personas, cuenta con las siguientes
características.

• Considerado un sistema de archivos de transición a btrfs


• Maneja volúmenes de hasta 1 Exbibyte (0,8 Exabytes)
• Ficheros individuales de hasta 16 Terabytes
• Compatibilidad con anteriores y futuras versiones
• Soporta hasta 64000 subdirectorios
• Desfragmentación en caliente de forma automática
• Chequeo de Archivos mas veloz
• Journaling para recuperarse ante desastres

El sistema de archivos btrfs a la escritura de este documento, aun se


encontraba en fase de desarrollo-pruebas, lo cual no se recomienda para
sistemas en producción -aunque RedHat ya lo recomienda-.

Dentro de las ventajas que tiene el sistema de archivos btrfs es:

• Las mismas ventajas del ext4


• Posibilidad de Crear snapshots en caliente
• Soporte de quotas por defecto.
• Verificación de Datos para corroborar integridad
• Permite funcionalidades de LVM
◦ Redimensionar las particiones en caliente
◦ Agregar discos en caliente y adaptarlo a una partición
“Virtual”.

Además GNU/Linux está en la capacidad de soportar la lectura/escritura


de sistemas de archivos como lo son el NTFS, Fat, Fat16, Fat32, XFS,
raiserfs, y muchos mas.

Directorios y Arquitecturas (FHS)


GNU/Linux se basa en un orden de sus directorios totalmente jerárquico
tomando como inicio el / “Slash” el cual será el punto de montaje de los
diferentes dispositivos y demás directorios, esto se denomina FHS (File

Administración de Servidores GNU/Linux 41


Hierarchy Standard).

/ Este es el directorio Raíz, es el directorio principal.


/bin Este directorio contiene los programas ejecutables que
cualquier usuario podrá usar o ejecutar.
/boot Contiene los archivos encargados del arranque del sistema.
/dev Archivos especiales o de dispositivos haciendo referencia a
los dispositivos físicos.
/etc Contiene los archivos/directorios de configuración de los
servicios prestados por el equipo, como el dhcp, dns, etc.
/etc/skel Archivos que al crear una cuenta nueva en el sistema se
copian estos archivos al directorio home de la cuenta
creada.
/home En este directorio se guardan la estructura de
directorios/archivos de los usuarios.
/lib Este directorio contiene las librerías compartidas que son
necesarias para ejecutar programas e iniciar el sistema.
/media Contiene las unidades montadas como CD/DVD.
/mnt Es similar a la anterior, pero a diferencia que en este
directorio se montan las unidades temporales como USB. (No
en todas las distribuciones es lo mismo).
/opt Este directorio contiene archivos estáticos o aplicaciones
independiente que traen sus propias librerías.
/proc Este directorio contiene información sobre el funcionamiento
y el hardware del sistema.
/root home del usuario root.
/sbin Similar al directorio /bin pero a diferencia de este, los
ejecutables dentro son solo ejecutados por usuarios con
permisos especiales o root.
/tmp Contiene los archivos temporales del sistema.
/usr Este directorio usualmente contiene la configuración de los
usuarios y aplicaciones que este usa.
/var Este directorio los archivos que cambian de tamaño
dinámicamente o por intervención del usuario, normalmente
se encuentran los logs del sistema y aplicativos.

42 www.sugeek.co
Toda esta información podrá encontrarla escribiendo en su consola el
comando man hier

Tipos de Archivos
En GNU/Linux todo son archivos.

• Archivos que tienen los datos del usuario


• Los Archivos que contienen y proveen la jerarquía de otros
Archivos (Directorios)
• Los archivos Enlaces que son como un “Acceso Directo” a otro
archivo.
• Los archivos de Dispositivos que encontramos en el directorio
/dev
• Archivos Binarios o Ejecutables

Inodo
El inodo es el encargado de tener toda la información sobre un archivo,
excepto el nombre, el cual está asociado dentro de la información que
contiene el archivo tipo catalogo o mas conocido como Directorio. El
número de un inodo es único dentro de un sistema de archivos, además
la cantidad de inodos dentro de un sistema de archivos define la
cantidad de archivos que se pueden crear.

El inodo tiene como información:

• Tamaño
• ID del periférico
• Propietario
• Grupo Propietario
• Número del inodo
• Permisos
• Fecha de último acceso
• Fecha de última modificación
• Información de ubicación de las partes del archivo dentro del
sistema de archivos
• Contador de enlaces

Con el comando df -i podremos observar el total de inodos de cada


sistema de archivos, así como los usados y libres.

Administración de Servidores GNU/Linux 43


Además, si queremos ver las características de un archivo con respecto
a su inodo, basta con escribir el comando stat.

root@sugeek:~# stat sugeek


Fichero: «sugeek»
Tamaño: 0 Bloques: 0 Bloque E/S: 4096
fichero regular vacío
Dispositivo: fe00h/65024d Nodo-i: 42619 Enlaces: 1
Acceso: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/
root)
Acceso: 2014-05-06 20:36:14.546982597 -0500
Modificación: 2014-05-06 20:36:14.546982597 -0500
Cambio: 2014-05-06 20:36:14.546982597 -0500
Creación: -

Identificando Dispositivos
La identificación de los dispositivos en GNU/Linux es relativamente fácil,
ya que según sea el tipo de dispositivo se identifica con letras y según la
cantidad, se enumera cada uno.

Como ejemplo, utilizaremos un disco sata que es reconocido como sd.

sda1
| | |_______El # ( 1, 2, etc) identifica la partición dentro del disco.
| |_________Identifica el Disco (a = 1er disco, b = 2do disco, etc).
|____________Identifica el tipo de dispositivo.

El resto de dispositivos se enumera de una forma similar -por no decir


igual-.

A continuación listamos algunos de los distintos tipos de dispositivos que


reconoce GNU/Linux.

44 www.sugeek.co
Dispositivo Nomenclatura Descripción
Disco Duro / DVD IDE hd
Disco Duro / DVD IDE hda Disco Maestro en el Bus IDE
0 (hda1 1ra partición de
hda)
Disco Duro / DVD IDE hdb Disco Esclavo en el Bus IDE
0 (hdb5 5ta partición de
hdb)
Unidad SCSI (SATA) sd
Unidad SCSI (SATA) sda 1ra Unidad SCSI conectada
al puerto sata0
Unidad SCSI (SATA) sdb 2da Unidad SCSI conectada
al puerto sata1
Unidad de DVD SCSI scd
Unidad de DVD SCSI scd0 1ra Unidad de DVD con
identificador mas bajo
Terminales o Consolas tty Usuarios Logueados
localmente
Terminales Remotas pty Usuarios Logueados de
forma remota
Puertos Seriales ttys
Interfaces de Red eth
Cableada
Interfaces de Red eth0 1ra interfaz de red
Cableada
Red Inalámbrica wlan
Red Inalámbrica wlan0 1ra interfaz de red
inalámbrica

Periféricos
Todos los dispositivos como teclados, mouse, auriculares, impresoras,
son asociados a un archivo, y estos dispositivos son catalogados en
archivos especiales según sea el caso y se podrán observar al listar el
contenido del directorio /dev/, el primer carácter de los permisos indican

Administración de Servidores GNU/Linux 45


el tipo de archivo -Tema visto mas adelante en permisos-.

• c → Dispositivo tipo carácter, envía información bit por bit, o solo


un Byte a la vez, ideal para mouse, teclados, puertos paralelos,
puertos de comunicación (com), terminales.
• b → Dispositivo tipo bloque, como son las unidades de
almacenamiento sea cual sea.
• s → Dispositivo tipo socket, lo cual permite una comunicación
entre los distintos procesos del sistema.
• Otros Archivos → Como /dev/null o /dev/zero, el primero es el
“Agujero Negro” de GNU/Linux, el segundo genera una secuencia
de ceros.

Los dispositivos para su reconocimiento y funcionamiento deben de ser


cargados durante el inicio del sistema o después de este. El servicio
encargado de la carga de los dispositivos es udev -su respectiva
configuración la encontramos en /etc/udev/-, el cual crea el archivo
solamente de los dispositivos conectados -en caliente o en frío- para la
comunicación del sistema con el kernel. Para obtener información de
cierto dispositivo, se utiliza el comando udevadm info --query=all
--name /dev/dispositivo

¡IMPORTANTE!
udev es reemplazado por systemd en la versión 8 de Debian.

Al listar el contenido del directorio /dev/ con ls -l en la parte donde


normalmente está el tamaño del archivo, se identifican con el número
mayor, el driver del dispositivo, y el número menor se suele identificar el
periférico o dispositivo.

Como es conocido por la gran mayoría de personas, las USB soporta una
inimaginable cantidad de dispositivos, los cuales deben de ser
catalogados según su función y versión, ya que no es lo mismo un medio
de almacenamiento masivo a un teclado, y en ocasiones es necesario
bloquear el acceso a medios masivos por USB pero que el teclado siga
funcionando, para ello existen unos módulos especializados para este
tema, los cuales están integrados en usbcore el cual tiene las api para
soportar las distintas versiones de USB como lo son la versión 1, 1.1, 2.0
y 3.0, las cuales se encuentran soportados dentro de la api xhci_hcd
-última API desarrollada por Intel para soportar todas las versiones de
USB-. Para obtener mas información al respecto, dirigirse a
https://www.kernel.org/doc/htmldocs/usb/.

46 www.sugeek.co
TRABAJANDO CON GNU/LINUX
El Trabajo con GNU/Linux por consola o shell (CLI), para algunos es el
impedimento para usar GNU/Linux, pero existen soluciones como
Zentyal, la cual es una distribución GNU/Linux para servidores basada
en Ubuntu con una GUI via web y su uso es literalmente fácil, o paquetes
independientes como Webmin.

Cuando iniciemos nuestro servidor Debian, nos encontraremos con una


solicitud de login (getty), el cual podría ser con root o con el usuario que
se creó durante la instalación. Solamente es ingresar con dichas
credenciales para poder trabajar con nuestro sistema. Tendremos una
consola con la siguiente estructura del prompt.

user@host: ~ $
| | | |_Tipo de Usuario, $ es usuario normal, # es el usuario root
| | |___Indica el path o ruta donde se encuentra el usuario.
| |_______Indica el nombre del host.
|_____________Nombre del usuario con el que se esta logueado.

Los Shells poseen tanto comandos internos como externos -la gran
mayoría suministrado por GNU-. Para saber si un comando es interno o
externo solo es ingresar el comando type y el comando que deseamos
saber si es interno o externo.

El resultado con el comando cd sería el siguiente:

usuario@sugeek:~$ type cd
cd es una orden interna del shell

Y con el comando fdisk:

usuario@sugeek:~$ type fdisk


fdisk is /sbin/fdisk

De esta manera sabemos si un comando es interno o externo a la shell.

Los Shell usan tres flujos de entrada/salida estándar:

• Stdin → Es el flujo de entrada estándar y proporciona los datos de


entrada a los comandos, normalmente el teclado.
• Stdout → Es el flujo de salida estándar y muestra los datos de
salida de los comandos, normalmente el monitor.

Administración de Servidores GNU/Linux 47


• Stderr → Es el flujo de error estándar y muestra datos de salida
de error de los comandos, Normalmente el monitor.

Estructura de los comandos


La ejecución de órdenes tiene una interpretación organizada en donde,
si no se cumple dará como resultado un error en la orden o en casos
extremos, daño del sistema.

La sintaxis común para ejecutar un comando es:

comando opciones archivo/directorioafectado


rm -r /home/suge3k/*

Las opciones, en la mayoría de ocasiones van precedidas por un guión ,


como vimos en el ejemplo anterior.

Para cancelar la ejecución de un comando basta con realizar la


combinación de teclas [Ctrl ] + [C ].

Para saber la ubicación de un comando usamos el comando which. Si


existen mas comandos con la misma estructura solo indicamos la opción
-a.

root@sugeek:~# which fdisk


/sbin/fdisk

Comando man
Para conocer sobre un comando -también contamos con el comando
info, el arrojará información correspondiente sobre el comando indicado
o la opción --help del comando-, nos ayudamos con la página manual de
este, man. Por ejemplo la página manual del comando rm seria:

man rm

Pero man, también tiene sus opciones, por ejemplo existe el comando
passwd el cual sirve para cambiar la contraseña de un usuario, pero al
mismo tiempo existe el archivo /etc/passwd el cual contiene información
de los usuarios. Para diferenciar uno del otro se utilizan secciones, man
siempre busca en la sección 1 y va bajando poco a poco hasta encontrar
la coincidencia.

48 www.sugeek.co
Sección Contenido
1 Instrucciones ejecutables o comandos del shell
2 Llamadas del Sistema (API del núcleo)
3 Llamadas de las Librerías (funciones c)
4 Archivos Especiales (contenido de /dev )
5 Formato de los Archivos (/etc/passwd, /etc/hosts, etc.)
6 Juegos, Salvapantallas, Programas Varios, etc.
7 Varios, Comandos no estándares que no encuentran sitio
en otra parte
8 Comandos de Administración del sistema Linux
9 Subprogramas del núcleo (Normalmente vacío)

Ya teniendo en cuenta la anterior tabla, si ejecutamos solo man passwd


nos mostrará:

PASSWD(1) User Commands PASSWD(1)

NAME
passwd - change user password

SYNOPSIS
passwd [options] [LOGIN]

DESCRIPTION
The passwd command changes passwords for user accounts. A
normal user may only change the password for his/her own
account, while the superuser may change the password for any
account. passwd also changes the account or associated
password validity period.

Pero si ejecutamos man 5 passwd, le estamos indicando que tome como


referencia la sección 5, y tendremos como resultado:

PASSWD(5) File Formats and Conversions PASSWD(5)

NAME
passwd - the password file

DESCRIPTION
/etc/passwd contains one line for each user account, with
seven fields delimited by colons (“:”). These fields are:

Administración de Servidores GNU/Linux 49


· login name
· optional encrypted password
· numerical user ID
· numerical group ID
· user name or comment field
· ...

En ocasiones es normal olvidar el comando exacto, pero sabemos parte


de su contenido, así que utilizamos la opción -k indicando el contenido
del comando, así que utilizamos man -k passwd tendremos como
resultado -este resultado es igual que ejecutar el comando apropos-:

update-passwd (8) - Actualiza /etc/passwd, /etc/shadow y


/etc/group de forma segura
chgpasswd (8) - update group passwords in batch mode
chpasswd (8) - update passwords in batch mode
fgetpwent_r (3) - get passwd file entry reentrantly
getpwent_r (3) - get passwd file entry reentrantly
gpasswd (1) - administer /etc/group and /etc/gshadow
grub-mkpasswd-pbkdf2 (1) - generate hashed password for GRUB
lppasswd (1) - add, change, or delete digest passwords.
pam_localuser (8) - require users to be listed in /etc/passwd
passwd (1) - change user password
passwd (1ssl) - compute password hashes
passwd (5) - the password file
passwd2des (3) - RFS password encryption

Vemos los distintos comandos que poseen el contenido de passwd.

La opción -f del comando man traerá los comandos relacionados


directamente que posean la palabra indicada.

root@sugeek:~# man -f passwd


passwd (5) - the password file
passwd (1ssl) - compute password hashes
passwd (1) - change user password

Apagar el sistema
• shutdown -h now → Apaga el sistema
◦ shutdown -r now → Reinicia el Sistema
◦ shutdown -h HORA:MIN & → Apagado planificado
◦ shutdown -c → Cancelar el apagado planificado
• reboot → Reinicia el sistema
• halt → Apaga el sistema
• init 0 → Apaga el sistema

50 www.sugeek.co
Verificando el estado del Sistema
Es muy importante saber cómo se encuentra nuestro sistema antes de
hacer cualquier cosa, ya sea porque el sistema está lento o solo para
saber conexiones y demás.

Comando top
Este comando mostrará por completo la información del estado del
sistema como por ejemplo, el consumo de procesador y memoria RAM
en tiempo real, así mismo cuántos usuarios se encuentran conectados
en ese momento, hace cuanto esta encendido el servidor, etc. Al escribir
top en la consola nos aparecerá una pantalla como la siguiente.

1. En esta parte mostrara información como:


◦ Usuarios conectados
◦ Carga del sistema (Ultimo Minuto, Últimos 5 Minutos, y
últimos 15 min)
◦ Procesos en ejecución
◦ Uso de procesador.

Administración de Servidores GNU/Linux 51


◦ Memoria RAM y swap.
◦ En la tercera línea (CPU) muestra información importante
como el porcentaje usado por los usuarios (us) por el kernel
(sy), porcentaje de procesos con baja prioridad (ni),
porcentaje de procesos inactivos (id), el porcentaje de
procesos en espera (wa), Hadware Interrupts (hi) y Software
Interrupts (si), el steal time (st) es usado generalmente con
VM.

2. Este apartado muestra los procesos que están corriendo en el


sistema, con el usuario que lo está ejecutando y su respectivo PID
(Process ID).

Algunos de los comandos de top son:

• t → Muestra u oculta el resumen, la 2da y 3ra línea


• m → Muestra u oculta información de la memoria, la 4ta y 5ta
línea
• A → Ordena los procesos según consumo de recursos
• r → Cambia la prioridad de un proceso
• k → Mata el proceso indicado
• q → Cierra top
• u → Busca los procesos del usuario indicado

El comando htop es más amigable que top.

Comando free
Con este comando tendremos información del uso de la memoria RAM y
swap.

Como podemos observar, muestra la información en kilobytes y en


ocasiones es difícil leerlo, así que usamos la opción m para que muestre
las cantidades en sumas redondas como megabytes o la opción g para
que los muestre en gigabytes.

Comando w
Con este sabremos qué usuarios están conectados en nuestro sistema,

52 www.sugeek.co
los procesos que están corriendo, cuanto tiempo lleva el sistema
encendido, la carga del mismo los últimos minutos (1, 5 y 15).

Comando vmstat -s
Este comando es similar que indicar cat /proc/meminfo y la información
arrojada hace referencia las cargas del sistema.

sugeek@sugeek~$ vmstat -s
8079804 K total memory
5013668 K used memory
2318480 K active memory
2387252 K inactive memory
3066136 K free memory
113348 K buffer memory
3087384 K swap cache
7812092 K total swap
7812092 K free swap
275687 non-nice user cpu ticks
2583 nice user cpu ticks
59034 system cpu ticks
1755387 idle cpu ticks
39844 IO-wait cpu ticks
22 IRQ cpu ticks
7264 softirq cpu ticks
0 stolen cpu ticks
1460577 pages paged in
2548113 pages paged out
0 pages swapped in
0 pages swapped out
14374381 interrupts
23585894 CPU context switches
1384197460 boot time
191137 forks

Comando who y whoami


El comando who indicará quienes están conectados y por qué consola, y
whoami mostrará la identificación del usuario actual.

Administración de Servidores GNU/Linux 53


Comando id y groups
Con el comando id obtenemos información sobre el usuario actual, si
escribimos id nombreusuario obtenemos información sobre el usuario
solicitado, como su id, grupo principal y grupos a los cuales pertenece.

uid=0(root) gid=0(root) grupos=0(root)

Con el comando groups, obtendremos información sobre los grupos a los


cuales pertenece el usuario actual o solicitado.

Comando lspci
Mostrará la información de las ranuras y adaptadores relacionadas con
el bus PCI del sistema. Se puede obtener mayor información agregando
la opción v o vv.

root@sugeek:~# lspci
00:00.0 Host bridge: Intel 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel 82371AB/EB/MB PIIX4 IDE (rev 01)
00:02.0 VGA InnoTek Systemberatung GmbH VirtualBox Graphics Adapter
00:03.0 Ethernet: Intel 82540EM Gigabit Ethernet Controller (rev 02)
00:04.0 System peripheral: InnoTek GmbH VirtualBox Guest Service
00:06.0 USB controller: Apple Inc. KeyLargo/Intrepid USB
00:07.0 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:0b.0 USB controller: Intel 82801FB/FBM/FR/FW/FRW USB2 EHCI
00:0d.0 SATA controller: Intel 82801HM/HEM (ICH8M/ICH8M-E) (rev 02)

Comando lsusb
Mostrara la información de los puertos usb. Podemos mostrar mas
información con la opción v.

root@sugeek:~# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Comando lscpu
Mostrará información sobre los procesadores.

root@sugeek:~# lscpu
Architecture: i686
CPU op-mode(s): 32-bit

54 www.sugeek.co
Byte Order: Little Endian
CPU(s): 1
On-line CPU(s) list: 0
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 42
...

Comando uname
Este comando es usado para obtener información del kernel. Por si solo
no muestra mucha información así que hay que usarlo con la opción a

root@sugeek:~# uname -a
Linux franksanabria 3.13.0-58-generic #97~precise1-Ubuntu SMP Wed
Jul 8 14:07:17 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Podemos tener información específica como el hardware (-m), nombre


del servidor (-n), la versión del núcleo (-r) tipo de procesador (-p),
versión del sistema (-v) o nombre del sistema (-s).

Comando uptime
Este comando es usado para saber cuánto tiempo lleva encendido el
sistema.

root@debian:~# uptime
09:02:19 up 51 min, 2 users, load average: 0,00, 0,01, 0,05

Muestra primero la hora actual del sistema, cuánto tiempo ha estado


encendido (1 día 5 horas y 32 min), usuarios conectados y carga del
sistema.

Comando lshw
Este comando similar al comando hwinfo y dmidecode -este último
consulta directamente a la BIOS, en ocasiones no confiable- el cual
mostrará la información del hardware del sistema, como board,
procesador, RAM, HD, etc. Es un comando con una salida muy extensa.

Administración de Servidores GNU/Linux 55


Comando lsblk
Con este comando podremos conocer todos los discos, en forma de
árbol, la información es obtenida del sistema de archivos.

sugeek@sugeek:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 698,7G 0 disk
├─sda1 8:1 0 237M 0 part /boot
├─sda2 8:2 0 7,5G 0 part [SWAP]
├─sda3 8:3 0 46,6G 0 part /
└─sda4 8:4 0 644,4G 0 part /home
sr0 11:0 1 1024M 0 rom

Comando df
Este comando mostrará el uso de espacio de los discos y unidades de
almacenamiento, usando la opción h podremos comprender las unidades
de medida.

Como podemos observar la 1ra partición del disco duro principal (sda)
tienen un tamaño de 76GB y tiene usados 6,8 G y disponibles 65G, con
un porcentaje de ocupación del 10%.

Comando blkid
Con este comando obtendremos información de los UUID de los discos
duros, para poderlos montar con su respectivo ID, evitando fallas de
montaje al arranque del sistema. Este comando es similar al usar ls -l
/dev/disk/by-uuid y ls -l /dev/disk/by-label

root@sugeek:~#blkid
/dev/sda1: UUID="23287c8d-45f2-4b2c-bf9c-465060141f03" TYPE="ext4"
/dev/sda2: UUID="9fe6a649-530f-4ce7-a215-add68169d792" TYPE="swap"
/dev/sda3: UUID="9e638ed8-41c1-410f-938b-ba0f3ba6813d" TYPE="ext4"
/dev/sda4: UUID="4795786e-ab9d-40d4-abd9-657d026ce0a7" TYPE="ext4"

56 www.sugeek.co
Comando fdisk -l
Aunque este comando permite particionar, Lo veremos a mayor
profundidad mas adelante, pero en esta ocasión lo utilizaremos para
visualizar información de los discos duros.

Como podemos observar, identifica el disco /dev/sda el cual tiene un


tamaño de 750GB e información de las particiones, sectores, etc.

Comando last y lastb


last muestra un listado de los últimos usuarios conectados al sistema
-desde el archivo /var/log/wtmp- e información relevante.

Administración de Servidores GNU/Linux 57


Se observa que usuario ingreso o está conectado (still logged in), así
como la consola, fecha y hora.

Con lastb (Obtiene la información de /var/log/btmp) obtenemos los


intentos de conexión fallidos. Por ejemplo, en un sistema donde no
existiera el usuario 'fulano' resultaría obvio que alguien está tratando de
obtener acceso remoto, adivinando usuario:contraseña.

Comando du
Este comando permitirá ver el tamaño de una carpeta, archivo, o del
contenido de una carpeta. Con las opciones s y h mostrará el tamaño de
la carpeta y de forma legible.

usuario@sugeek:/$du -sh /var


1,3G /var

Comando dmesg
Se usa para desplegar los mensajes que se mostraron en pantalla
cuando se inicio (boot) el sistema. Ideal para validar que todos los
módulos, drivers y demonios arrancaron adecuadamente y no
presentaron fallas, o si presentaron fallas poder tomar las medidas
correctivas.

Comando arch
Con este comando sabremos cual es la arquitectura del sistema, lo cual
también se podría obtener con comando uname -i.

58 www.sugeek.co
Comando pstree
Este mostrará los procesos de manera organizada, mostrando que
procesos pertenecen a cuál servicio. Se recomienda usarlo con las
opciones Agu.

Comando ps
Mostrara los procesos que está ejecutando el usuario actual sobre la
consola, para poder ver por completo todos los procesos que se están
ejecutando se recomienda el uso de las opciones aux.

Además, el comando puede visualizarse según el gusto del usuario, por


ejemplo ejecutar ps -eo user,comm,cmd,ppid,pid,%cpu,%mem --sort -
%mem dará como resultado:

-Si se le antepone el comando watch podríamos tener una actualización


cada x segundos que deseemos-.

Every 1,0s: ps aeo user,comm,ppid,pid,%cpu,%mem --sort -%mem


Sun Aug 2 22:50:09 2015

Administración de Servidores GNU/Linux 59


USER COMMAND PPID PID %CPU %MEM
root Xorg 1956 2055 5.9 0.3
1000 bash 2583 3803 0.0 0.1
1000 watch 3803 30889 0.2 0.0
1000 ps 30960 30961 0.0 0.0
root getty 1 1872 0.0 0.0
root getty 1 1885 0.0 0.0
root getty 1 1893 0.0 0.0
root getty 1 1867 0.0 0.0
root getty 1 1889 0.0 0.0
root getty 1 2902 0.0 0.0
1000 watch 30889 30959 0.0 0.0
1000 sh 30959 30960 0.0 0.0

Comandos ifconfig, ip
Ifconfig además de ser un comando para mostrar información de las
interfaces de red, también es un comando para asignación de dirección
IP lo cual veremos mas adelante.

• Ifconfig -a → Mostrará información de todas las interfaces

• ifconfig interfaz → Muestra información sobre la interfaz


solicitada. Ejemplo: ifconfig eth0

60 www.sugeek.co
ip es un comando también muy completo -mas completo que ifconfig-,
con este podremos saber si la interfaz está conectada, si está
funcionando, crear rutas, etc. Pero para este apartado solo nos interesa
saber el estado de las interfaces.

• ip link→ Mostrará si la interfaz se encuentra arriba o abajo así el


cable esté conectado.

root@sugeek:~# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc
pfifo_fast state DOWN mode DEFAULT group default qlen 1000
link/ether c8:60:00:b4:af:f1 brd ff:ff:ff:ff:ff:ff

• Ip addr → Muestra además del estado de la interfaz si esta arriba


o abajo, mostrara información extra sobre el direccionamiento ip.

root@sugeek:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
state UP qlen 1000
link/ether 08:00:27:ad:a6:72 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.91/24 brd 192.168.1.255 scope global eth0

Comando netstat
Este comando permitirá verificar las conexiones que posee el sistema,
algunas de las opciones son:

• -i → Permite verificar el estado de las tarjetas de red


• -a → Permite visualizar todas las conexiones, para todos
los protocolos, incluidos los puertos de escucha.
• -at → Lista todas las conexiones TCP.

Administración de Servidores GNU/Linux 61


• -au → Lista toda las conexiones UDP.
• -l → Lista las conexiones de escucha.
• -s → Muestra estadísticas por protocolo como IP, ICMP,
TCP, UDP. Se puede especificar con -su para udp -st para
TCP.
• -tp → Muestra el ID del proceso que usa el puerto.
• -c → Muestra la información cada 5 segundos, se
recomienda combinar con a o t. Ejemplo: -cat para
mostrar cada 5 seg información de conexiones TCP.
• -A → Permite especificar el protocolo a consultar, como
inet, inet6, unix, ipx, ax25, netrom y ddp.
• -n → Muestra las tablas de enrutamiento.

Comando ss
Aunque similar al comando netstat, este comando solo muestra las
conexiones activas y puertos abiertos del sistema enfocados a sockets.

Entre sus opciones encontramos:

• a → Mostrar todas las conexiones


• n → Mostrar de forma numérica (No resolver el FQDN)
• p → Mostrar el proceso que está usando el socket
• t → Mostrar sólo TCP
• u → Mostrar sólo el UDP
• s → Mostrar el resumen de las conexiones

root@sugeek:~# ss -na
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 :::111 :::*
LISTEN 0 128 *:111 *:*
LISTEN 0 128 :::59507 :::*
LISTEN 0 5 127.0.0.1:53 *:*
LISTEN 0 128 127.0.0.1:631 *:*
LISTEN 0 128 127.0.0.1:5944 *:*
LISTEN 0 128 *:56963 *:*

Si solo nos interesa saber que conexiones tenemos por el socket que
utiliza el puerto 80 le agregamos al final del comando sport = :80 -tener
en cuenta los espacios-.

Comandos route -en y arp -en


Estos comandos mostraran en pantalla la tabla de rutas que tiene el

62 www.sugeek.co
sistema y la tabla arp del mismo.

Archivos de Estado del Sistema


En el sistema de archivos o path /proc, podremos encontrar toda la
información del sistema, vamos a listar alguno de los archivos.

• cat /proc/cpuinfo → Muestra la información del procesador, similar


a lscpu.
• cat /proc/meminfo → Muestra información sobre la memoria RAM.
• cat /proc/net/dev → Muestra información de los dispositivos de
red y estadísticas.
• cat /proc/mdstat → Muestra el estado de los RAID montados.
• cat /proc/scsi/scsi → Muestra información de los dispositivos SCSI.

Archivo /etc/services
En este archivo encontramos todos los servicios que tiene nuestro
sistema y el puerto de escucha que tiene configurado. Muy útil cuando
se crean reglas de cortafuegos.

Alias
Los alias son seudónimos que se asocian a un comando, ya sea con las
opciones establecidas o no. Por ejemplo, el comando ls ya tiene por
defecto un alias.

user@sugeek:~$ alias
alias ls='ls –color=auto'

Como vemos la salida al ejecutar alias sin opciones, muestra que alias
tenemos establecidos en ese momento. Para poder establecer un alias
para dicha shell solo basta escribir el comando alias mas el nuevo
“comando” y que comando se va ejecutar, por ejemplo vamos a crear un
alias llamado update.

root@sugeek:~#alias update='apt-get update && apt-get upgrade -y'

Como podemos observar, asociamos el nuevo “Comando” update, el


cual al escribirlo en realidad ejecuta apt-get update y luego si y sólo si el
anterior comando se ejecutó de forma correcta ( &&) se ejecuta apt-get
upgrade -y.

Administración de Servidores GNU/Linux 63


Los alias son de gran ayuda cuando queremos agilizar un poco los
procesos, pero es un arma de doble filo, ya que si la persona usa
muchos alias, podría olvidar cómo utilizar los comandos verdaderos.

Los cambios sólo se mantendrán en la sesión hasta que el equipo sea


reiniciado nuevamente, cuando esto sucede dichos alias desaparecen,
para solventar esto, solo se crean los alias en el archivo .bashrc que se
encuentra en el home del usuario.

Manejo de Archivos y Directorios

Directorios:
Es una colección de Archivos y otros directorios de forma jerárquica.
Estos archivos también se le denominan archivos tipo catálogos.

/ = Representa el directorio raíz.

Para conocer el listado de directorios principales de la distribución


usamos el comando man hier .

Rutas Absolutas:
Señalan la ubicación de un archivo o directorio desde el directorio raíz
del sistema de archivos. Por ejemplo es una ruta absoluta
/home/dir1/arc1.fil que señala la ubicación de arc1.fil desde la raíz del
sistema de archivos.

Rutas Relativas:
Señalan la ubicación de un archivo o directorio a partir de la posición
actual del cursor. Por ejemplo esto una ruta relativa dir1/arc1.fil la cual
señala al archivo arc1.fil dentro del directorio dir1 en la ubicación actual
del cursor.

Trabajando con Directorios:


• pwd → Imprime en Pantalla la ubicación/ruta del cursor.
• cd path→ Cambia de un directorio al directorio indicado.
◦ cd .. → Devuelve al directorio superior.
◦ cd ../.. → Devuelve a 2 directorios superiores.

64 www.sugeek.co
◦ cd → Ingresa al directorio del usuario.
◦ cd ~ → Ingresa al directorio del usuario.
◦ cd - → Devuelve al directorio anterior.
• ls → Lista el contenido de una carpeta.
◦ ls -a → Lista todo el contenido incluyendo los archivos
ocultos.
◦ ls -h → Muestra el contenido con cifras entendibles por
nosotros.
◦ ls -i → Muestra el ID del inodo.
◦ ls -l → Muestra el contenido en modo lista con información
adicional como:
drwxr-xr-x 7 sugeek sugeek 12288 jul 4 09:29 Descargas
Permisos Propietario Grupo Size Fecha Mod Nombre Dir.
◦ ls -r → Muestra de Forma inversa el contenido listado.
◦ ls -s → Muestra el tamaño del archivo o carpeta.
◦ ls -S → Organiza la salida de mayor tamaño a menor
◦ ls -t → Muestra el contenido por hora/fecha de
modificación, mas reciente a la mas antigua.
◦ ls -R → Muestra el contenido de los subdirectorios.
• Mkdir → Crea un directorio. EJ: mkdir dir1
◦ mkdir -p → Permite crear directorios y subdirectorios al
tiempo. EJ: mkdir -p dir1/dir2/dir3
• rmdir → Permite borrar un directorio si y solo si está vacío.
◦ rmdir -p → Borra un subdirectorio.

Trabajando con Archivos


• touch → Crea un archivo
• file → Muestra el tipo de archivo
• cat → Muestra el contenido de un archivo o varios
• tac → Muestra el contenido de un archivo de forma inversa
• head → Muestra las 10 primeras líneas de un archivo.
◦ head -20 → Muestra las 20 primeras líneas de un
archivo, el 20 puede ser cambiado por cualquier valor
numérico entero.
• tail → Muestra las 10 últimas líneas de un archivo.
◦ tail -20 → Muestra las 20 últimas líneas de un archivo,
el 20 puede ser cambiado por cualquier valor numérico
entero.
◦ tail -f → Va actualizando el archivo a medida que se
van generando datos.
• wc → Muestra información de líneas, palabras y caracteres
de un archivo.

Administración de Servidores GNU/Linux 65


• more → Muestra la información de un archivo de texto en
forma páginada.
• less → Es similar a more pero a contrario de este, less
permite devolverse a visualizar una parte del archivo que
ya ha sido pasada.
• strings → Permite visualizar los caracteres ASCLL de un
archivo ejecutable.

Trabajando con Archivos y Directorios


• cp → Permite copiar un archivo o directorio, su estructura es:
cp archivo/directorio rutadestino
◦ cp -i → Copia de forma interactiva, solicita confirmación de
realizar la copia si encuentra un archivo con el mismo
nombre.
◦ cp -r → Copia recursiva, cuando se requiere copiar todo el
contenido de un directorio.
◦ cp -f → Copia forzada.
◦ cp -n → No sobrescribe archivos con el mismo nombre.
◦ cp -p → Perseverante, mantiene la información de los
metadatos del archivo origen (permisos, fecha, etc)
• rm → Permite borrar un archivo o directorio
◦ rm -r → Permite borrar de forma recursiva todo el
contenido del directorio indicado.
◦ rm -i → Solicita confirmación para eliminar un archivo
◦ rm -f → Fuerza la eliminación de un archivo
◦ En ocasiones cuando un archivo inicia con un carácter
especial como un guión, es necesario indicar la
finalización de las opciones del comando con guión guión.
--. Por ejemplo para eliminar el archivo “-file.txt” es
necesario escribir rm -r -- -file.txt
• mv → Permite mover un archivo o directorio y también es
usado para cambiar nombres, su estructura es: mv
archivo/pathamover rutadestino/nombrenuevo
◦ mv -n → No sobrescribe si el archivo ya existe.
◦ mv -i → Solicita confirmación para mover el archivo.

Trabajando con la familia del comando z


La familia del comando z permite verificar y trabajar con archivos que se
encuentran dentro de un archivo comprimido, se usan indicando z antes
del comando a usar, zcat, zless, zgrep, etc.

66 www.sugeek.co
• zcat miarchivo.txt.tar → Muestra el contenido del archivo
comprimido
• zdiff miarchivo1.txt.tar miarchivo2.txt.tar → Compara los 2
archivos comprimidos

Shell globbing
En ocasiones cuando se está trabajando con muchos archivos, es
necesario utilizar “Comodines” ya sea para buscarlos y modificarlos, o
solamente listarlos.

• El asterisco * → Es el comodín general, el cual es usado para


reemplazar x cantidad de caracteres, Ej: ls *.php Listará todo el
contenido de la carpeta que tenga archivos con extensión .php.
Ej2: ls file.* Listará todos los archivos que se llamen file sin
importar su extensión.
• El signo de Interrogación ? → A diferencia de * el ? Solo remplaza
un carácter. Ej: ls ?ile.txt Listara los archivos que empiecen con a-
z ó 0-9 ó A-Z y que continué con ile.txt
• Corchetes [ ] → Muestra los archivos que contengan cualquier
carácter indicado dentro de los corchetes. Ej: ls file[AB].txt
Listará los archivos fileA o fileB continuando con la extensión .txt.
Ej2: ls file[a-t]* Listará cualquier archivo llamado file continuando
con una letra dentro del rango a hasta la t, y cualquier extensión.

Archivos Enlaces
Los archivos enlaces simbólicos (softlinks) son aquellos archivos
especiales que hacen de acceso directo hacia otro archivo que se ubica
en un path diferente. Se identifica que es un archivo enlace cuando
posee una L al principio de los permisos.

lrwxr-xr-x 7 sugeek sugeek 1 jul 4 09:29 Descargas → /root/Descargas

Como se observa al principio de la línea nos muestra una L indicando


que es un archivo enlace, y al final indica la dirección en donde se
encuentra el archivo original.

La forma para crear un archivo enlace es ln -s archivooriginal


nombreenlace.

Si listamos el contenido de nuestro directorio con ls -li veremos que este


tiene un código de inodo totalmente distinto al archivo original.

Administración de Servidores GNU/Linux 67


root@sugeek:~#ls -li | grep Descargas
932179 drwxr-xr-x 7 root root 1 jul 4 09:29 Descargas
root@sugeek:~#ln -s /root/Descargas /home/sugeek/Descargas
root@sugeek:~#ls -li /home/sugeek/ | grep Descargas
4922879 lrwxr-xr-x 7 sugeek sugeek 1 ago3 12:29 Descargas →
/root/Descargas

Además de estos tipos de enlaces, tenemos un enlace “duro” o hardlink


el cual mantiene el inodo original, a diferencia del enlace simbólico.

Para crear un enlace duro se usa ln archivoriginal nombreenlace

root@sugeek:~#ls -li | grep Descargas


3932179 drwxr-xr-x 7 root root 1 jul 4 09:29 Descargas
root@sugeek:~#ln /root/Descargas /home/sugeek/Descargas
root@sugeek:~#ls -li /home/sugeek/ | grep Descargas
3932179 drwxr-xr-x 7 sugeek sugeek 1 jul 4 09:29 Descargas

Como se observa, al crear un enlace duro, dicho enlace contiene la


misma información del inodo, a diferencia del softlink que lo crea con
nueva información de inodo. Para eliminar un Hardlink solo basta con
borrar alguno de los 2 archivos, puede ser el archivo fuente, no hay
problema.

¡IMPORTANTE!
Los Hardlinks no se pueden usar entre dos unidades de almacenamiento
distintas ya que cada unidad o partición poseen sus propios inodos.

68 www.sugeek.co
COMPILANDO EL KERNEL
Cuando existen nuevas características, o mejoras de seguridad en Linux,
es recomendable compilar un nuevo kernel, para ello se explicará el
paso a paso de cómo compilarlo.

Descargar el kernel a nuestro sistema desde www.kernel.org, en esta


ocasión se descarga el kernel 3.16:

root@sugeek:/usr/src# wget
http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.16.tar.bz2

Después de descargar procedemos a desempaquetarlo:

root@sugeek:/usr/src# tar jxvf linux-3.16.tar.bz2

Ingresamos al directorio:

root@sugeek:/usr/src# cd linux-3.16

Limpiamos cualquier configuración previa y copiamos la configuración


de nuestro sistema, esto con el fin de “adaptar” mejor nuestro nuevo
kernel:

root@sugeek:/usr/src# make mrproper


root@sugeek:/usr/src# cp /boot/config-3.8.0-39-generic
/usr/src/.config

Ó Configuramos nuestro Kernel a instalar según sean nuestros


requerimientos:

root@sugeek:/usr/src# make menuconfig

Luego de haber configurado a nuestro gusto el nuevo Kernel, le damos


salir y seguimos con el siguiente comando para compilar el kernel:

root@sugeek:/usr/src# make

Luego a instalarlos:

root@sugeek:/usr/src# make modules_install

Administración de Servidores GNU/Linux 69


Procedemos a instalar el kernel:

root@sugeek:/usr/src# make install

Instalamos la imagen init:

root@sugeek:/usr/src# mkinitramfs -o /boot/initrd.img-3.16 3.16

Actualizamos el Grub:

root@sugeek:/usr/src# update-grub

Por último reiniciamos el sistema:

root@sugeek:/usr/src# reboot

Ya el próximo inicio del sistema, este iniciara con el nuevo kernel, lo


podemos validar con el comando uname -r

Eliminar un Kernel Antiguo


Para poder eliminar un kernel antiguo procedemos con lo siguiente:

¡IMPORTANTE!
No eliminar un kernel antiguo si aún no se han realizado todas las
pruebas pertinentes, dejarlo por lo menos un mes de forma de Backup.

Ejecutamos el comando dpkg –l | grep linux-image y como resultado


tendremos los kernels instalados, luego de saber que kernel deseamos
desinstalar procederemos a eliminarlo con el comando aptitude remove
–-purge linux-image-3.# y por último ejecutamos dpkg –l | grep linux-
headers y realizamos la misma actividad anterior pero con el header
correspondiente.

El kernel queda eliminado, pero aun falta la actualización del grub para
que tome los cambios, ejecutamos update-grub.

Gestión de Módulos
Los módulos son archivos que nos permiten gestionar algunas de las
características de nuestro sistema, asociados al kernel.

70 www.sugeek.co
Comando lsmod
La finalidad de este comando es poder verificar qué módulos tiene
cargados el sistema /lib/modules/mikernel/.

root@debian:~# lsmod
Module Size Used by
nfsd 173686 2
nfs 260905 0
nfs_acl 12463 2 nfs,nfsd
auth_rpcgss 32012 2 nfs,nfsd
fscache 31662 1 nfs
lockd 57192 2 nfs,nfsd
sunrpc 143216 6 lockd,auth_rpcgss,nfs_acl,nfs,nfsd
loop 17851 0
parport_pc 22036 0
parport 31375 1 parport_pc
video 17459 0
thermal_sys 17752 1 video
battery 12986 0
snd_pcm 53473 0
snd_page_alloc 12867 1 snd_pcm
snd_timer 22478 1 snd_pcm
snd 42962 2 snd_timer,snd_pcm
soundcore 12921 1 snd
i2c_piix4 12480 0
psmouse 68555 0
evdev 13175 4
pcspkr 12554 0
serio_raw 12848 0
i2c_core 19116 1 i2c_piix4
ac 12552 0
button 12817 0
crc32c_intel 12659 0
ext4 302460 2
crc16 12327 1 ext4
jbd2 51626 1 ext4
mbcache 12938 1 ext4

La primera columna indica el nombre del módulo cargado, La segunda


da el tamaño del módulo, la tercera suministra un contador de
utilización (cuantos componentes del sistema acceden al módulo) y la
última columna proporciona la lista de módulos que dependen del
módulo cargado.

En realidad lsmod solo organiza la información contenida en el archivo


/proc/modules.

Administración de Servidores GNU/Linux 71


Comando modinfo
Con este comando se obtiene información necesaria sobre un módulo.

root@sugeek:~# modinfo asus_wmi


filename: /lib/modules/3.8.0-39-
generic/kernel/drivers/platform/x86/asus-wmi.ko
license: GPL
description: Asus Generic WMI Driver
author: Corentin Chary <corentin.chary@gmail.com>, Yong Wang
<yong.y.wang@intel.com>
srcversion: 62CA511243680BE13E8641A
depends: sparse-keymap,wmi,video
intree: Y
vermagic: 3.8.0-39-generic SMP mod_unload modversions

Comando depmod
Este comando actualiza el árbol de dependencias de cada uno de los
módulos ubicados en el archivo
/lib/modules/VersionDelKernel/modules.dep, dicho archivo contiene 2
columnas, la primera indica el módulo a cargar -ruta- y la segunda indica
los módulos que se deben de cargar para que el primero cargue.

Si presentamos problemas con algunos módulos con sus dependencias,


debemos reestructurar con el comando depmod -a.

Comando insmod
Este comando permite cargar un módulo que este fallando, pero se debe
de tener cuidado con las dependencias del módulo, ya que si no se
cargan primero no se podrá cargar el módulo indicado.

root@sugeek:/lib/modules/3.2.0-61-generic/kernel/fs/fat# insmod
fat.ko
root@sugeek:/lib/modules/3.2.0-61-generic/kernel/fs/fat# insmod
vfat.ko

Como podrá observar, primero se cargo el fat.ko, ya que el módulo


vfat.ko depende de fat.ko

root@sugeek:/lib/modules/3.2.0-61-generic# grep vfat.ko modules.dep


kernel/fs/fat/vfat.ko: kernel/fs/fat/fat.ko

Con la opción -k permite la limpieza automática, liberando al sistema de

72 www.sugeek.co
módulos que no esté utilizando, ganando así un poco de recursos

Comando rmmod
A diferencia de insmod, este los descarga, pero si dicho módulo se
encuentra utilizado o asociado a otro módulo no se podrá descargar.
Para descargar un módulo del sistema, se procede a quitar primero el
módulo principal y luego sus módulos de dependencias, todo lo contrario
a insmod.

Comando modprobe
Este comando engloba y facilita la carga o descarga de módulos, a
diferencia de insmod o rmmod los cuales deben de cumplir ciertos
“Pasos” para cargar o descargar los módulos, con modprobe se carga el
módulo y sus dependencias de una sola vez. Con la opción -r permite
descargar un módulo del sistema siempre y cuando no este siendo
utilizado

Archivo /etc/sysctl.conf y comando sysctl


Sysctl nos permite cambiar parámetros del kernel sin tener que reiniciar
el sistema

Los parámetros a modificar se encuentran en /proc/sys/ , algunos de los


mas interesantes son:

• dev → Establece los parámetros de configuración de los


dispositivos conectados
• fs → Los parámetros relacionados con los sistemas de ficheros,
inodes, quota, etc
• kernel → Comportamiento general del kernel
• net → Contiene los parámetros para configuración de la red
• vm → Se utiliza para la configuración de la memoria virtual.

La estructura del comando sysctl es :

sysctl opción variable=valor

Las opciones más habituales son :

• -a → Muestra todos los valores disponibles


• -w → Establece el valor indicado

Administración de Servidores GNU/Linux 73


• -p → Carga en sysctl los valores definidos en el archivo
/etc/sysctl.conf

La opción -w solo permitirá establecer la “característica” en la sesión


actual, y desaparecerá cuando se reinicie el sistema, para evitar que
esto ocurra hay que escribir los cambios en /etc/sysctl.conf

Algunas Opciones de Interés


Las siguientes configuraciones se realizan directamente al archivo
/etc/sysctl.conf, Para que sean aplicados los cambios de este archivo se
usa el comando sysctl -p.

• Forwarding de paquetes IP, con el fin de poder usar reglas de


redirección con iptables y nuestro sistema funcione como router.

net.ipv4.ip_forward = 1

• Desactiva las respuesta del kernel a las peticiones ARP. Esta


técnica es útil a la hora de configurar dos equipos con la misma
dirección IP.

net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

• Indicar al sistema que use mas la memoria RAM en vez de la


Swap, ideal para equipos con 8GB de RAM o mas. El valor normal
es de 60, siendo un valor menor, menos uso de la swap.

◦ vm.swappiness=30

• Si nuestra máquina no tiene varias direcciones IPs, es interesante


activar el rp_filter, que rechaza paquetes cuyo origen no se
corresponde con una dirección alcanzable por la interfaz. Esta
opción nos puede ayudar a evitar IP spoofing:

◦ net.ipv4.conf.all.rp_filter=1
◦ nett.ipv4.conf.default.rp_filter=1

74 www.sugeek.co
HERRAMIENTAS GNU/LINUX
Comando find
Busca archivos o directorios con el argumento escrito. Vamos a observar
algunas estructuras “Básicas”, para mas información no dude en
consultar el manual del comando.

• find . → Busca en el directorio actual.


• find path -name “nombrearchivo.txt” → Busca por nombre
del archivo tal cual.
• find path -iname “nombrearchivo” → Busca el archivo
ignorando mayúsculas y minúsculas
• find -type → Busca por tipo de archivo ( L F D) L = Link, F =
File, D = Directory. Ej: find -type F “*.odt”
• find /home/Files -iname '*.exe' -delete → Busca los
ejecutables y procede a eliminarlos.
• Find . -user usuario → Busca todos los archivos
perteneciente al usuario indicado, se puede hacer lo
mismo pero con el grupo indicando -group.
• Find -size +100k → Buscar archivos mayores a 100k, se
puede definir el menos (-) para indicar que sea de menor
tamaño al indicado.
• Find -atime → (access time), busca en la fecha del último
acceso, se entiende acceso como una lectura del archivo o
simplemente un listado.
• Find -mtime → (modification time), busca la fecha de la
última modificación, dicha modificación es directamente al
contenido del archivo.
◦ Find . -mtime 1 → Busca archivos modificados dentro
de las pasadas 24 Horas
◦ find . -mtime -3 → Busca archivos modificados hace
menos de 3 días
◦ find . -mtime +4 → Busca archivos modificados
mayores a 4 días.

Buscar tipos de archivos y proceder a copiar a otro directorio.

find /home/Files -iname '*.avi' -exec cp {} /home/Videos \;

Busca archivos con extensión .avi, procede a ejecutar el comando cp,

Administración de Servidores GNU/Linux 75


toma el resultado de la búsqueda {} y los copia en la carpeta indicada,
lo mismo seria para mover archivos, solo seria cambiar cp por mv.

Buscar archivos con más de 4 días y proceder a borrar, ideal para las
“Papeleras” en servidor de archivos.

Find /home/papelera -mtime +4 -exec rm -r {} \;

Además de los comandos anteriores, es posible utilizar acciones lógicas,


como AND (-a) / OR (-o) / NOT ( !).

Find . ! -name “*.doc”

Busca todos los archivos, excepto los .doc

Comando locate
Similar a find pero menos “Completo”, este requiere actualizar su base
de datos para incluir los archivos nuevos. Para actualizar la base de
datos de locate se usa el comando updatedb.

◦ Estructura del comando → locate archivo/pathabuscar

Comando date
Muestra la hora/fecha del sistema en ingles.

usuario@sugeek:~$ date
jue jul 11 16:12:50 COT 2013

• Establecer Hora y fecha al sistema → Para poder


establecer la hora y fecha del sistema se debe de tener en
cuenta la estructura del comando el cual es.

date MMDDhhmmyyyy Donde MM = Mes, DD = Día , hh =


Hora, mm = Minutos y yyyy = Año

NOTA: La hora siempre debe de ser en formato de 24H

• Conocer que día sera dentro de X tiempo:

usuario@sugeek:~$ date -d "3 days"


dom jul 14 16:14:20 COT 2013

76 www.sugeek.co
Como se pudo observar, imprime que día sera dentro de 3 días, el days
se puede cambiar por week, year, month, hour, minute, second, next,
ago,

• Saber que día fue hace X tiempo:

usuario@sugeek:~$ date -d "3 days ago"


lun jul 8 16:18:43 COT 2013

Algunos ejemplos que por si solos se explican.

usuario@sugeek:~$ date -d "next monday"


lun jul 15 00:00:00 COT 2013
usuario@sugeek:~$ date -d "last monday"
lun jul 8 00:00:00 COT 2013
usuario@sugeek :~$ date -d "3 years 2 month 4 weeks 4 days 10 hours
30 minutes 6 seconds"
vie oct 14 02:55:32 COT 2016
usuario@sugeek :~$ date -d "48 hours ago"
mar jul 9 16:26:09 COT 2013
usuario@sugeek:~$ date -d "-48 hours"
mar jul 9 16:26:40 COT 2013

Además de eso, podremos organizar la salida del comando con el


símbolo + y el símbolo %. Para mayor información favor visitar la página
man de date.

Para modificar la ubicación de nuestro sistema, solo basta con ejecutar


el comando tzselect el cual modifica el timezone de nuestro sistema con
una series de preguntas, el archivo que modifica el comando es
/etc/timezone.

NOTA: Si deseas sincronizar el reloj de la BIOS con el del sistema


escribimos hwclock --hctosys y si deseamos sincronizar el reloj del
sistema con el de la bios escribimos hwclock --systohc.

Comando ntpdate
Es el comando que permite tener los servidores y equipos sincronizados
con la hora local. Ideal para servidores de LDAP, AD, DNS, Archivos,
Logs, etc.

Para sincronizar el reloj del sistema con un servidor, se utiliza el

Administración de Servidores GNU/Linux 77


comando ntpdate -U Server donde server puede ser el nombre del
servidor o la IP de este.

Si deseamos configurar un servidor de forma persistente, tendremos que


modificar el archivo /etc/ntp.conf y buscar las líneas que inicien con
server y agregar el servidor que deseemos.

Comando cal
Muestra el Calendario según el año seleccionado.

• cal → Muestra el calendario del año actual.


• cal year → Muestra el calendario del año solicitado
• cal month year → Muestra el calendario del Mes/Año Solicitado

usuario@sugeek:~$ cal 2 2055


Febrero 2055
do lu ma mi ju vi sá
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28

Comando History
Guarda el historial de comandos de la sesión

• history → Muestra el historial de comandos escritos.


• !# → Llama el comando que se encuentra en el número de la
línea indicado. (Se remplaza # por el Número)
• !! → Ejecuta el comando previo
• !$ → Llama el argumento del último comando ejecutado
• Ctrl + r → Permite buscar en el historial de comandos escritos
• history -c → Borra el historial de comandos
• .bachrc → En este archivo que se encuentra en el home de cada
usuario, se puede configurar el tamaño del history (Disminuir o
aumentar los comandos recordados, fecha, etc).
• Con el comando:
echo "export HISTTIMEFORMAT='%F %T : '" >> $HOME/.bashrc
Podremos Indicarle a la shell que guarde el historial con la fecha
de ejecución del comando.

78 www.sugeek.co
128 2013-10-16 20:29:32 : sudo service minidlna force-reload
129 2013-10-16 20:29:32 : sudo /etc/init.d/vboxdrv setup
130 2013-10-16 20:29:32 : ifconfig
131 2013-10-16 20:29:32 : ping 192.168.2.5
132 2013-10-16 20:29:32 : sudo service minidlna force-reload
133 2013-10-16 20:29:32 : ifconfig

Comando time
Indica cuanto tiempo se demora en ejecutar el comando indicado. Ej:
time ls

Comprimir y Descomprimir

Comando tar
Sirve para comprimir y descomprimir archivos en formato tar.

• tar -x → Extraer el Contenido de un archivo comprimido .tar


• tar -v → Muestra los archivos descomprimidos o procesados
• tar -f → Indica el nombre de archivo que va a quedar
• tar -z → Extraer/Comprimir archivo en gzip
• tar -j → Extraer/Comprimir archivo en bzip2
• tar -J → Extraer/Comprimir archivo en xz (El mejor)
• tar -A → Agrega archivos a otro archivo comprimido
• tar -p → Mantiene los permisos del los archivos/carpetas a
comprimir
• tar -zxvf → Extrae el contenido del archivo gzip2 mostrando los
archivo procesados
• tar -cvzf Nombre.tar.gz archivoacomprimir→ Crea un archivo con
formato gzip
• tar -tvf → Visualizar el contenido del archivo comprimido
• tar -xtv Directorio/Archivo/Específico/a/Extraer → Extraer un
archivo/directorio específico.
• tar –backup=t → Renombra el archivo si ya se encuentra creado,
ideal para realizar Backups
• tar --exclude=”~*” → No toma en cuenta los archivos iniciados
por ~, podría ser cualquier archivo como *.mp3, no crea backup
de archivos .mp3.

Comando zip y unzip


Comprime y descomprime en formato zip. EJ: zip a.zip dir_a

Administración de Servidores GNU/Linux 79


Comando gzip y gunzip
Comprime y descomprime en formato gzip. Se recomienda el uso de tar.

Comando wget
Permite descargar archivos desde un servidor. Se puede descargar sitios
web completos y demás.

Su sintaxis es: wget -opción rutadearchivoadescargar

Un ejemplo complejo es:

root@sugeek:/# wget -r -S -b -p -U Mozilla -l1 -H -np -nd -A.xls*


-t1 -N -o milog.log -i list

Lo anterior indica:

• r → Recursivo, descarga todos los directorios y archivos posibles


• S → Imprime las respuestas header del servidor
• b → Background, el comando se ejecutara en segundo plano
• p → Descarga todo lo necesario para mostrar adecuadamente el
sitio
• U → Indica el tipo de “Navegador” usado, el famoso “user agent”
• l → Indica que siga los enlaces pero solo en un primer nivel
• H → Indica que descargue los archivos de otros dominios que
estén enlazados al indicado
• np → No volver al directorio padre
• nd → No cree la estructura de directorios, solo descargue los
archivos indicados.
• A → Archivos que deseo descargar del sitio
• t → Números de intentos para descargar un enlace, por defecto
son 20.
• N → Indica que no descargue el archivo 2 veces
• o → Indica el archivo log, ideal si se usa el comando en
Background
• i → Si tenemos varios dominios para descargar, en un archivo lo
podemos escribir y wget lo podrá interpretar.

Comando bc
La calculadora que podemos usar desde la consola, mas completa que
expr, que aparte de sumar y restar puede realizar cálculos con una

80 www.sugeek.co
precisión de varios decimales (expr solo muestra resultados enteros),
cambiar de base numérica o programarla, etc.

root@sugeek:~# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software
Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.

Al escribir bc nos deja el prompt listo para trabajar con expresiones


matemáticas. Para salir solo escribimos quit o halt. Con la opción -q
ocultamos la leyenda del copyright.

root@sugeek:~# bc -q
5+5 #Suma que realizo
10 #Resultado
scale=3 #Indico que quiero trabajar con hasta 3 decimales
27/68 #Realizo la división
.397 #Resultado de la división
quit #Cierro el programa

Podemos definir las variables para trabajar con estas, pero dentro del
entorno del programa tenemos unas ya predefinidas como:

• scale → Permite definir cuantos decimales podrá tener el


resultado
• last → Esta variable almacena el último resultado
• ibase → Define la base de entrada, Binario, Decimal, Hexadecimal
• obase → Define la base de salida, Binario, Decimal, Hexadecimal,
ideal para convertir Decimales a Binarios o Hexadecimales y
viceversa.

root@sugeek:~$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software
Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
scale=5 #Definimos los decimales a tener
myvar=1
1/myvar #Operacion a resolver utilizando mi variable
1.00000 #Resultado de la operación, teniendo en cuenta los decimales
indicados
ibase=10 #Definimos la base de entrada
obase=2 #Definimos la base de salida

Administración de Servidores GNU/Linux 81


1+1 #Nuestra operación a base decimal
10 #Resultado de nuestra operación a base binario

Si queremos tener operaciones matemáticas más complejas tenemos


que ejecutar el bc -l para cargar la librería matemática:

• s (x) → Seno de x, en radianes


• c (x) → Coseno de x
• a (x) → Arcotangente de x
• l (x) → Logaritmo neperiano de x
• e (x) → Exponencial de x
• j (n,x) → Función de Bessel de un entero de orden n de x

82 www.sugeek.co
EDITOR DE TEXTO VI
Aunque no es el mas fácil de usar, pero si es el editor mas completo de
todos en cuanto a consola, además ya viene instalado de forma
predeterminadas en todas las distribuciones GNU/Linux.

VI requiere que se aprendan todos los comandos, vamos a ver solo


algunos. Es de destacar que VI tiene libros dedicados a su uso.

Nota: VI ya permite desplazarnos con las teclas de cursor.

Funcionamiento
Existen 3 modos de funcionamiento:

• Comando: Las inserciones representan comandos. Se accede a


ellos al presionar [Esc]. Cada tecla o combinación de teclas
activa una acción.
• Inserción: Se trata de la inserción de texto clásico, se accede al
presionar [i] o [a] desde la ventana comando.
• Linea de Comandos: Una línea en la parte inferior de la pantalla
permite insertar comandos especiales, validada con la tecla
[Intro]. Se accede a ella presionar, en modo comando la tecla [: ]

Cuando se abre VI, por defecto está en modo comando. Para empezar a
introducir texto hay que teclear un comando de inserción de texto.

Comandos

Inserción de datos
Se deben de efectuar las acciones siguientes en modo comando. Antes
se debe pulsar [Esc][i] o [Esc][a], o [Esc][:].

Comando Acción
a Añadir después del carácter actual
A Añadir texto al final de la línea actual.
i Insertar delante del carácter actual

Administración de Servidores GNU/Linux 83


Comando Acción
I Insertar texto al inicio de la línea
o Añadir una línea debajo de la línea actual
O Insertar una línea encima de la línea actual

Salir y Guardar
Recuerde que [Esc][:] Significa que el comando se introduce en la línea
de comandos, se introduce el comando y luego se oprime [Intro].

Comando Acción
ZZ Guarda el archivo y Sale
:q! Sale sin guardar
:q Sale si no se modificó el archivo (En caso contrario se
usa :q! O :wq O :x)
:w Guarda el Archivo, se puede indicar el nombre
:wq o :x Guarda y Sale
1,10w fichero Guarda las líneas de 1 a 10 en el fichero indicado

Corrección
Así como en los procesadores de texto tenemos retroceso y suprimir, en
VI tenemos:

Comando Acción
x Suprimir el carácter debajo del cursor
X Borra el carácter delante del cursor
r<c> Sustituye el carácter bajo el cursor por el carácter
indicado <c>
dw Borra la palabra desde el cursor
d$ o D Borra desde el cursor hasta el final de la línea
dO Borra desde el principio de la línea hasta el cursor
df<c> Borra todo hasta el carácter indicado

84 www.sugeek.co
Comando Acción
dG Borra todo hasta la última línea, incluyendo la línea
actual
d1G Borra todo hasta la línea 1, incluyendo la línea actual
dd Borra la línea actual
u Cancela la última acción
:u# Cancela los últimos cambios indicados. :u5 cancela los
últimos 5 cambios
Se pueden repetir estos comandos, como 5dd suprime 5 líneas; 4dw,
borra 4 palabras; 5x, 5 Caracteres, etc.

Desplazamiento
Aunque en las nuevas versiones de VI ya se aceptan las teclas de cursor,
aun posee sus teclas propias de desplazamiento.

Comando Acción
h Ir a la izquierda
l Ir a la Derecha (L minúscula)
k Ir hacia arriba
j Ir hacia abajo
0 (cero) Principio de Linea
:0 Primera línea del archivo
$ Fin de Linea
:$ Última línea del archivo
w Ir a la palabra siguiente
b Ir a la palabra anterior
[Ctrl] + f Avanzar una pantalla igual que Av Pag
[Ctrl ] + b Volver una pantalla igual a Re Pág
G Última línea del archivo, similar a :$
#G Salta a la línea indicada (10G salta a la 10ma línea)
:# Igual a la anterior, :10 salta a la 10ma línea.

Administración de Servidores GNU/Linux 85


Búsqueda de texto
Está es una de las características especiales que tiene VI, ya que no solo
permite buscar palabras o frases sencillas, si no que también permite
realizar criterios de búsqueda.

Para buscar una palabra se usa en el modo comando insertando el


carácter / y luego el criterio de búsqueda, por ejemplo para buscar
Debian en un archivo se escribe /Debian, pero esta búsqueda la realiza
desde la posición del cursor, para hacerlo forma inversa se usa ? En vez
de /.

Lo anterior solo busca una sola vez, para seguir la búsqueda se usa
comando n -hacia delante- y N -hacia atrás-.

Algunos criterios son:

• /[CcBb] → Da como resultado las palabras que inicien con C, c, B


o b.
• /[A-Z]e → Todo lo que empiece con una mayúscula y continué
con una e
• /[A-Za-Z0-9] → Todo lo que empiece con una mayúscula, una
minúscula o una cifra.
• /[^a-z] → Intervalo negativo, todo lo que NO empieza con una
minúscula.
• /co.a → El punto sustituye un carácter. Coma, cola, coca, etc.
• /Au*o → El * Indica cualquier cantidad de caracteres. Una palabra
que inicie con Au y termine con “o” sin importar la cantidad de
caracteres en medio.
• /.* → Una cadena cualquiera de tamaño variable
• /^Auto → El ^ indica que sera buscado y deberá de estar al
principio de una línea
• /Auto$ → El $ indica que sera buscado y deberá de estar al final
de una línea

Comandos de sustitución
Para sustituir algún texto, hay que posicionarse al principio de la cadena
a modificar, luego teclear uno de los comandos siguientes. A
continuación, teclee simplemente su texto.

86 www.sugeek.co
Comando Acción
cw Sustituye la palabra corriente
c$ Sustituye hasta el final de la línea
c0 (Cero) Sustituye hasta el principio de la línea
cf<c> Sustituye hasta el próximo carácter indicado
c/<rech> Sustituye hasta la próxima coincidencia de la cadena
indicada

Copiar y Pegar
El comando v permite una selección visual para poder seleccionar el
texto a copiar mediante las teclas de cursor, luego se pueden usar los
siguientes comandos.

• El comando d corresponde a cortar el texto seleccionado


• Nos desplazamos hasta donde deseas pegar el texto y usamos el
comando p

Una manera mas “Rápida” es la utilización de los comandos:

• yy → Permite copiar la línea actual


• #yy → Permite copiar las siguientes X líneas

Sustitución
La sustitución permite reemplazar de manera automática varias
coincidencias por otra cadena.

:1,$s/[Ll]inux/LINUX/g

Sustituye desde la 1ra línea (1) hasta la última línea ($), todas las
coincidencias encontradas de Linux o linux y los remplaza por LINUX.

Edición avanzada
Comando Acción
:r fichero Inserta el contenido del fichero indicado desde la
posición del cursor
:! cmd Ejecuta el comando indicado

Administración de Servidores GNU/Linux 87


Comando Acción
.r! cmd Se inserta el resultado del comando ejecutado en la
posición del cursor
:e fichero Carga el fichero para editarlo
:e# Conmuta entre los diferentes archivos abiertos, es
igual a [Alt ] + [Tab]

Comando set
El comando set permite dotar de características al editor.

• :set all → Muestra las opciones posibles


• :set number / nonumber → Muestra los números de líneas /
Deshabilita los números
• :set showmode / noshowmode → Habilita / Deshabilita la vista del
estado del editor

88 www.sugeek.co
EDITOR DE TEXTO NANO
El editor de texto nano es una versión libre del editor pico, a diferencia
del editor por excelencia vi o vim el cual fue ideal para aquellos equipos
o teclados donde no se poseía teclas de desplazamiento, pero con la
masificación de teclados con dichas teclas, el editor vi se volvió
“obsoleto” pero aun así algunas personas lo siguen utilizando por
motivos de facilidad -para usuarios expertos-, ya que vi es un editor muy
completo para realizar múltiples tareas.

Se recomienda nano para aquellas personas que están acostumbradas a


los editores de texto de escritorio o son principiantes en este mundo de
Linux.

Nano mejoró notablemente la interacción del usuario final con la edición


de archivos por consola -su funcionamiento es muy similar al editor de
texto gráfico como gedit-, acá mencionaremos algunos de los comandos.

• Desplazarse entre párrafos, líneas, frases y demás se realiza con


las teclas de cursor.
• Ctrl + g (F1) → Muestra la ayuda
• ctrl + x (F2) → Cierra el archivo actual
• ctrl + o (F3) → Guarda el trabajo actual
• ctrl + j (F4) → Justificar el Párrafo Actual.
• Ctrl + r (F5) → Insertar otro fichero en el actual
• ctrl + w (F6) → Buscar una cadena o expresión regular
• ctrl + y (F7) → Ir a la pantalla anterior
• ctrl + v (F8) → Ir a la siguiente pantalla
• ctrl + k (F9) → Cortar la línea actual y guardarla en el cutbuffer
• ctrl + u (F10) → Pegar el cutbuffer en la línea actual
• ctrl + c (F11) → Mostrar la posición del cursor
• ctrl + t (F12) → Invocar el corrector ortográfico -si está disponible-

Además puedes editar nano para que muestre mas información. En el


archivo /etc/nanorc podremos editar ciertas funcionalidades de nano.

Administración de Servidores GNU/Linux 89


90 www.sugeek.co
GESTIÓN DE PAQUETES
El software en GNU/Linux comparte librerías, por tal motivo al descargar
o instalar software desde los repositorios, se realiza en un tiempo
inferior que utilizar software empaquetado (.deb). Existen tres maneras
de realizar una instalación, mediante repositorios, instalación desde los
binarios empaquetados, o desde sus fuentes.

Comando aptitude y apt


Ambos sirven para instalar, desinstalar software, actualizar el sistema,
etc. aunque aptitude de forma predeterminada no viene en Ubuntu
(14.04), pero si en Debian. La diferencia principal de aptitude contra apt
es que este último tiene muchas herramientas hasta casi olvidarlas, en
cambio aptitude fusiona todo en una sola -aunque aptitude es la “GUI”
de apt-.

Normalmente tienen la sintaxis similar: comando accion software.

aptitude install firefox

• aptitude → Por si solo mostrara un menú de instalación de


software amigable.
• aptitude install → Instala software junto con las dependencias
necesarias.
• aptitude remove → Elimina paquetes junto con las dependencias
que queden huérfanas.
• aptitude purge → Elimina paquetes y dependencias huérfanas
junto con los ficheros de configuración.
• aptitude search → Busca paquetes en las listas de paquetes
locales de apt.
• aptitude update → Actualiza las listas de paquetes locales.
• aptitude upgrade → Actualiza los paquetes disponibles.
• aptitude clean → Elimina ficheros temporales descargados
durante la instalación de un software.
• aptitude dist-upgrade → Actualiza paquetes, incluso si eso
significa que debe desinstalar otros.
• aptitude show → Muestra detalles acerca del paquete nombrado.
• aptitude autoclean → Elimina los paquetes deb obsoletos.
• aptitude hold → Fuerza a que un paquete permanezca en su
versión actual, y no se actualice.
• aptitude reinstall → Reinstala el paquete o software en mención.

Administración de Servidores GNU/Linux 91


• aptitude full-upgrade → Actualizar paquetes instalados a su
versión más reciente, instalando o eliminando paquetes si es
necesario.
• aptitude safe-upgrade → Actualiza solo aquellos paquetes
indicados.
• aptitude keep-all → Cancela cualquier cambio programado.

Como hemos podido observar con solo aptitude podemos realizar


muchas tareas con respecto al software, con apt también pero este usa
otras herramientas.

¡IMPORTANTE!
Desde la versión 8 de Debian, apt se simplifico notablemente, dejando a
un lado el -get y solo se utiliza apt. EJ: apt install openssh

• apt-get → Instala o desinstala software


◦ apt-get install → Instala Software indicado
◦ apt-get remove → Desinstala el software indicado
◦ apt-get autoremove - Elimina automáticamente todos los
paquetes no usados o librerías huérfanas.
◦ apt-get purge → Elimina el software y también archivos de
configuración.
◦ apt-get autoclean → Limpia completamente los archivos
temporales usados durante la instalación de un software
◦ apt-get clean → Limpia los archivos temporales generados
durante la instalación de un software.
◦ apt-get update → Consigue listas de paquetes nuevos y
actualizaciones.
◦ apt-get upgrade → Realiza actualizaciones de los paquetes
◦ apt-get source → Descarga archivadores origen
◦ apt-get build-dep → Configura las dependencias de
compilación para paquetes origen
◦ apt-get dist-upgrade → Actualiza la distribución.
◦ apt-get check → Verifica que no hay dependencias rotas.
◦ apt-get markauto → Marca los paquetes dados como
instalados automáticamente
◦ apt-get unmarkauto → Marca los paquetes dados como
instalados manualmente
◦ apt-get changelog → Descarga y muestra el registro de
cambios del paquete dado
◦ apt-get download → Descarga el paquete binario en el
directorio actual
• apt-cache → Busca paquetes dentro del sistema local

92 www.sugeek.co
◦ apt-cache gencaches → Construye el paquete y la caché de
origen
◦ apt-cache showpkg → Muestra información general para un
paquete
◦ apt-cache showsrc → Muestra registros del origen
◦ apt-cache stats → Muestra algunas estadísticas básicas
◦ apt-cache dump → Muestra el archivo entero en formato
breve
◦ apt-cache dumpavail → Imprime un archivo disponible en la
salida estándar
◦ apt-cache unmet → Muestra dependencia no conseguidas
◦ apt-cache search → Busca una lista de paquetes para un
patrón de expresión de registro
◦ apt-cache show → Muestra un registro legible para el paquete
◦ apt-cache depends → Muestra información de dependencia en
bruto para un paquete
◦ apt-cache rdepends → Muestra información de la dependencia
inversa para un paquete
◦ apt-cache pkgnames → Lista los nombres de todos los
paquetes en el sistema

Aunque apt tiene más herramientas, acá mencionamos las destacadas.

La utilización de uno u otro se deja a criterio propio, ya que algunos se


sienten mas cómodos usando apt y otros aptitude.

Archivo /etc/apt/sources.list
En este archivo encontramos los sitios de donde se descarga el software.
Son en realidad unas urls ya sean http o ftp, seguidas de una “opción”
especial.

Un Ejemplo de las líneas que podemos encontrar:

deb http://ftp.us.debian.org/debian stable main contrib non-free


deb-src http://ftp.us.debian.org/debian stable main contrib non-free

Como observamos después de la url tiene unas opciones.

Oldstable | Stable | testing | unstable | experimental: Esta opción indica


la versión del sistema, como la versión sin soporte, la versión actual o la
estable, la siguiente versión que esta en pruebas, la que sera lanzada
pero no se esta probando a profundidad, y la experimental que incluye

Administración de Servidores GNU/Linux 93


los mas recientes paquetes.

Main: Software para los que hay soporte disponible por parte del equipo
Debian.

Contrib: Contiene el software que desarrolladores externos al equipo de


Debian que han contribuido para su integración.

Non-free: Software que no esta bajo ninguna licencia de Software Libre


-software privativo- y son distribuidos en los repositorios oficiales como
lo son flash-player

Comando ldd
Este comando permite ver las librerías dependientes de un ejecutable,
mostrando la ubicación de la librería. Muy útil cuando hacemos jaulas
con chroot.

Los directorios por defecto de las librerías son:

• /lib → Librerías principales del sistema


• /usr/lib → Librerías de usuarios
• /usr/local/lib → Librerías de Programas

root@sugeek:~# ldd /sbin/fdisk


linux-vdso.so.1 => (0x00007ffc269f8000)
libblkid.so.1 => /lib/x86_64-linux-gnu/libblkid.so.1
(0x00007f1b92a16000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1b92658000)
libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1
(0x00007f1b92453000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1b92c3c000)

Comando ldconfig
Con este comando podremos reconfigurar la cache de librerías
compartidas. Normalmente las librerías compartidas se encuentran
configuradas en /etc/ld.so.conf y si lo abrimos, observaremos que están
los directorios donde se encuentran los archivos *.conf que incluyen la
información de las distintas rutas que contienen las librerías. Cada vez
que tengamos un nuevo directorio con librerías nuestras u otro
programa deberemos configurar el archivo indicando la ruta, y luego
ejecutando el comando ldconfig.

94 www.sugeek.co
Debemos de tener especial cuidado con la librería de c o libc, ya que
esta librería es esencial para el 90% de los comandos ejecutados y
servicios de GNU/Linux.

Comando dpkg
Dpkg es el gestor de paquetes de las distribuciones basadas en Debian,
este no usa los repositorios por defecto que se encuentran en
/etc/apt/sources.list, si no que es el encargado de administrar e instalar
aquellos paquetes ya empaquetados como .deb

• dpkg -i → Instala el paquete indicado


• dpkg -r → Desinstala el paquete o software que se hace mención
pero se mantiene la configuración.
• dpkg -Ri → Instalar todos los paquetes .deb de un directorio.
• dpkg -l → Lista todos los paquetes instalados en el sistema.
• dpkg -P → Elimina el paquete indicado con su respectiva
configuración.

Aunque dpkg cuenta con mas opciones, estas son las mas usadas, para
el resto de actividades se recomienda el uso de aptitude o apt.

La principal desventaja de usar dpkg -aunque apt y aptitude usan dpkg


por debajo- es que no cumple las dependencias incumplidas, por ello
antes de instalar un paquete es necesario que se cumplan las
dependencias de ese paquete.

Además existen otros comandos asociados a dpkg, acá listamos algunos.

• dpkg-architecture → Configura y determina la arquitectura para la


construcción de paquetes.
• dpkg-query → Muestra los paquetes de la base de datos de dpkg
• dpkg-source → Herramienta de manipulación de paquetes fuente
de Debian .dsc
• dpkg-reconfigure → Reconfigurar un paquete ya configurado
como MySql
• dpkg-split → Divide/Une el paquete indicado en varias partes
• dpkg-buildpackage → Crea un paquete .deb a partir de sus
fuentes
• dpkg-name → Renombra el paquete según su contenido
• dpkg-scanpackages → Escanea y genera un índice de los
paquetes dentro de un directorio.
• dpkg-checkbuilddeps → Comprueba las dependencias del

Administración de Servidores GNU/Linux 95


paquete y conflictos de compilación.
• dpkg-deb → Administra los paquetes .deb
• dpkg-preconfigure → Permite que los paquetes realicen las
preguntas de configuración.
• dpkg-vendor → Consulta la información sobre el autor del
paquete.

Instalación desde las fuentes


La instalación desde las fuentes de un programa es la manera mas
clásica de instalación, ya que requiere cumplir primero con las
dependencias del programa -al contrario de apt que las cumple durante
la instalación- para luego proceder con la configuración, compilación e
instalación del software.

Los pasos que se mencionan a continuación son aplicables en la mayoría


de programas que se instalen desde las fuentes, pero siempre es
recomendable leer su manual o documento de instalación.

1. Confirmar que se cuenta con las dependencias del programa, las


esenciales son gcc y make
2. Descargar el programa fuente, normalmente viene en formato
.tar.gz
3. Descomprimir el programa en un directorio con los suficientes
permisos para realizar la configuración.
4. Ingresar y configurar el programa con ./config o ./configure
5. Compilar el programa con el comando make
6. Instalar el programa con make install
7. Ejecutar el programa instalado y validar su funcionamiento, si se
presentan fallas en la ejecución, en la consola aparecerá
información correspondiente a la solución.

96 www.sugeek.co
ADMINISTRACIÓN DE USUARIOS
En GNU/Linux los usuarios poseen identificadores únicos (UID), los cuales
según su función se les asigna un identificador. El usuario root siempre
tendrá como identificador 0, en cambio los procesos del sistema están
dentro del rango 1-99, y servicios de red se encuentran en un rango de
100-999 -en CentOS van de 100-499-, los usuarios creados toman como
identificadores mayores a 1000 así como los respectivos grupos (GID)
los cuales también inician desde 1000.

Los nombres de los usuarios o “login” pueden tener de 1 a 32


caracteres.

Los archivos responsables de los usuarios y grupos de GNU/Linux son:

• /etc/passwd
• /etc/group
• /etc/shadow

Además de estos archivos, tenemos comandos para crear ( useradd,


adduser, groupadd, addgroup), eliminar (userdel, deluser, groupdel,
delgroup) y modificar (usermod, groupmod) los usuarios y grupos.

Usuario root
Root es el principal usuario dentro de cualquier sistema GNU/Linux, es el
usuario que todo lo puede y al mismo tiempo el mas peligroso, por este
motivo debemos evitar usarlo si no poseemos suficientes conocimientos
sobre lo que estamos haciendo o vamos a hacer.

Algunos de los comandos que están “prohibidos” ejecutar con este


usuario son:

• rm -rf / o rm -rf /* o rm -r / → Este comando dejara inútil el


sistema
• mv /home/user/* /dev/null → Moverá todos los archivos de dicho
home y los eliminara sin posibilidades de recuperar
• : ( ) { : | : & } ; : → Es una bomba fork o forkbomb la cual genera
procesos de forma infinita hasta bloquear el sistema.
• dd if=/dev/zero of=/dev/sda → Este comando borra el disco
principal del sistema.

Administración de Servidores GNU/Linux 97


Directorio /home/
En este directorio se crea el path de cada usuario nuevo de forma
predeterminada, en esta nueva carpeta /home/usuariocreado se
copiaran los archivos predeterminados que se encuentran en /etc/skel.

Directorio /etc/skel/
En este directorio se guardan los archivos/carpetas predeterminados que
se copian al home de cada usuario nuevo. Normalmente los archivos
que se encuentran en esta carpeta y que son copiados a cada usuario
nuevo son:

• .bash_logout
• .bashrc
• .profile

Archivo /etc/passwd
En este archivo encontramos información de las cuentas de usuario. Una
línea del contenido de dicho archivo seria:

root:x:0:0:root:/root:/bin/bash

Dicha línea corresponde a 7 columnas, cada una separada con dos


puntos (:), y la información que muestra cada columna se interpreta de
la siguiente manera.

1. Nombre de la cuenta
2. Contraseña Cifrada. La x indica que la contraseña está en
/etc/shadow, si es un signo de admiración (!) indica que el usuario
esta deshabilitado y si tiene dos signos (!!) indica que la cuenta
no tiene contraseña.
3. Identificador de usuario o User ID
4. Identificador de grupo o Group ID
5. Comentarios o nombre completo del usuario
6. Path del Home del usuario
7. Shell que usa el usuario -para no permitir el uso de una shell se
usa /bin/false o /bin/nologin-

Normalmente existen mas cuentas de usuario aparte de root y la del


usuario personal, las demás cuentas son predeterminadas del sistema o
de algunos servicios.

98 www.sugeek.co
Archivo /etc/group
Este archivo contiene información de los distintos grupos de nuestro
sistema y los usuarios pertenecientes a este.

sudo:x:27:sugeek, user

Esta línea solo se divide en 4 columnas, las cuales se separan unas de


otras con dos puntos (:).

1. Nombre del Grupo


2. Campo Especial
3. GID o ID del grupo
4. Usuarios pertenecientes a este grupo separados por coma

Para mayor información con respecto a este archivo consultar el manual.


man group

Archivo /etc/shadow
En este archivo se guardan las contraseñas cifradas de los usuarios y la
información de caducidad de las mismas.

Los valores actuales para el cifrado de contraseñas son los primeros


caracteres iniciado y terminado por un signo de pesos ($).

• $1$ → MD5
• $2a$ → Blowfish
• $5$ → SHA-256
• $6$ → SHA-512

sugeek:$6$ODV71rF1$B4soSzgSJycaC7wi7LK:15764:0:99999:7:::

Como vemos, la estructura es similar a los archivos passwd y group,


cada campo separado por dos puntos ( : ).

1. Nombre del Usuario


2. Contraseña cifrada.
3. Días desde el 1ro de Enero de 1970 cuando se cambio o creo la
contraseña.
4. Días que quedan para que el contraseña pueda ser cambiada, si
es cero nunca solicitara cambio de contraseña.
5. Días después de los cuales la contraseña debe de ser cambiada.

Administración de Servidores GNU/Linux 99


6. Días por los cuales se le da aviso al usuario para que cambie la
contraseña antes que esta expire.
7. Días después de 1 Enero de 1970, en los cuales la cuenta será
deshabilitada luego de que la contraseña expire.
8. Espacio Reservado.

Para mayor información con respecto a este archivo consultar el manual.


man shadow

Archivo /etc/default/useradd
En este archivo se encuentra la configuración para crear un usuario. Al
escribir el comando useradd -D también observaremos la configuración
predeterminada al crear los usuarios.

Archivo .bashrc
En este archivo se establecen las configuraciones de las shells
(Variables, Alias, etc). En cada home de usuario existe un .bashrc.

Comandos useradd, adduser, passwd, chage ,userdel,


y deluser

Comando adduser
adduser solicita información guiada del usuario que se desea crear,
como dirección, teléfonos, etc. Y creará la carpeta del usuario dentro de
/home/.

root@sugeek:~# adduser sugeek


Adding user `sugeek′ …
Adding new group `sugeek′ (1003) …
Adding new user `sugeek′ (1002) with group `sugeek′ …
Creating home directory `/home/sugeek′ …
Copying files from `/etc/skel’ …
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for sugeek
Enter the new value, or press ENTER for the default
Full Name []: Sugeek
Room Number []: 1
Work Phone []: 2

100 www.sugeek.co
Home Phone []: 3
Other []: 4
Is the information correct? [Y/n] y

Comando useradd
Como hemos visto, el comando adduser se puede decir que es mas
amigable, ya que crea todo de una sola vez, directorios, comentarios, y
contraseña, cosa que con useradd no sucede y por tal motivo se indica
las diferentes opciones, pero su ventaja radica en la personalización que
se puede dar a un usuario durante el proceso de creación.

• g → Identifica el ID del grupo o nombre


• d → Identifica el path por defecto de dicho usuario
• m → Indica la creación del Home
• s → Indica la shell que utilizaría ese usuario
• p → Contraseña del usuario, No se recomienda su uso, mejor
después de crear el usuario usar el comando passwd
• G → Otros Grupos del usuario
• u → Indica el UID que se desee asignar al usuario
• c → Comentario sobre la cuenta del usuario
• k → Ruta del directorio skel, si se desea usar otro al
predeterminado el cual es /etc/skel

useradd -g group -G Administrativos,Tecnicos -d /home/sugeek -m


-s /bin/bash -c “cuenta de sugeek” NombreUsuario

La configuración del comando lo encontramos en /etc/default/useradd

Comando passwd
Por si solo indicará que se cambie la contraseña del usuario actual, para
cambiar la contraseña de otro usuario se debe de indicar el usuario
después del comando.

Entre sus diferentes opciones encontramos:

• l → Lock, bloquea la cuenta indicada


• u → unlock, desbloquea la cuenta indicada
• d → Suprime el password de la cuenta (solo root lo puede hacer)
• n → Duración mínima de vida en días de la contraseña
• x → Duración máxima de la contraseña
• i → Periodo de gracia antes de la desactivación de la cuenta si ha
vencido la contraseña

Administración de Servidores GNU/Linux 101


• w → Número de días antes del aviso de cambio de contraseña

passwd -n 5 -x 45 -w 7 sugeek

Comando chage
Su función es guiar al usuario durante el cambio de una contraseña y las
respectivas políticas que debe de tener.

root@sugeek:~# chage prueba


Cambiando la información de la edad para prueba
Introduzca el nuevo valor, o presione INTRO para el predeterminado
Duración mínima de la contraseña [0]: 5
Duración máxima de la contraseña [99999]: 45
Último cambio de contraseña (AAAA-MM-DD) [2013-11-02]:
Aviso de caducidad de la contraseña [7]: 7
Contraseña inactiva [-1]: -1
Fecha de caducidad de la cuenta (AAAA-MM-DD) [1969-12-31]
root@sugeek:~#

Para ver los detalles de la contraseña de la cuenta usamos chage -l


cuenta o passwd -S cuenta

¡IMPORTANTE!
Para elaborar contraseñas seguras, se recomienda el uso del comando
pwgen con las opciones -S (Password Seguro difícil de recordar) -N
(Número de contraseñas a generar) -y (Incluir Símbolos) y el número al
final indica la longitud de la contraseña.

root@debian:~# pwgen -syN2 13


|]R@f>1R:X*@> =+nE,!rN}Mn1,

Comandos deluser y userdel


Son comandos similares en su estructura ( comando usuarioaborrar) la
diferencia principal es que deluser muestra información a medida que se
borra el usuario, y userdel no. Para borrar con userdel se recomiendo
usarlo con la opción -r lo cual es recursivo.

Comandos groupadd, addgroup, delgroup, groupdel


groupadd y addgroup son comandos similares (comando
nombredelgrupo) aunque groupadd permite personalizar la creación de
un grupo, por ejemplo permite personalizar el GID.

102 www.sugeek.co
groupadd sugeek -g 1004

Con el comando anterior se le indica al sistema que se va a crear un


grupo llamado sugeek con el id 1004

groupdel no muestra nada en pantalla al borrar el grupo indicado, en


cambio delgroup informa en pantalla el proceso de la eliminación del
grupo.

root@sugeek:/# delgroup test6


Eliminando al grupo `test6' ...
Hecho.

Comando usermod y groupmod


Después de haber creado algún usuario o grupo, en ocasiones se hace
necesario modificar dichos usuarios/grupos.

Comando Usermod
Si requerimos modificar un usuario, lo realizamos con usermod el cual
es un comando que me permite cambiar el path del usuario, shell, y
mucho mas.

root@sugeek:~# usermod sugeek -g 0 -c “Usuario Root” -d


/root/sugeek/ -s /bin/sh

• G → Cambia los grupos del usuario


• g → El GID predeterminado del usuario
• c → Cambia el comentario del usuario
• d → Cambia el path del home del usuario
• e → Fecha cuando expira la cuenta y quedará deshabilitada.
• s → La nueva shell del usuario

Comando groupmod
Similar a usermod pero para grupos.

root@sugeek:~# groupmod sugeek -g 1104 -n prueba

• groupdmod -g → Cambia el GID del grupo seleccionado.


• groupmod -n → Cambia el Nombre al grupo seleccionado.

Administración de Servidores GNU/Linux 103


Comando gpasswd
Administra los archivos /etc/group y /etc/gshadow, además permite dar
permisos a usuarios para administrar grupos.

La estructura del comando es: gpasswd opción usuario grupo

Comandos chsh y chfn

Comando Chsh
Con este comando, el usuario podrá cambiar su consola predeterminada,
por ejemplo cambiarla de sh a bash.

Su sintaxis es sencilla, chsh -s /bin/newshell user, El “newshell” hace


referencias a las shells listadas en /etc/shells

Comando Chfn
Este comando permite cambiar el comentario de la cuenta, así con este
podemos definir el nombre completo, dirección, etc.

La estructura del comando es similar a la del comando chsh, como se


podrá observar en el siguiente ejemplo.

root@sugeek:~# chfn -f "Frank Harbey Sanabria Florez" -h 3100000


frankharbey
root@sugeek:~# cat /etc/passwd | grep frankharbey
frankharbey:x:1001:1001:Frank Harbey Sanabria
Florez,,,3133252579:/home/frankharbey:/bin/bash

En el ejemplo anterior estamos indicando las opciones -f (Nombre


completo del usuario) y -h (Teléfono del Hogar del usuario), y luego
validamos que dichos cambios fueron aplicados en el archivo
/etc/passwd.

Comando su
El Comando su (Substitute User) sin opciones, sirve para cambiar hacia
el usuario root, pero si indica un nombre de cuenta, este cambiara hacia
dicha cuenta. Si se esta en el usuario root y se desea cambiar hacia otro
usuario, este no solicitara contraseña, pero si se esta en un usuario
estándar y se desea cambiar hacia root u otro usuario este solicitara la

104 www.sugeek.co
contraseña del usuario al cual se desea acceder.

El siguiente ejemplo, se observa como ejecutamos el comando fdisk, el


cual solo puede ser ejecutado por root, usando las opciones - l (Login) y
-c (Command) para indicar el comando a ejecutar dentro de comillas
simples.

usuario@sugeek:~$ su -l root -c 'fdisk -l'


Contraseña:
Disco /dev/sda: 750.2 GB, 750156374016 bytes

Archivo /etc/login.defs
Muchos comandos, como, por ejemplo, login, useradd, groupadd y
passwd, utilizan este archivo para definir algunos valores por defecto y
la validez de los login.

Se recomienda ver la página man del archivo con man 5 login.defs

Este archivo típicamente trae entradas como las siguientes: -existen


mas opciones-, lo invito a observarlas.

• CHFN_AUTH yes | no → Si está puesto a yes, chfn y chsh


solicitarán autenticación del usuario antes de ejecutar cualquier
cambio, a menos que se ejecute como root.
• CREATE_HOME yes | no → Define si el comando useradd deberá
crear el directorio home del usuario.
• GID_MAX int / GID_MIN int. → Rango de ID's para los grupos.
• UID_MAX int / UID_MIN int. → Rango de ID's para los usuarios.
• UMASK int. → La máscara de permisos. Si no se específica, el
permiso será 077.
• FAIL_DELAY int. → El retardo en aparecer el prompt de login
después de algún fallo.
• FAILLOG_ENAB yes|no. → Generar logs de fallas de acceso
/var/log/faillog
• LOCK_UNFAIL_ENAB yes|no. → Permitir que se guarden en la
bitácora los nombres de usuarios no conocidos cuando se genere
un fallo.
• LASTLOG_ENAB yes|no. → Permite que se guarde la hora de
entrada al sistema en los logs /var/log/lastlog

Administración de Servidores GNU/Linux 105


Archivo /etc/nsswitch
Este archivo es usado por las aplicaciones del sistema con la finalidad de
saber a que base de datos realiza la primera consulta.

Por ejemplo:

hosts: files dns

La anterior linea indica que la consulta a los equipos de la red se debe


de realizar primero al archivo /etc/hosts y luego al servidor DNS, lo
mismo ocurre con las cuentas de usuario, primero consulta el archivo
/etc/passwd y /etc/shadow para luego proceder a consultar los
servidores de autenticación.

Si se desea, se puede cambiar el orden de consulta, pero se recomienda


que la consulta siempre se haga a la base de datos local o archivos del
sistema, y luego se realice a los servidores remotos.

Antes de realizar cualquier actividad sobre este archivo, consulte el


respectivo manual con man 5 nsswitch.conf

Archivos /etc/issue /etc/issue.net /etc/motd


En estos archivos podemos configurar los mensajes que aparecerán a los
usuarios cuando ingresen al sistema. Se recomienda modificar el archivo
/etc/motd con algún mensaje referente a términos legales o de
privacidad de la empresa, ya que este archivo es mostrado cada vez que
se ingresa al sistema.

El /etc/issue es el mensaje de bienvenida que arroja cuando se realiza


una conexión desde una terminal local (tty).

El /etc/issue.net es el mensaje de bienvenida que arroja cuando se


realiza una conexión desde una terminal remota (pts).

106 www.sugeek.co
PERMISOS DE ARCHIVOS Y CARPETAS
De forma predeterminada el usuario que crea un archivo o carpeta se
convierte en propietario, y el grupo de este también, pero estas
características pueden ser cambiadas. Para visualizar los permisos de un
archivo o carpeta basta con escribir el comando ls -l nombrearchivo.

drwxr-xr-x 7 sugeek sugeek 12288 jul 4 09:29 Descargas

Teniendo en cuenta esta línea, nos enfocaremos en la columna 1, 3 y 4,


las cuales informan los permisos de la carpeta o archivo.

drwxr-xr-x → Esta parte indica el tipo de archivo y los permisos de dicho


archivo, el primer carácter hace referencia a:

• d → Indica que es un directorio.


• – → Indica que es un archivo.
• L → Indica que es un link simbólico

-En el directorio /dev estas letras cambian, visto en capítulo “Sistema de


Archivos” página 46-.

En cuanto a los permisos ( rwxr-xr-x) se divide en grupos de tres,


quedando rwx r-x r-x, el primer grupo indica los permisos del propietario,
el segundo grupo indica los permisos del grupo propietario, y el tercer
grupo indica los permisos de los demás usuarios y grupos.

Según lo anterior podemos indicar lo siguiente.

• r → Permiso de Lectura.
• x → Permiso de ejecución.
• w → Permiso de Escritura.
• - → Sin permiso.

Teniendo en cuenta lo anterior se podrían dar permisos a un


archivo/carpeta de forma relativa o absoluta

¡IMPORTANTE!
Los permisos de una carpeta no son lo mismo que los permisos de un
archivo.

Administración de Servidores GNU/Linux 107


Permisos Archivos
r Se puede leer el contenido del archivo, cargarlo en memoria,
listarlo y copiarlo
w Se puede modificar el contenido del archivo, se puede escribir
mas no significa que se pueda eliminar, este permiso lo da el
archivo directorio que lo contiene.
x Se puede ejecutar el archivo desde la línea de comandos si se
trata de un programa.
Permisos Carpeta
r Se puede listar el contenido del directorio. Sin este permiso ls y
demás comandos de acceso no tienen efecto, pero se puede
acceder al archivo con su ruta absoluta.
w Se pueden modificar los elementos del directorio, y es posible
crear, renombrar y eliminar archivos en este directorio. Este es el
permiso que controla los permisos de eliminación.
x Se puede acceder al directorio con cd y se puede listar, sin este
permiso es imposible acceder al directorio y actuar en su
contenido.

Permisos Absolutos
Es mas rápido asignar permisos de forma absoluta. Cada valor numérico
toma el espacio de un grupo de permisos.

• --- → Sin permisos y su valor octal es 0


• --x → Ejecución y su valor octal es 1
• -w- → Escritura y su valor octal es 2
• -wx → Escritura y Ejecución, su valor octal es 3
• r-- → Lectura y su valor octal es 4
• r-x → Lectura y Ejecución, Su valor octal es 5
• rw- → Lectura y Escritura, Su valor octal es 6
• rwx → Todos los permisos su valor octal es 7

Teniendo en cuenta lo anterior, y siguiendo con los permisos que tiene


nuestro archivo, ya podríamos identificar los valores de cada columna
(rwx r-x r-x). La primera columna (rwx) la cual son los permisos del
propietario tendrá un valor octal de 7, la segunda columna tiene un valor
de 5 y lo mismo para la tercera columna el cual tiene un valor de 5,
resumiendo el valor octal de dichos permisos es 755.

108 www.sugeek.co
Permisos Relativos:
Esta forma es la menos usada por la mayoría de administradores, pero
no significa que no sea igual de eficiente, a diferencia de colocar valores
numéricos, usa valores alfabéticos, pero la ejecución del comando es
mas larga. Para definir un permiso relativo es necesario indicar a que
grupo va a afectar y los grupos son relacionados de la siguiente manera:

• u → Indica el usuario, afecta el primer grupo de los permisos.


• g → Indica el Grupo, afecta el segundo grupo de los permisos.
• a → Indica a todos, afecta a todos los grupos de los permisos.
• o → Indica otros usuarios, afecta a tercer grupo de permisos.

Seguido de esto se indica si se van a quitar (-) o agregar (+) permisos.

• -/+rxw → Quita/Agrega todos los permisos


• -/+r → Quita/Agrega permisos de lectura
• -/+x → Quita/Agrega permisos de Ejecución
• -/+w → Quita/Agrega permisos de escritura
• -/+rx → Quita/Agrega permisos de lectura y ejecución
• -/+rw → Quita/Agrega permisos de Lectura y Escritura
• -/+xw → Quita/Agrega permisos de ejecución y escritura

Volviendo al archivo que teníamos el cual poseía los permisos rwx r-x r-
x, usando permisos relativos seria de la siguiente manera:

u=+rwx,g=+rx,o=+rx

Como vemos, el comando se alarga, lo cual es mas fácil utilizar los


permisos absolutos (755).

u=+r-wx,g=-rw+x,o=-rxw

En los anteriores permisos, estamos dando permisos de lectura (r) al


usuario propietario y quitando los de escritura (w) y ejecución (x), al
grupo propietario le quita los permisos de lectura y escritura (rw) pero
permite la ejecución (x), y a los demás les quita todos los permisos. Pero
si usamos permisos absolutos seria lo mismo que escribir 410.

Comando chown
Este comando cambia el usuario y grupo propietario de un
archivo/carpeta. Su estructura es:

Administración de Servidores GNU/Linux 109


chown opciones usuario:grupo archivo Ó chown usuario archivo

Algunas de las opciones que permite este comando son:

• -R → De forma recursiva, cambia el propietario de los ficheros y


subdirectorios de una carpeta.
• -c → Muestra los archivos que fueron afectados

Comando chgrp
A diferencia de chown, este solo cambia el grupo propietario. Su
estructura es: chgrp opciones grupo archivo

Comando umask
Este comando mostrara los permisos predeterminados con los que se
crea un archivo/directorio, si se escribe solo, muestra los permisos de
forma octal invertida, y si se agrega la opción -S mostrara los permisos
predeterminados de forma relativa.

Por ejemplo, de forma predeterminada en sistemas Debian, al escribir


umask tendremos como resultado el valor 0022, para saber
exactamente que permisos tendrán nuestros directorios/archivos,
tomamos los valores 777 de permisos absolutos y le restamos el valor
de umask -restando permisos mas no valores numericos-, dando como
resultado 755, ese seria los permisos por defecto al crear un directorio,
para archivos se toma el valor de 666.

Para cambiar los permisos predeterminados solo escribimos umask


nuevovalor, este nuevo valor debe ser invertido, por ejemplo, si solo
deseamos que los creadores de los archivos tengan permisos, se
establecería el valor del umask 077 teniendo como resultado unos
permisos 700 para carpetas y 600 para archivos. Este cambio es
temporal, si se desea dejar permanente para todos los usuarios se edita
el archivo /etc/profile, pero si solo es para el usuario actual, se edita el
archivo ~/.bashrc.

Comando chmod
Ya hemos visto como cambiar el propietario de un archivo/directorio,
pero no hemos establecido los permisos a los archivos, con el comando
chmod es donde aplicamos los permisos relativos o absolutos.

110 www.sugeek.co
Para asignar permisos a un archivo, debemos de tener en cuenta la
siguiente estructura del comando:

chmod permisosrelativos/absolutos archivo/directorioafectado

Según lo anterior podemos decir que:

chmod 731 /home/sugeek/file

Lo anterior es igual que:

chmod u=+rwx g=wx o=x /home/sugeek/file

Como vemos, usamos tanto permisos absolutos como relativos para


asignarlos a un archivo. Para carpetas, se recomienda el uso de la
opción -R antes de los permisos.

Permisos Avanzados

Sticky bit
Solo el propietario del archivo tipo directorio puede modificar el
contenido de este. Para saber si un archivo/carpeta tiene dicha opción,
en la columna de permisos del archivo, al final de los permisos de otros
usuarios encontramos una t, esta indica que el archivo tiene permiso de
sticky bit, y la forma de agregar un sticky bit a un archivo es: chmod +t
archivo.

drwxr-xr-t 2 sugeek sugeek 4096 jul 23 13:57 frank

Como observamos, en la columna de permisos, al final indica una t. Es


común ver este permiso en el directorio /tmp.

setgid y setuid
Se aplica a los directorios, y la finalidad de este es que todos los
subdirectorios que se crean dentro de este directorio “especial” hereda
el grupo propietario del directorio principal sin importar el grupo al cual
pertenece el usuario que creo el directorio. La forma de activar dicho
permiso es chmod g+s path y desactivarlo chmod g-s path.

Con chmod u+s comando permite que un archivo se ejecute con los

Administración de Servidores GNU/Linux 111


permisos del propietario mas no del usuario que lo está ejecutando. La
forma de identificar si un archivo tiene ese permiso, es verificar los
permisos del archivo, ya que después de los permisos del propietario se
agrega una s. rwxs r-x r-x, Como vemos después de los permisos del
propietario se encuentra la s indicando que se puede ejecutar como
propietario sin importar el usuario.

112 www.sugeek.co
GESTIÓN DE PROCESOS Y SERVICIOS
Los procesos son ejecutados ya sea, por un software, un script, o
demonios y estos procesos tienen relación unos con otros para el
funcionamiento adecuado de dicho software.

Con anterioridad vimos los comandos top y ps los cuales muestran


información sobre los procesos que se ejecutan en la actual sesión, o
todas las sesiones.

Normalmente los procesos tienen una terminología para poder


comprenderlos:

• PPID → Parent Process ID, o identificador del proceso padre, de


este proceso se desprenden los demás procesos que se requieran
para ejecutar adecuadamente dicho software/servicio. El proceso
padre por defecto es el proceso init.
• PID → Process ID o Identificador del proceso, es un ID único y el
sistema es el encargado de asignarle su PID, con el PID podemos
matar, finalizar un proceso.
• Init → Es el principal proceso, ya que init es el primero que inicia
con el kernel y podría decirse que es el padre de todos los
procesos.
• Daemon → Proceso demonio, es un proceso especial, asociado a
un servicio en el servidor como apache (httpd) samba (smbd) etc.
La mayoría de demonios se identifican con una d al final del
nombre.
• Zombie → Es un proceso que consume memoria pero no puede
ser matado, pero no significa que no se pueda terminar.
• Variable $$ → Muestra el PID del proceso que estoy ejecutando.
• Variable $PPID → Muestra el PPID del proceso que estoy
ejecutando
• fork → Es la duplicación del proceso padre para generar el
proceso hijo.

Algunos de los comandos para matar o terminar un proceso son:

• Kill → Mata un proceso usando su PID. kill NúmeroPID


◦ kill -l → Muestra las señales que se le pueden enviar a un
proceso
◦ kill -1 → El proceso se reinicia.
◦ Kill -15 → Termina a un proceso de forma adecuada

Administración de Servidores GNU/Linux 113


◦ kill -9 → Mata un proceso bloqueado, este, a diferencia de la
señal 15, termina de forma inadecuada un proceso con
posibilidades que los hijos del proceso a matar queden en
modo zombie.
• pkill → Mata un proceso usando el nombre del proceso y los
relacionados a este. pkill -señal nombreproceso
• pgrep → Busca el PID de un proceso, indicando el nombre de
este.
• exec → Ejecuta un proceso sin que se ejecute la función de fork,
que es básicamente la duplicación del proceso original
convirtiendo a este último en un proceso hijo.
• Killall → Similar al comando pkill.

Para matar varios procesos Zombies al tiempo escribimos:

kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print


$2}'`

Procesos en Background
Los procesos son ejecutados directamente en la consola, pero hasta que
el comando no termine de ejecutarse no se podrá realizar otra actividad.
Corriendo un proceso en Background es posible ejecutar un comando y
aun así seguir trabajando sobre la shell, sin necesidad de abrir otra ya
que el comando se ejecuta en un segundo plano.

Para pasar un proceso a Background basta con terminar el comando con


& o oprimir la combinación de teclas [Ctrl ] + [Z ], ya con esto el
comando pasa a un segundo plano. Para pasar un proceso a foreground
se usa el comando fg y el jobsID.

Para saber que procesos se corren en background, se escribe el


comando jobs.

root@sugeek:~# jobs
[1]+ Ejecutando sleep 20000 &
root@sugeek:~#

El primer campo indica el jobsID seguido del estado del comando y el


comando ejecutado.

114 www.sugeek.co
Procesos en Foreground
Como vimos en el punto anterior, es probable que necesitemos pasar un
comando nuevamente a la consola principal para seguir trabajando o
visualizar su estado.

Para llamar un proceso en background a foreground escribimos fg y el


Jobs id.

Prioridad de los procesos


Para dar prioridades a los procesos existen dos comandos especiales
como lo son nice y renice.

Comando nice:
Este le brinda prioridad a un proceso antes de ser ejecutado.

Los rangos de prioridades van desde -20 hasta 19 en formato entero.


Todo proceso nuevo se ejecuta con un valor nice de 0 y solo el usuario
root puede establecer valores menores a cero.

Para ejecutar un proceso con un valor diferente al por defecto (cero) se


debe de escribir nice -n -númeroentero programa -cambiar –
númeroentero por un + si se desea un número mayor a cero-.

Comando renice
Este cambia la prioridad de un proceso que se encuentre en ejecución,
se utilizan los mismos valores de nice. Para cambiar la prioridad de un
proceso escribimos renice -n -1 -p PID -cambiar –1 por un + si se desea
un número mayor a cero-.

Comando nohup
Se sabe que si cerramos la terminal o se cierra de forma accidental, el
comando se deja de ejecutar, y si estábamos realizando un comando
con un proceso demorado seria un poco molesto que esto sucediera.
Para evitar esto, existe el comando nohup, el cual permite cerrar la
terminal pero continuara ejecutando el comando indicado y la salida del
comando lo tendremos en el archivo nohup.out., Este archivo se crea
automáticamente en el directorio desde donde se ejecuto el comando.

Administración de Servidores GNU/Linux 115


La sintaxis del comando es:

nohup comando/script a ejecutar.

Comando update-rc.d
Este comando permite añadir, suprimir, activar o desactivar los scripts,
por nivel de ejecución. Para que un servicio o script inicie por defecto
con el sistema, solo se debe de indicar update-rc.d servicio defaults.

Este comando dejara el servicio que inicie en los runlevels 2 a 5 y


pararse para los runlevels 0 1 y 6.

Pero también podemos indicarle en que runlevels estará, como por


ejemplo, le indicaremos que al iniciar el sistema el script estará en el
campo 10 y se ejecutara en los niveles 3 4 y 5, en parada estará en la
posición 5 y en los niveles 0 1 y 6.

uptate-rc.d servicio start 10 3 4 5 . stop 05 0 1 6 .

Para poder eliminar un servicio y que no se ejecute en ningún runlevel


se procede a ejecutar el comando update-rc.d -f servicio remove.

Servicios
Para administrar servicios o demonios, iniciar, parar, o recargar
podemos utilizar la estructura:

service nombredelservicio restart | stop | start | reload

Siendo restart y demás posibles estados que se le pueden aplicar al


servicio, si no se reconoce dicho servicio, toca indicar la ruta completa
del demonio, los cuales normalmente están en:

/etc/init.d/nombredeldemonio

Y luego indicando la actividad a realizar restart | stop | sart | reload.

¡IMPORTANTE!
Recordar que los dos comandos anteriormente mencionados son
remplazados en su totalidad por SystemD

116 www.sugeek.co
REDIRECCIONES, TUBERÍAS Y FILTROS
Los redireccionadores son herramientas que permiten modificar los
canales estándar (stdin, stdout y stderr). Como sabemos el stdin por
defecto es el teclado, podemos cambiar esta entrada por un archivo, o el
resultado de un comando etc, lo mismo con el stdout y stderr.

A lo anterior se le denomina canales, los cuales van desde 0 a 9, siendo


los 0 al 2 los canales por defecto (stdout, stdin, stderr). El resto de
canales (3 al 9) lo podemos usar a nuestro gusto.

Para crear el tercer canal usamos exec 3>dump.log a lo cual se está


indicando que cuando realice direcciones hacia el canal 3 escriba el
archivo indicado. Para usar dicho canal basta con escribir >&3 después
de la acción a redirigir. Para eliminar el canal creado escribimos exec
3>&-.

Redirección de salida con > y >>


La información que muestra la consola en pantalla al ejecutar un
comando en ocasiones es molesto, por ende esta salida se envía a un
archivo para su posterior revisión. Un ejemplo:

apt-get update > Informe_de_Actualización

Como se observa hemos ejecutado el comando apt-get update seguido


de la redirección de salida (>) y el nombre del archivo, de forma
predeterminada este archivo quedara guardado en el path donde nos
encontremos en ese momento, si el archivo no existe este se crea
automáticamente.

Si volvemos a ejecutar otro comando redirigiendo la salida al mismo


archivo, y este archivo contiene información, esta información sera
borrada, para ello usamos el redireccionador >> el cual escribirá el
resultado del comando después de la última línea del archivo.

Pero si se desea que la redirección no sobre escriba ni borre el contenido


del archivo, debemos de activar una opción en el shell que se llama
noclobber, el cual evita cualquier sobre escritura del archivo. Para
activar dicha opción solo se ejecuta set -o noclobber y si deseamos
desactivarlo escribimos set +o noclobber.

Administración de Servidores GNU/Linux 117


Redirección de errores con 2>
Así como direccionamos la salida estándar (stdout), también podemos
direccionar solamente los errores y que el resto se muestre en pantalla,
esto es ideal cuando necesitamos ver que errores se presentaron al
ejecutarse un comando.

apt-get update 2> Errores_de_Actualización

Existe otra opción de direccionar el stdout y stderr, la cual es 2>&1 ,


este direccionará tanto el stdout como el stderr al destino indicado.

apt-get update > stdoutstderr_de_actualización 2>&1

Con el comando anterior estamos redirigiendo todas las salidas a un


archivo. Lo anterior seria similar a:

apt-get update > Inf_actualización 2> Err_Actualización

Redirección de entrada con <


Sabemos que la entrada estándar de la shell es el teclado, pero eso lo
podemos cambiar si ya tenemos los comandos en archivos y podemos
direccionar la entrada con el "menor que" <.

Redirección con here-documment <<


<< Indica la palabra que sera escrita para terminar de ingresar
información al archivo.

root@sugeek:~# cat << Final > prueba


- esto es una prueba
- Final
root@sugeek:~# cat prueba
esto es una prueba

Tuberías y Filtros
Las tuberías son una herramienta para la ejecución de un comando con
el resultado del comando anterior. Normalmente esta se utiliza para
filtrar el contenido de una salida de comandos y ubicar con exactitud un
argumento descrito.

118 www.sugeek.co
La tubería se identifica con el carácter ( | ) el cual indica que la salida del
comando anterior sera la entrada del siguiente comando.

Comando basename y dirname


El comando basename permite obtener el nombre de un archivo en una
ruta especificada, en cambio, el comando dirname, permite obtener el
nombre del directorio donde se encuentra un archivo.

Comando tee
Permite copiar la salida de un comando a un archivo y aun asi enviarlo al
stdout. Se puede usar con una tubería.

root@sugeek.co:~# ls -la | tee file | grep apache

El anterior comando lista el contenido de un directorio ( ls -la ) al tiempo


que dicha salida es direccionada al comando tee el cual crea un archivo
llamado file, y muestra en la salida estándar el resultado del comando ls
-la, pero esta salida es direccionada al comando grep para que muestre
solo la línea que contenga apache.

Comando grep
Busca una palabra o frase indicada dentro de un archivo para mostrar en
pantalla la linea relacionada. Normalmente se usa con una tubería pero
se puede usar por si solo.

root@sugeek.co:~# ls -la | grep apache

En el anterior comando estamos buscando dentro de la salida del


comando ls la palabra apache.

root@sugeek.co:~# grep -ri “servidor apache” /home/sugeek/*

El anterior ejemplo estamos usando solo el comando grep, indicando


que busque la frase “servidor apache” con la opción recursiva ( r )
además que no haga distinción entre mayúsculas y minúsculas ( i ) la
frase, la recursividad es usada directamente en directorios.

• -v → Muestra el resultado inverso, lo no coincidente.


• -c → Solo devuelve el número de líneas encontradas, sin
mostrarlas, útil para saber cuantas coincidencias tiene el termino

Administración de Servidores GNU/Linux 119


de búsqueda.
• -i → No diferencia las mayúsculas de las minúsculas
• -n → Indica el número de la línea donde se encuentra ubicado el
termino buscado dentro de un archivo.
• -l → Si son varios archivos en donde se realiza búsqueda, esta
opción indica en que archivo se encontraron los términos de
coincidencia.

root@sugeek.co:~# grep -i “^f” sugeek

El anterior comando buscara las líneas que inicien con una f, si no se


define ^ buscara las líneas que dentro de su frase o palabra tenga la
letra f.

Comando egrep
Es igual que utilizar grep -E, para realizar búsquedas o filtros mas
avanzados.

root@sugeek.co:~# egrep "^[eE]mpresa(SuGE3K|sugeek)$" file

El anterior comando busca las líneas que inicien con e o E, continué con
mpresa y termine con SuGE3K o sugeek en el archivo file. Ahí no queda
todo, se pueden usar muchas mas combinaciones.

Conjunto Función
| Lógico, la expresión colocada antes o después debe de
desaparecer
(...) Agrupación de Caracteres
[...] Un carácter tiene esta posición entre los indicados
. Punto, cualquier carácter
+ Repetición, el carácter colocado antes debe de
aparecer al menos una vez
* Repetición, el carácter colocado antes debe de
aparecer de 0 a n veces.
? El carácter colocado antes debe de aparecer una sola
vez como máximo
{n} El carácter colocado antes debe de aparecer
exactamente n veces

120 www.sugeek.co
Conjunto Función
{n,} Aparece n veces o mas
{n,n} Aparece entre n y m veces
^ Inicio de la Cadena
$ Final de la cadena

ifconfig wlan0 | egrep '([0-9]{1,3}\.){3}[0-9]{1,3}'


Direc. inet:192.168.2.111 Difus.:192.168.2.255
Másc:255.255.255.0

El anterior comando se descompone de la siguiente manera:

• ifconfig wlan0 → Interfaz de red donde se obtendrá el


direccionamiento
• | → El resultado de esto se lo envía al comando egrep
• '([0-9]{1,3}\.){3}[0-9]{1,3}' → Obtiene las direcciones
◦ [0-9] → Indica que es un carácter de 0 a 9
◦ {1,3} → Indica que se repite de 1 a 3 veces x o xx o
xxx
◦ \. → Seguido de un punto
◦ {3} → En un conjunto de 3 veces xxx.xxx.xxx
◦ [0-9] → Indica un carácter de 0 a 9
◦ {1,3} → Repetido entre 1 y 3 veces

Comando cut
Este filtro permite delimitar el contenido de la salida de un comando, o
de un archivo para mostrar el contenido de ciertas columnas, muy
utilizado en archivos de bases de datos, o que tienen como contenido
una base de datos.

root@sugeek.co:~# cut -d “;” -f 1 archivobd

El anterior comando mostrara el contenido del archivobd y suponemos


que el delimitador del archivo es un punto y coma ( ; ), por eso usamos
con la opción -d. La opción -f indica que solo muestre el contenido de la
primera columna. Si deseamos mostrar mas columnas o columnas
distintas separamos dichas columnas con una coma (-f 1,4,6).

Administración de Servidores GNU/Linux 121


Comando column
No se diferencia mucho del comando cut, ya que muestra en pantalla el
contenido de una tabla con su respectivo separador.

root@sugeek:~#column -s: -t /etc/passwd

La opción -s indica el delimitador, y la -t tabula las columnas mostradas.

Comando tr
Permite cambiar una determinada información de un archivo por otra, en
pocas palabras, permite cambiar un termino por otro.

El fichero de origen y fichero destino lo especificamos con los caracteres


de redirección: < ó >.

root@sugeek:~# tr ':' ' ;' < /etc/passwd > usuarios

El comando anterior esta indica que estamos buscando el carácter dos


puntos ( : ) y lo vamos a remplazar con punto y coma ( ; ), en el archivo
/etc/passwd y direcciona la salida hacia un archivo llamado usuarios.

Algunos ejemplos:

• cat miarchivo | tr a-z A-Z → Remplazar minúsculas por


mayúsculas
• echo "Esto es Prueba " | tr -s [:space:] → Quitar los caracteres
repetidos simultáneos (espacios) con la opción -s
• echo "Holta como estas" | tr -d 't' → Eliminar un carácter con la
opción -t
• echo "mi nombre es 12345" | tr -cd [:digit:] → Borrar todo el
contenido (-d) manteniendo la opción indicada ( -c), la opción
indicada son los números.
• tr -s '\n' ' ' < file.txt → Unir todas las líneas de un archivo, en una
sola línea.

Comando sort
Ordena de alfabéticamente o numéricamente el contenido de un archivo
o la salida de un comando.

root@sugeek:~# sort /etc/passwd >> usuarios

122 www.sugeek.co
El anterior comando listara alfabéticamente el contenido del archivo
/etc/passwd y la salida la redirigirá sin sobrescribir el contenido del
archivo usuarios. Si se desea organizar de forma inversa dicho
contenido, solo se ingresa la opción -r.

• -f → Este parámetro sirve para indicar que las mayúsculas y las


minúsculas se van a tratar de forma diferente y que por tanto se
va a seguir un ordenamiento alfabético.
• -n → Este parámetro sirve para ordenar los campos numéricos
por su valor numérico.
• -r → Nos permite realizar una ordenación inversa, es decir, de
mayor a menor.
• -k número → De este modo especificaremos por qué columna o
campo vamos a realizar la ordenación.
• -t → Indica el delimitador
• -u → Nos permite suprimir todas las líneas repetidas después de
realizar la ordenación.
• -o → Indica el archivo de salida del comando

root@sugeek.co:~# sort -t: -k4 /etc/passwd >> usuarios

El Anterior comando organiza el contenido del archivo /etc/passwd por la


tercera columna (-k4 ) usando el delimitador dos puntos (-t:) y a su ves,
dirija la salida al archivo usuarios sin borrar su contenido.

Comando uniq
Este comando permite remover o mostrar las líneas repetidas que se
encuentran dentro de un archivo o salida de un comando.

Es estrictamente recomendable usar uniq a la salida del comando sort.

root@sugeek.co:~# sort file | uniq > file2

Comando paste
El comando paste agrupa n archivos en uno. Para ello, concatena las
líneas de cada uno de los archivos en una sola línea, línea1 del file1 con
la línea 1 del file2 usando delimitadores ( d) para identificar el file1 del
file2.

root@sugeek~# paste -d: file1 file2

Administración de Servidores GNU/Linux 123


Comando diff
Muestra las diferencias que existen entre 2 archivos, para que su
contenido sea idéntico

diff -b file1 file2

Este comando devuelve 3 tipos de resultados:

• APPEND: 5a6,8 → Lo anterior indica que en la línea 5 del file1 hay


que insertar las líneas 6 a la 8 de file2 para que sean idénticos.
• DELETE: 7,9d6 → Indica que se debe de suprimir las líneas 7 a la
9 del file1 para que sea idéntico a file2
• CHANGE: 8,12c9,13 → Indica que se deben de intercambiar las
líneas de 8 a la 12 del file1 contra las líneas 9 a la 13 de file2
para que estos sean idénticos.

Además la salida del comando devuelve un < y otro >, el < indica el
contenido de file1, y > indica el contenido de file2, normalmente este
comando se utiliza para corroborar los datos de un archivo ( file1) contra
el “Original” (file2).

Comando sed
Es bueno automatizar el proceso de editar archivos, de forma que se
pueda "procesar por lotes" la edición de archivos, e incluso crear macros
con la habilidad de realizar cambios sofisticados a archivos existentes.

Afortunadamente para nosotros y para este tipo de situaciones, hay un


método mucho mejor y este método se denomina sed.

sed es un ligero editor de flujo que está incluido en casi todos los
sabores de UNIX, Linux incluido. Dado que sed es un editor de flujo,
puede editar los datos que recibe de stdin, como aquellos direccionados,
por lo que no se necesita tener los datos a editar almacenados en un
archivo del disco, dado que los datos pueden redirigirse a sed. Es muy
fácil usar sed como parte de un largo y complejo direccionamiento en un
archivo por lotes de nuestro intérprete de comandos.

Sed, escribe sus resultados en la salida estándar ( stdout); por lo que no


modifica ninguno de los archivos de entrada, a menos que se le indique.

Se pueden usar expresiones regulares para definir patrones de

124 www.sugeek.co
búsqueda o coincidencia. Si hemos usado alguna vez el carácter
asterisco (*) en un comando, es algo muy similar, aunque no idéntico, a
las expresiones regulares. Aquí tenemos los caracteres especiales que
pueden usarse en las expresiones regulares de sed:

• ^ → Apunta al comienzo de la línea


• $ → Apunta al final de la línea
• . → Apunta a un único carácter
• * → Apunta a cero o más ocurrencias del carácter previo
• [ ] → Apunta a todos los caracteres entre los corchetes

Veamos algunos ejemplos con expresiones regulares para facilitar las


cosas. Todos estos ejemplos serán aceptados por sed como direcciones
válidas que pueden aparecer a la izquierda de cualquier comando:

• /./ → Apuntará a cualquier línea que contenga al menos un


carácter
• /../ → Apuntará a cualquier línea que contenga al menos dos
caracteres
• /^#/ → Apuntará a cualquier línea que comience con un signo de
número '#'
• /^$/ → Apuntará a cualquier línea en blanco
• /}$/ → Apuntará a toda línea que termine con un '}' (sin espacios)
• /} *$/ → Apuntará a toda línea que termine con un '}' con cero o
más espacios
• /[abc]/ → Apuntará a toda línea que contenga una 'a', 'b', o 'c'
minúscula
• /^[abc]/ → Apuntará a cualquier línea que empiece con 'a', 'b', o
'c'

Coincidencia con más caracteres


La sintaxis de expresiones regulares tiene más opciones adicionales.
Para especificar un rango de caracteres se puede usar el símbolo menos
'-', siempre y cuando no esté ni en la primera ni en la última posición,
como se muestra a continuación:

'[a-x]*'

La anterior expresión apuntará a cero o más caracteres, siempre que


cada uno de ellos sea una 'a', 'b','c'...'v','w','x'. Además, la clase de
caracteres '[:space:]' está disponible para coincidir con espacios en
blanco. He aquí una lista bastante completa de clases de caracteres:

Administración de Servidores GNU/Linux 125


• [:alnum:] → Alfanumérico [a-z A-Z 0-9]
• [:alpha:] → Alfabético [a-z A-Z]
• [:blank:] → Espacios o tabuladores
• [:cntrl:] → Cualquier carácter de control
• [:digit:] → Dígitos numéricos [0-9]
• [:graph:] → Cualquier carácter visible (no espacios en blanco)
• [:lower:] → Minúsculas [a-z]
• [:print:] → Caracteres que no sean de control
• [:punct:] → Caracteres de puntuación
• [:space:] → Espacio en blanco
• [:upper:] → Mayúsculas [A-Z]
• [:xdigit:] → Dígitos hexadecimales [0-9 a-f A-F]

Es una gran ventaja usar clases de caracteres siempre que sea posible,
dado que se adaptan mejor a las localizaciones no inglesas incluyendo
caracteres con acentos siempre que sea necesario.

Ejemplos

• Insertar texto en la última línea


sed -i '$a Aqui el texto que ira en la última línea' archivo

• Insertar texto en una línea específica (5ta Linea)


sed -i '5i Aqui texto que ira en la 5ta línea' archivo

• Borrar Lineas vacías de un archivo.


root@sugeek.co:~# sed '/^$/d' fichero

• Cambiar una cadena de texto por otra en la línea 1 a la 10.


root@sugeek.co:~# sed '1,10s/cadena1/cadena2/g' fichero

• Mostrar solo las líneas que coincidan con la expresión indicada


root@sugeek.co:~# sed -n -e '/root/p' /etc/passwd | less

• Si únicamente se quiere imprimir la función main() en un archivo


de código fuente en C, se podría teclear:
root@sugeek.co:~# sed -n -e '/main[[:space:]]*(/,/^}/p' sourcefile.c
| more

Este último comando tiene dos expresiones regulares,


'/main[[:space:]]*(/' y ',/^}/', y un comando p. La primera expresión
regular apuntará a la cadena "main" seguida de cualquier número de

126 www.sugeek.co
espacios o tabuladores, luego seguido por un paréntesis abierto. Lo cual
debería coincidir con el comienzo de nuestra declaración main() en ANSI
C.

En este caso de expresión regular, encontramos la clase de caracteres


'[[:space:]]' la cual es únicamente una palabra clave especial para sed
que le indica apuntar a cualquier espacio o tabulación.

Si deseas conocer mas sobre esta comando, recomendamos la guía que


tiene Gentoo, la cual fue traducida y actualizada por Daniels Robbins.

https://gentoo-handbook.lugons.org/doc/es/articles/l-sed1.xml

Administración de Servidores GNU/Linux 127


128 www.sugeek.co
LA SHELL EN GNU/LINUX
Como mencionamos en un principio, GNU/Linux cuenta con muchas CLI
por las cuales se puede administrar el sistema.

El shell bash es uno de los numerosos shells disponibles para Linux,


también recibe el nombre de Bourne-again shell, en honor a Stephen
Bourne, creador del shell inicial (/bin/sh). Bash es compatible con sh
pero además proporciona varias mejoras tanto en las capacidades de
funciones como en las de programación. Bash incorpora características
del shell Korn (ksh) y del shell C (csh) y está diseñado en conformidad
con el estándar POSIX.

Antes de profundizar en bash, recuerde que un shell es un programa que


acepta y ejecuta comandos. También soporta construcciones de
programación que permiten la elaboración de comandos complejos a
partir de partes más pequeñas. Estos comandos complejos, o scripts,
pueden guardarse como archivos para convertirse en comandos en sí
mismos. De hecho, muchos de los comandos dentro de un típico sistema
GNU/Linux son scripts.

Regionalización e Internacionalización
A diferencia de otros sistemas, las distribuciones GNU/Linux vienen
adaptadas para funcionar con múltiples idiomas. Para cumplir un
estándar, los desarrolladores, si desean que su software este disponible
no solo en el idioma natal sino en un idioma global (Ingles) se
recomienda utilizar la internacionalización y regionalización del software
ya que utiliza las librerías del sistema para su traducción.

Regionalización(l10n)
Consiste en facilitar una traducción de un producto que corresponde a la
cultura local (Idioma, Moneda, representación simbólica, etc.)

Internacionalización (i18n)
Una función encargada de recuperar una cadena de texto en cualquier
idioma, dentro de una base verificará que idioma se utiliza y sacará la
cadena correspondiente a dicha palabra o frase.

Administración de Servidores GNU/Linux 129


En Debian y derivados se utiliza la herramienta dpkg-reconfigure locales
para configurar el idioma de la distribución.

La variable del entorno que hace referencia sobre el idioma del sistema
es LANG, suele establecerse en /etc/profile y se encuentra con el
formato idioma_Pais.norma@Variable, un ejemplo seria Español -
Colombia, la variable LANG tendría como valor es_CO.UTF-8.

El comando locale -a permite recuperar la información sobre los


elementos de regionalización soportados por el sistema. este comando
obtiene la información de /usr/share/locale, al ejecutarlo tenemos la
siguiente salida:

root@sugeek:~# locale
LANG=es_CO.UTF-8
LANGUAGE=es_CO:es
LC_CTYPE="es_CO.UTF-8"
LC_NUMERIC="es_CO.UTF-8"
LC_TIME="es_CO.UTF-8"
LC_COLLATE="es_CO.UTF-8"
LC_MONETARY="es_CO.UTF-8"
LC_MESSAGES="es_CO.UTF-8"
LC_PAPER="es_CO.UTF-8"
LC_NAME="es_CO.UTF-8"
LC_ADDRESS="es_CO.UTF-8"
LC_TELEPHONE="es_CO.UTF-8"
LC_MEASUREMENT="es_CO.UTF-8"
LC_IDENTIFICATION="es_CO.UTF-8"
LC_ALL=

Veamos el significado de las variables:

• LANG → Variable LANG


• LANGUAGE → Idioma Predeterminado
• LC_CTYPE → Clase de caracteres y conversión
• LC_NUMERIC → Formato numérico por defecto (No se incluye la
moneda)
• LC_TIME → Formato por defecto de la fecha y hora
• LC_COLLATE → Reglas de comparación y de ordenación
• LC_MONETARY → Formato monetario
• LC_MESSAGES → Formato de los mensajes informáticos
• LC_PAPER → Formato por defecto del papel para impresión o
visualización
• LC_NAME → Formato del nombre de una persona
• LC_ADDRESS → Formato de dirección

130 www.sugeek.co
• LC_TELEPHONE → Formato de teléfono
• LC_MEASUREMENT → Formato de medidas
• LC_IDENTIFICATION → Formato de identificación
• LC_ALL → Reglas para todas las otras variables de LC

Husos Horarios
GNU/Linux gestiona los husos horarios, por defecto sin configuración de
uso, se elige la hora universal UTC (Universal Time Coordinate)
invariable en el mundo.

En Debian se define el uso horario en /etc/timezone y se recomienda


modificarlo con el comando tzselect.

Codificación de Caracteres
Cuando se habla de codificación, hace referencia al idioma en el cual
esta escrito el archivo original, puede ser diferente al de nosotros -o al
de nuestra región-, se puede hablar el mismo idioma pero los caracteres
no son los mismo, por ejemplo se tendría que descodificar el es_ES si
nuestro idioma es es_CO ya que en España se maneja el Euro y en
Colombia el Peso, seria aun mas engorroso cuando el idioma de origen
es un idioma simbólico como es el Mandarín.

Estas variaciones de idioma están reguladas por las normas ISO,


siguiendo el ejemplo de España la norma ISO es la 8859-1 la cual
corresponde a los caracteres de Europa del Oeste, y la ISO 8859-15 es el
utilizado después del paso al Euro.

GNU/Linux al basarse en los estándares internacionales ayuda a otros


sistemas a resolver problemas de codificación, como es el caso de
Windows, el cual no usa dicho estándar si no que crea sus propias
tablas. Para remediar este problema se utiliza el estándar unicode el
cual es compatible con el estándar ISO 10646.

GNU/Linux por defecto utilizan el formato UTF-8.

Con el comando iconv es posible convertir una tabla de x tipo de


codificación a y tipo de codificación, ideal cuando estamos tratando con
archivos o bases de datos que no están codificadas en nuestro formato o
región. Con la opción -l se muestran todas las tablas soportadas.

Para convertir un archivo, se utiliza la siguiente sintaxis:

Administración de Servidores GNU/Linux 131


inconv -f FormatoOrigen -t FormatoDestino Archivo

Operadores de Control Shell


Los operadores son encargados establecer los parámetros durante la
ejecución de un comando, por si uno se ejecuta, se ejecuta otro
comando, o dos comandos al tiempo etc.

Operador &&
Es el operador si y solo si el cual permite la ejecución de un comando
siempre y cuando el primero se cumpla y de resultados sin errores.

root@sugeek.co:~#apt-get update && apt-get upgrade -y

Operador ||
Dicho operador significa or, es valido siempre y cuando el comando
anterior no se ejecute.

root@sugeek.co:~#more /var/log/apt/history.log || less


/var/log/apt/history.log

Operador &
Permite enviar un proceso o ejecución a background para poder seguir
trabajando sobre la shell, para llamar nuevamente dicho proceso al
foreground se usa el comando fg solo si tenemos ese comando en
background, si no, verificando el ID del Job con jobs y colocando dicho ID
después de fg.

Operador ;
Permite que un comando se ejecute cuando el comando anterior termine
sin importar si se ejecuto con errores.

Operador \
Si se coloca al final de la línea de un comando, estamos indicando que el
comando o línea de comandos que estamos escribiendo continuara en la
siguiente línea.

132 www.sugeek.co
root@sugeek.co:~#more /var/log/apt/history.log || less \
/var/log/apt/history.log > echo “Aca continuamos”

Además de indicar el final de una línea, también indica la inclusión de un


carácter especial, como una nueva línea, un tabulador, etc.

• \a → Alerta
• \b → backspace
• \n → Nueva Linea
• \r → Retorno de Carro
• \t → Tabulador Horizontal
• \v → Tabulador Vertical
• \\ → BackSlash
• \' → Comilla Simple
• \" → Comilla Doble
• \ → Espacio

Operador #
Define un comentario al final de una línea de comandos.

root@sugeek.co:~#more /var/log/apt/history.log #Comentario

Agrupación de Comandos
Se pueden agrupar comandos -Entre paréntesis- para luego hacer una
sola redirección o una sola acción con ellos.

root@sugeek:~#(uname -a ; pwd ; ls -l) > resultado

Lo anterior es igual a:

root@sugeek:~#uname -a > resultado ; pwd >> resultado ; ls -l >>


resultado

Argumentos del Shell


Los argumentos sirven para simplificar, y dar funcionalidades especiales
a ciertos scripts, o líneas de comandos.

• $# → Número de argumentos
• $* → Todos los argumentos del shell
• $- → Opciones suministradas al shell

Administración de Servidores GNU/Linux 133


• $? → Valor de retorno del último comando ejecutado
• $$ → Identificación del PID (número de proceso)
• $0 → Nombre del script
• $1 → Primer argumento
• $n → Argumento "n"

Comando echo
El comando echo Imprime en pantalla los argumentos o frases escritos
después de este.

root@sugeek.co:~# echo Hola


Hola

Comillas Doble “”
Este tipo de comillas tendrá como base la frase o argumento descrito,
teniendo en cuenta las variables o caracteres especiales que dentro de
esta se escriban.

root@sugeek.co:~# echo “Voy a imprimir mi shell: $SHELL”


Voy a imprimir mi shell: /bin/bash

Comillas Simples ' '


A diferencia de las comillas dobles, esta toma el valor ingresado dentro
de estas tal cual sin modificaciones.

root@sugeek.co:~# echo 'Voy a imprimir mi shell: $SHELL'


Voy a imprimir mi shell: $SHELL

Comillas invertidas ` `
Estas comillas se utilizan en especial cuando se asocia un comando a
una variable para que este pueda ser interpretada en un futuro.

root@sugeek.co:~# myvar=`echo “Hola Mundo”`


root@sugeek.co:~# echo $myvar
Hola Mundo

Variables Shell
Las variables en la shell de GNU/Linux van precedidas de un signo de
pesos ($). Recordemos que la variable es un valor que que se le asigna a

134 www.sugeek.co
un nombre simbólico para después ser llamada durante un proceso de
ejecución de determinado script, este valor puede o no puede cambiar.

Declaración de Variables
Para declarar una variable en la shell es muy sencillo, solo se establece
el nombre de la variable, y luego su valor.

root@sugeek.co:~# MyVar=”Esta es Mi Variable”


root@sugeek.co:~# echo $MyVar
Esta es Mi Variable

Visto lo anterior, ya podemos declarar variables temporales en nuestra


shell, pero de forma predeterminada tenemos unas variables ya
predefinidas en nuestra consola (Variables de Entorno) como lo son:

• $BASH=/bin/bash
• $COLUMNS=149
• $DESKTOP_SESSION=gnome-shell
• $DISPLAY=:0
• $EUID=1000
• $GDMSESSION=gnome-shell
• $HISTFILE=/home/sugeek/.bash_history
• $HISTFILESIZE=500
• $HISTSIZE=500
• $HOME=/home/sugeek
• $HOSTNAME=sugeek
• $HOSTTYPE=x86_64
• $LANG=es_CO.UTF-8
• $LANGUAGE=es_CO:en
• $MACHTYPE=x86_64-pc-linux-gnu
• $OSTYPE=linux-gnu
• $PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/s
bin:/usr/bin:/sbin:/bin
• $PWD=/home/sugeek
• $SHELL=/bin/bash
• $UID=1000
• $USER=sugeek

Para suprimir una variable, se usa el comando unset y el nombre de la


variable. Si se desea proteger una variable contra la supresión u
modificación se define con el comando readonly, la única manera de
quitar esa variable de solo lectura es saliendo de la shell. Cabe recordar

Administración de Servidores GNU/Linux 135


que las variables del sistema son en mayúsculas y las creadas por el
usuario se recomienda que sean en minúsculas.

Variables Tipadas
Las variables pueden ser de tipo numérico entero (integer), se
convierten con el comando typeset -i. La ventaja es que permite
efectuar cálculos y comparaciones sin pasar por expr. el comando let
permite cálculos sobre variables

Operador Función
+-*/ Operaciones Sencillas
% Modulo
< > <= >= Comparaciones, 1 si es verdadero o 0
si es falso
!= == Diferente o Igual
&& || Comparaciones Relacionadas con un
operador lógico
&|^ Lógico binario AND OR XOR

root@sugeek:~# typeset -i operacion


root@sugeek:~# operacion=5*5
root@sugeek:~# echo $operacion
25
root@sugeek:~# operacion="Prueba de Texto"
-bash: Prueba de Texto: error sintáctico en la expresión (el
elemento de error es "de Texto")
root@sugeek:~# operacion=operacion*2
root@sugeek:~# echo $operacion
50
root@sugeek:~# typeset -i operacion2
root@sugeek:~# operacion2=2
root@sugeek:~# let operacion=operacion2+8
operacion=operacion*operacion2
root@sugeek:~# echo $operacion
20

Programación en Shell
Ya vimos algunas de las variables, comandos y opciones que hacen
parte de la shell de GNU/Linux, pero es hora de aprender como

136 www.sugeek.co
agrupamos dichas órdenes en un archivo para hacer las cosas mas
fáciles.

En GNU/Linux podemos programar scripts simples o complejos según


sea nuestra necesidad, utilizando en especial la shell bash.

Nota: Un script puede ser escrito el cualquier shell y también utilizando


programas como python.

Un shell script es básicamente un programa que llama a otros


programas con la posibilidad de hacer algún tipo de procesamiento
propio, como control de flujo, operaciones matemáticas, etc.

Para crear un script se usa un editor de texto preferido, vi, nano, emacs
o los GUI como gedit, scratch, etc.

Todo script debe de iniciar con la línea #!/bin/bash o el shell por


preferencia como sh, ksh, csh, etc. Esto con el fin de indicarle a la
consola que shell va a ser utilizado en la ejecución del script, ya que no
todas las shells tiene las mismas funciones y variables.

Nuestro primer script


No estaríamos programando si nuestro primer script no fuera “Hola
Mundo” así que acá tenemos el contenido de este primer script.

Recordemos utilizar nuestro editor de texto preferido.

#!/bin/bash
echo “Hola Mundo”

Lo siguiente es darle los permisos de ejecución.

root@sugeek:~# chmod u+x miscript.sh

Nota: No necesariamente el script tiene que terminar con .sh, puede


terminar sin extensión.

Al ejecutarlo tenemos un “Hola Mundo”. Notemos el punto slash (./) el


cual da la instrucción de ejecutar el script, también se puede ejecutar
invocando a la shell que va a ser usada como bash.

root@sugeek:~# ./miscript.sh
Hola Mundo

Administración de Servidores GNU/Linux 137


root@sugeek:~#bash miscript.sh
Hola Mundo

Control de Flujo
No siempre hay un solo camino a seguir y estas proposiciones permiten
que el programa realice distintas tareas, según las condiciones de las
variables a interpretar.

Control If:
El "if" es un proposición de control que verifica si es verdadera o falsa
una condición.

Sintaxis:

if comando-condición
then
Comandos si la condición es verdadera
else
Comandos si la condición es falsa
fi

Es importante que la ubicación de las líneas se mantenga, ya que las


proposiciones if/then/else/fi se controlan línea por línea. La parte else es
opcional. En caso de querer hacer todo el control en una sola línea, las
proposiciones deberán estar separadas por un punto y coma (;).

Los comandos que estén debajo del then se ejecutarán si la condición es


verdadera. Esto quiere decir que el valor de retorno de la condición fue 0
(cero). En caso contrario se ejecutarán los comandos que le siguen a
else.

En la condición se puede poner un comando, donde la ejecución del


mismo definirá qué comandos se ejecutarán.

Unos Ejemplos:

#!/bin/bash
if ps ax | grep httpd | grep -v grep
then
echo "El web server está funcionando"
else
echo "El web server NO esta funcionando"

138 www.sugeek.co
fi

#!/bin/bash
if [ -w /etc/passwd ]
then
echo "Tengo permisos de escritura en el archivo /etc/passwd"
else
echo "NO tengo permisos de escritura en el archivo /etc/passwd"
fi

Puede suceder que tengamos que probar mas de una condición, para
esto, podemos utilizar la siguiente estructura:

if condición1
then
Comando1
Comando2
elif condición2
then
Comando1
Comando2
else
Comando-por-defecto #Ninguna de las anteriores es verdadera
fi

Esta es una manera de abreviar varias estructuras if - then - else - if en


una sola, pudiendo utilizarse más de dos condiciones.

La estructura de control if, es muy utilizada con test, que no es más que
una operación de comparación, en las condiciones que se requieran.

Control case:
El "case" es una proposición que puede analizar y validar varios casos
(opciones) del valor de una variable.

Sintaxis:

case variable in
patrón | patrón)
Comando;
Comando;
Comando;;

Administración de Servidores GNU/Linux 139


patrón | patrón)
Comando;
Comando;
Comando;;
*)
Comandos si ningún otro valor fue igualado;;
esac

El case es raramente usado, pero es muy eficiente en algunos casos.

#!/bin/bash
case $mes in
ene*|Ene*)
echo "Mes de Enero";;
feb*|Feb*)
echo "Mes de Febrero";;
mar*|Mar*)
echo "Mes de Marzo";;
*)
echo "Algún otro mes!";;
esac

Ciclos
Los ciclos contienen secciones del programa que se repetirán una
determinada cantidad de veces o hasta que alguna condición cambie.

Ciclo for
El for debe ser el ciclo más utilizado, es muy práctico cuando se trabaja
con shell scripts.

A diferencia de los lenguajes de programación más comunes, un ciclo for


dentro de un shell script realiza una acción dada sobre cada uno de los
elementos de una lista, y no sobre una variable.

La variable utilizada en el for (en este caso $i) es reemplazada por cada
una de las palabras de la lista, en cada ciclo del for.

Sintaxis:

for i in lista de palabras


do
cuerpo del ciclo, $i tiene el valor de elementos sucesivos de la lista
done

140 www.sugeek.co
#!/bin/bash
for i in `ls -1 /tmp`
do
echo $i
rm -i $i
done

En este ciclo, el comando ls -1 /tmp, generará una lista de todos los


archivos que existen en el directorio /tmp. Dentro del cuerpo del ciclo
imprimimos el contenido de la variable y luego preguntamos si se desea
borrar ese archivo -opción -i del comando rm-.

Ciclo while
Este ciclo utiliza la condición de terminación de un comando -valor de
retorno- para controlar la ejecución de los comando dentro del ciclo.
Termina la ejecución del ciclo, cuando el comando devuelve falso -algo
diferente a 0-.

Sintaxis:

while comando
do
cuerpo del ciclo ejecutado a condición de
que el comando devuelva verdadero
done

#!/bin/bash
while sleep 60s
do
who | grep daniel
done

En este ejemplo, cada 60 segundos, verificará si el usuario daniel ha


ingresado al equipo. En caso de que lo haya hecho, el listado del who
saldrá por pantalla (cada 60 segundos).

Ciclo until
Este ciclo se comporta de una manera muy similar al anterior, ya que
define su control dependiendo del comando que ejecuta (si éste da
verdadero, se sigue ejecutando el ciclo).

Administración de Servidores GNU/Linux 141


Sintaxis:

until comando
do
cuerpo del ciclo ejecutado a condición
de que el comando devuelva falso.
done

#!/bin/bash
until who | grep daniel
do
sleep 60s
done

En este ejemplo, a diferencia del ejemplo del ciclo while, el ciclo ejecuta
primero el comando, de esta forma no es necesario esperar 60 segundos
para saber si el usuario Daniel esta conectado en el equipo, si el usuario
esta conectado, el ciclo termina.

Funciones
Las funciones son un recurso esencial para la buena programación,
permiten escribir una sola vez un pedazo de código que se repita varias
veces en el script, y así, minimizar el margen de error y también la
cantidad de líneas en el programa.

Para utilizarlas simplemente se hace un llamado a la función. Las


funciones pueden estar dentro del mismo shell script, o en un archivo
aparte. Cuando se escriben las funciones en un archivo aparte, es muy
importante utilizar el comando "." (punto) para cargarlas en memoria. Si
no se cargan en memoria de esta manera, las funciones no estarán
disponibles.

#!/bin/bash
. /home/funciones.sh #Se cargan las funciones de un archivo externo

La sintaxis para utilizar funciones es muy sencilla y no agrega mayor


dificultad. El modo de uso se remite a definir la función especificando el
nombre y paréntesis que abren y cierran. Todos los comandos que
involucran la función se encierran con llaves.

Un ejemplo de la función mas desastrosa en GNU/Linux, es la famosa


bomba fork :(){:|:&};:

142 www.sugeek.co
Expliquémosla:

• : → Nombre de la Función.
• { → Abre el contenedor y tareas de la función.
• :|: → Se llama a si misma y el resultado se lo envía así misma.
• & → Se envía así misma a un proceso de segundo plano.
• } → Cierra las actividades de la función.
• ; → Termina la Función.
• : → Se llama nuevamente

Como se puede observar es un ciclo repetitivo el cual, si no se cancela


colapsa la memoria del sistema si estamos con root.

Valores de retorno
Las funciones pueden devolver valores de error utilizando el comando
"return <valor>". En caso de que no se especifique un valor de retorno
de esta forma, el valor retornado será el que retorne el último comando
ejecutado dentro de la función. Desafortunadamente no es posible
asignar el valor retornado en una sola línea, siempre es necesario
utilizar la variable especial "$?".

Ejemplo:
#!/bin/sh
func () {
return $1
}
func 0
echo "ret: ($?)"
func 1
echo "ret: ($?)"
func 2
echo "ret: ($?)"
func 3
echo "ret: ($?)"

Variables locales a la función


Existe la posibilidad de utilizar variables locales a la función, esto
significa que la variable solamente va a existir durante la ejecución de la
función.

Para crear una variable local a la función se utiliza el operador "local


<nombre_de_variable>".

Administración de Servidores GNU/Linux 143


Ejemplo:
#!/bin/sh
func () {
local x
x=$1
echo "Dentro de la función \$x vale ($x)"
}

echo "Antes de ejecutar la función \$x vale ($x)"


func HOLA!!
echo "Después de ejecutar la función \$x vale ($x)"

Operaciones Aritméticas
Existen varias formas de calcular valores dentro de un shell script.
Tradicionalmente, estos cálculos se hicieron con programas externos,
esto generaba un retardo inmenso en la ejecución del shell script.

Hoy los nuevos intérpretes traen la posibilidad de hacer cálculos


internamente. Para esto se utiliza una sintaxis especial, y es muy
importante que los valores de las variables que utilicen para hacer estos
cálculos sean números únicamente.

La sintaxis para hacer operaciones aritméticas es la siguiente:

$[<expresión>]

Las operaciones que se pueden realizar son:


• suma $((1+1))
• resta $((2-1))
• multiplicación $((2*2))
• división $((2/2])
• otras como suma de bits, sacar el módulo, evaluación de
igualdad, etc.

Ejemplo:
#!/bin/sh
x=2
tot=$[$x+1]
echo "tot: ($tot)"

Operaciones lógicas y de comparación


En if podemos usar un nuevo elemento, los corchetes que evalúan las
condiciones, esto esta basado directamente en test. Y éste nos sirve

144 www.sugeek.co
para comparar variables.

• -lt → Menor que


• -eq → Igual que
• -gt → Mayor que
• -le → Menor o igual que
• -ge → Mayor o igual que
• -ne → No coinciden
• -a → Operador lógico and
• -o → Operador lógico or
• != → Distinto

Con lo anterior podemos comparar dos valores o variables con el


comando test.

root@sugeek:~# test 1 -eq 1 ; echo $?


0

En el anterior ejemplo estamos probando ( test) que 1 es igual a 1 ( 1 -eq


1) y si es verdadero da como resultado 0 (echo $?). Con esto estamos
comparando 2 valores, lo cual lo podemos hacer dentro de un script
usando if.

El siguiente script hace la comprobación si un archivo es ejecutable, lo


cual si no es ejecutable lo convierte a ejecutable, si es ejecutable arroja
un mensaje.

#!/bin/bash
if [ ! -x $FILE ]
then
chmod +x $FILE
else
echo "$FILE es ejecutable"
fi

Interacciones con el Usuario


En ocasiones es necesario que el usuario interactúe con la CLI, ya sea
para que indique el directorio de instalación del programa o script, o solo
para pedir confirmación, para ello usamos read o dialog.

Comando read
El comando read es muy sencillo. Le indicamos que solicite el valor de

Administración de Servidores GNU/Linux 145


una variable al usuario, el usuario escribe una línea de texto -es decir,
cualquier cosa hasta que presione enter-, y la variable toma el valor que
el usuario ingresó.

#!/bin/bash
echo “Escriba el contenido de la Variable A”
read A
echo “Se imprime en pantalla el valor de la variable A”
echo $A

Del script anterior tenemos como resultado:

root@sugeek:~# ./script.sh
Escriba el contenido de la Variable A
www.sugeek.co
Se imprime en pantalla el valor de la variable A
www.sugeek.co

Comando dialog
Este comando permite generar una “GUI” dentro del CLI, permitiendo
interactuar al usuario con las teclas del cursor, de esta manera el
programa o script se vuelve mas amigable.

Un ejemplo seria -invitamos que ejecutes el siguiente comando-:

dialog --title "Que SO Usas" --backtitle "Que SO Usas" --checklist


"¿Que SO usas?:" 0 0 0 1 "GNU/Linux" on 2 "Windows" off 3 "MacOS"
off

Puede crear preguntas si/no, menú, lista, calendario, barra de progreso,


etc. Se recomienda ver su página manual man dialog.

146 www.sugeek.co
ADMINISTRACIÓN DE UNIDADES DE
ALMACENAMIENTO
Como ya sabemos, GNU/Linux identifica los distintos dispositivos de
almacenamiento (Discos Duros) como es el sd (sda, sdb, etc...) y el hd
(hda, hdb, etc...), estos dispositivos tienen características especiales
como velocidades de escritura/lectura, recordando que los discos de
estado sólido o SSD son de mejor rendimiento que los mecánicos o
discos duros convencionales. En cuanto a los discos duros mecánicos
están compuestos por platos, cabezales, pistas, sectores, etc. Así como
lo podremos encontrar tanto para computadoras de escritorio,
servidores, portátiles, etc.

Dentro de estos discos, encontramos particiones primarias, lógicas, se


pueden formar Logical Volumen Manager, RAID's, etc. A continuación
vamos a entender el funcionamiento dentro del sistema de archivo de
GNU/Linux y a configurar algunas de estas tecnologías.

Nota: En este apartado no vamos a profundizar ni en conectividad, tipos


de discos, ni nada lo que respecta al hardware como tal.

¡IMPORTANTE!
Los discos duros están divididos por bloques, y un archivo SIEMPRE
ocupa un bloque completo sin importar su tamaño, por eso si un archivo
pesa solo 1byte y el bloque por defecto es de 4096bytes significa que se
están perdiendo 4095bytes, a lo que conlleva a una ocupación rápida del
espacio en disco. Se debe tener en cuenta la finalidad del sistema de
archivos, no es lo mismo un servidor de archivos, a un servidor de base
de datos y a un servidor de hosting web.

Superbloque
Cada sistema de archivos dispone de al menos un superbloque, el cual
es el encargado de contener información respecto al sistema de archivos
como:

• Tipo
• Tamaño
• Estado
• Otros Superbloques
• Tabla de Inodos

Administración de Servidores GNU/Linux 147


GNU/Linux intenta primero leer el superbloque del primer disco, puede
ocurrir que este último esté corrupto después de malas operaciones o
una avería, en este caso, ya no se puede acceder a los datos del disco
ya que no es posible saber que tipo de sistema de archivos es, la
cantidad de inodos, etc. GNU/Linux posee una copia de estos
superbloques repartidos por todo el sistema de archivos, así que si se
corrompe el disco es posible reconstruir el sistema de archivos con el
comando fsck.

MBR
El MBR o Master Boot Record se encuentra en el sector 0 de un
dispositivo de almacenamiento, normalmente en este se guarda
información del arranque del SO, tablas de particiones, identificador del
disco. El MBR tiene un tamaño de 512 Bytes.

En GNU/Linux, podemos realizar un backup del MBR

root@sugeek:~# dd if=/dev/xxx of=mbr.backup bs=512 count=1

Si deseamos restaurar el MBR escribimos

root@sugeek:~# dd if=mbr.backup of=/dev/xxx bs=512 count=1

Esto se hace con la finalidad de respaldar el MBR y recuperarlo por si


llega a fallar el sistema de archivos.

¡IMPORTANTE!
Actualmente MBR solo es soportado por BIOS o UEFI/EFI en modo legacy,
se recomienda el uso de particiones GPT.

Particiones soportadas
GNU/Linux soporta una gran cantidad de tipos de particiones, que se
listan a continuación.

148 www.sugeek.co
Archivo /etc/fstab
FileSystem Table o Tabla de sistema de Archivos. En este archivo se
encuentran las diferentes configuraciones de los sistemas de archivos
soportados por GNU/Linux. Este archivo se usa a menudo cuando se
tienen unidades externas y deseamos que se monten al iniciar el
sistema operativo. La estructura de este archivo es:

<dispositivo> <punto_de_montaje> <sistema_de_archivos> <opciones>


<dump-freq> <pass-num>
• Dispositivo → Es el directorio lógico que hace referencia a una
partición o recurso
• Punto de Montaje → Indica dónde se va a montar el dispositivo
• Sistema de Archivos → Esto va asociado según sea el dispositivo
montado.
◦ Ntfs → Cuando es Windows XP o mayores
◦ fat → Si la partición es de tipo FAT32
◦ vfat → Cuando la partición es de tipo FAT16
◦ iso9660 → Para DVD's, CD's y discos ópticos.
◦ sw → Para la partición tipo swap
◦ ext# → Sistema por default de Linux ext2 ext3 o ext4
◦ auto → Cuando no se esta seguro que tipo de sistema de
archivos es.

Administración de Servidores GNU/Linux 149


• Opciones → Se estipulan los parámetros del comando mount,
estas opciones deben de estar separadas por comas ( , ).
◦ auto → Con esta opción hacemos que el dispositivo que la
contenga sea iniciado siempre que se inicie el sistema, es
decir, cada vez que este sea encendido.
◦ no auto → Opción contraria a auto, con ella hacemos que el
dispositivo no sea montado al iniciarse el sistema y tan solo
sera montado en el momento en el que queramos usarlo; esta
opción suele ser utilizada con dispositivos como las
disqueteras, cd-roms, dvd, pendrives-usb, etc.
◦ async → Con esto hacemos que las operaciones que
realicemos no se hagan en el mismo momento en que las
realizamos/pedimos, si no que pueden ser realizada mas
adelante.
◦ sync → Es la opción contraria a async. Añadiendo la opción
sync fijaríamos que los datos sean transferidos, guardados o
borrados, en el momento en que pedimos que se hagan. Esta
opción puede servir de mucho, y sobre todo ahorrarnos
tiempo en la manera en la que se transfieren datos a
dispositivos como los pen-drives y aquellos que se utilizan
mediante conexión usb en los cuales necesitamos
acceso/transferencia rápido/a.
◦ Exec → Esta opción hace que puedas ejecutar programas,
ficheros script (guiones), o cualquier otra cosa cuyos permisos
indiquen que es ejecutable, de ese sistema de ficheros.
◦ Noexec → Impide la ejecución de cualquier archivo en el
dispositivo en el que esta opción sea activada, esta opción
suele ser muy útil cuando en una misma maquina diversos
usuarios tienen acceso a un mismo dispositivo y no queremos
que estos puedan ejecutar archivos en los dispositivos, con
esto ganamos en seguridad, ya que impedimos que los otros
usuarios puedan ejecutar cualquier tipo de archivo “maligno”
a través del cual lo que realmente quieren conseguir es
escalar privilegios en el sistema.
◦ gid=Valor → Con esta opción indicamos que tan solo el grupo
que posee el Valor especificado tenga el control sobre los
archivos del dispositivo. Puede tratarse de un valor numérico
gid=1000 o del nombre del grupo de usuarios
(gid=users,gid=usuarioslectordvd).
◦ uid=Valor → Con esta opción indicamos que tan solo el
usuario que posee el Valor especificado tenga el control sobre
los archivos del dispositivo.
◦ Owner → indica que el propietario del sistema de ficheros (el

150 www.sugeek.co
que tiene derechos a montar y desmontar el dispositivo) será
aquel que lo montó (el primer usuario distinto de root
conectado al sistema localmente), pero normalmente sera el
usuario root si el sistema de ficheros viene configurado para
montarse automáticamente durante el arranque.
◦ Ro → read-only. Con esta opción hacemos que no se pueda
escribir en el dispositivo, que tan solo se pueda leer.
◦ Rw → read-write. Con esto montamos la partición para que
sea posible tanto leer como escribir en el dispositivo físico,
esta opción es muy usada con dispositivos que permiten la
escritura como por ejemplo los pendrive o los disquets, ya
que sin esta opción, no podríamos guardar datos en dichos
dispositivos.
◦ User → Permite a cualquier usuario del sistema montar o
desmontar un dispositivo físico sin necesidad de ser root, esta
opción es muy útil para dispositivos de uso frecuente, como
cd-roms o disquetes. Pero también debe tenerse en cuenta,
que el usuario que montó el dispositivo, solo el mismo usuario
podrá desmontar el dispositivo.
◦ Users → Indica que cualquier usuario puede montar y
cualquiera también, puede desmontar el dispositivo.
◦ Nouser → Debes ser el usuario root para montar el sistema de
ficheros, nadie más que el superusuario podrá hacerlo.
• dump-freq → Es el comando que utiliza dump para hacer
respaldos del sistema de archivos, si es cero no se toma en
cuenta ese dispositivo.
• Pass-num → Indica el orden en que la aplicación fsck revisará la
partición en busca de errores durante el inicio, si es cero el
dispositivo no se revisa.

Nota: Se recomienda indicar el UUID del dispositivo, ya que de este


modo evitaremos fallas al arranque del sistema. Ver el Comando blkid

Comando lsscsi
Este comando identifica los discos que tenemos conectados en nuestro
sistema, normalmente no viene instalado en Debian, pero se puede
instalar con aptitude install lsscsi.

La salida del comando es la siguiente:


root@sugeek:~# lsscsi
[1:0:0:0] cd/dvd VBOX CD-ROM 1.0 /dev/sr0
[2:0:0:0] disk ATA VBOX HARDDISK 1.0 /dev/sda

Administración de Servidores GNU/Linux 151


Comando hdparm
Con la opción -I muestra información del disco seleccionado usando la
información del sistema, si se usa la opción -i muestra es información
obtenida por el kernel. Dicho comando en ocasiones no se instala de
forma predeterminada.

root@sugeek:~# hdparm -I /dev/sda


/dev/sda:
ATA device, with non-removable media
Model Number: VBOX HARDDISK
Serial Number: VB66e02ab6-0256918b
Firmware Revision: 1.0
Standards:
Used: ATA/ATAPI-6 published, ANSI INCITS 361-2002
Supported: 6 5 4
Configuration:
Logical max current
cylinders 16383 16383
heads 16 16
sectors/track63 63
--
CHS current addressable sectors: 16514064
LBA user addressable sectors: 41943040
LBA48 user addressable sectors: 41943040
Logical/Physical Sector size: 512 bytes
device size with M = 1024*1024: 20480 MBytes
device size with M = 1000*1000: 21474 MBytes (21 GB)
cache/buffer size = 256 KBytes (type=DualPortCache)
Capabilities:
LBA, IORDY(cannot be disabled)
Queue depth: 32
Standby timer values: spec'd by Vendor, no device specific
minimum
R/W multiple sector transfer: Max = 128 Current = 128
DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5
*udma6
Cycle time: min=120ns recommended=120ns
PIO: pio0 pio1 pio2 pio3 pio4
Cycle time: no flow control=120ns IORDY flow
control=120ns
Commands/features:
Enabled Supported:
* Power Management feature set
* Write cache
* Look-ahead
* 48-bit Address feature set
* Mandatory FLUSH_CACHE

152 www.sugeek.co
* FLUSH_CACHE_EXT
* Gen2 signaling speed (3.0Gb/s)
* Native Command Queueing (NCQ)
Checksum: correct

Pero hdparm no solo sirve para obtener información del disco, este
también permite realizar modificación al disco, como ancho de banda del
bus de datos, etc.

Este comando es muy delicado, es recomendable conocer con exactitud


el disco, y que tecnologías soporta.

Para mas información, se recomienda utilizar la página manual del


comando, además con el comando dumpe2fs también se puede obtener
suficiente información sobre un dispositivo.

Montar y desmontar una unidad de almacenamiento


Con el comando mount y umount podremos montar y desmontar
unidades como USB, Discos Duros Externos, DVD's, Discos Duros
Internos y un largo etc. Recordemos que estas unidades las
encontramos en el directorio /dev demarcados como sda1 o hda0 etc.

Comando mount
Este comando permite montar las unidades que deseemos indicando
unas opciones o sin estas. La estructura de este comando es:

mount -t tipodesistema -o opciones /dev/dispositivo /carpetadestino

Los sistema de archivos soportados por mount son:

• auto (intenta descubrir automáticamente el sistema de archivos).


• iso9660 (sistema de archivos de los CD y DVD).
• ext2 (sistema de archivos muy extendido en maquinas Linux).
• ext3 (igual que ext2 pero además añade journaling).
• ext4 (introdujo significativas mejoras respecto a ext3)
• reiserfs (otro sistema muy utilizado en maquinas Linux).
• msdos (para dispositivos que usen FAT12 o FAT16).
• vfat (para dispositivos que usen FAT32).
• ntfs (sistema de archivos NTFS de Windows NT, XP, etc.).
• smbfs (sistema de archivos de Samba).
• nfs (sistema de archivos de red NFS).

Administración de Servidores GNU/Linux 153


• hfs y hfsplus (acceden a sistemas de archivos de Apple
Macintosh).

Además las opciones de este, son similares -por no decir iguales- a las
contenidas del archivo /etc/fstab ya que en este archivo utiliza el
comando mount.

Se recomienda en un sistema de archivos de almacenamiento montar


los discos con el UUID ( Universal Uniq Identifier) ya que es probable que
las “letras” de los discos cambien, pero el UUID es único y no cambia.

Para saber el UUID de un disco se usa el comando blkid.

root@sugeek:~# blkid /dev/sdd1


/dev/sdd1: UUID="fb2f1f0f-9fbc-4f9d-820a-27ea6ad707d8" TYPE="ext4"

Después de tener el UUID del disco se procede a montarlo.

root@sugeek:~# mount -t ext4 -U fb2f1f0f-9fbc-4f9d-820a-27ea6ad707d8


/home/datos

Además de permitir sistemas de archivos como unidades de


almacenamiento, también permite montar imágenes de DVD o CD.

root@sugeek/:# mount -t iso9660 -o loop dvd.iso /mnt/iso

Comando umount
A contrario del mount este se encarga de desmontar la unidad
montada, este comando es sencillo de usar la estructura es:

umount /dev/dispositivo
umount /carpetamontada

Comando lsof
Este comando permite verificar que archivos están usando el dispositivo
-sin opciones muestra todos los archivos abiertos y asociados al
proceso-, ya que en ocasiones cuando se desea desmontar un
dispositivo arroja el mensaje “Dispositivo Ocupado, no se puede
desmontar”

soporte@sugeek:~$ lsof /dev/sdb1


COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

154 www.sugeek.co
pantheon- 25828 soporte 29r REG 8,17 18356 104
/media/SUGEEK/img.jpg

Se podrá terminar el proceso usando su PID, pero también podemos


terminar todos los procesos asociados a dicho dispositivo con fuser
-km /media/SUGEEK

Particiones de las Unidades


Si queremos ver específicamente que particiones tiene nuestro sistema
solo basta con verificar el archivo /proc/partitions.

root@sugeek:~# cat /proc/partitions


major minor #blocks name

8 0 20971520 sda
8 1 194560 sda1
8 2 1 sda2
8 5 20773888 sda5
11 0 1048575 sr0
254 0 1949696 dm-0
254 1 9764864 dm-1

Con el comando fdisk -el comando cfdisk es mas "gráfico"- podemos


crear diferentes particiones sobre una unidad de disco, ya hemos visto
un poco de las características de fdisk con la opción -l.

Comando fdisk
!IMPORTANTE¡
Con este comando solo podremos crear particiones de máximo 2TB, lo
cual se supondría que seria mas que suficiente si vamos a crear
RAID+LVM, y aun son pocos los discos que superen esta capacidad, para
particiones con mayor capacidad se recomienda usar gdisk el cual usa
GPT como método de particionado y esta disponible para UEFI.

Como se mencionó en el enunciado anterior, fdisk es un comando


completo para la administración de particiones. Para obtener mas
información escribir man fdisk. La estructura del comando es:

fdisk /dev/dispositivo

Al ingresar, nos pregunta qué deseamos hacer, para tener mas claro las
opciones solo oprimimos la tecla m de fdisk. (Eliminar, listar, crear, etc)

Administración de Servidores GNU/Linux 155


root@sugeek:~# fdisk /dev/sda
El dispositivo presenta un tamaño de sector lógico que es menor
que el tamaño de sector físico. Alínear a un límite de tamaño de
sector
físico (o E/S óptima) es recomendable o se resentirá el rendimiento.

Orden (m para obtener ayuda): m


Orden Acción
a Conmuta el indicador de iniciable
b Modifica la etiqueta de disco bsd
c Conmuta el indicador de compatibilidad con DOS
d Suprime una partición
l Lista los tipos de particiones conocidos
m Imprime este menú
n Añade una nueva partición
o Crea una nueva tabla de particiones DOS vacía
p Imprime la tabla de particiones
q Sale sin guardar los cambios
s Crea una nueva etiqueta de disco Sun
t Cambia el identificador de sistema de una partición
u Cambia las unidades de visualización/entrada
v Verifica la tabla de particiones
w Escribe la tabla en el disco y sale
x Funciones adicionales (sólo para usuarios avanzados)

Como observamos, las diferentes opciones permitirá preparar un disco


para diferentes ambientes de producción como lo son RAIDS, LVM, etc.

Vamos a crear una partición sobre el disco /dev/sdb, se recomienda


hacer esto en discos desmontados y no activos, ya que puede llevar a
pérdida de datos.

root@sugeek:~# fdisk -l | grep sd


El disco /dev/sdb no contiene una tabla de particiones válida
El disco /dev/sdc no contiene una tabla de particiones válida
Disco /dev/sda: 8589 MB, 8589934592 bytes
/dev/sda1 * 2048 487423 242688 83 Linux
/dev/sda2 487424 16775167 8143872 83 Linux
Disco /dev/sdb: 8589 MB, 8589934592 bytes
Disco /dev/sdc: 8589 MB, 8589934592 bytes

Vemos que el disco es un disco de 8GB, procedemos a seleccionarlo:

root@sugeek:~# fdisk /dev/sdb


El dispositivo no contiene una tabla de particiones DOS válida ni
una etiqueta de disco Sun o SGI o OSF

156 www.sugeek.co
Building a new DOS disklabel with disk identifier 0x6dfdc02e.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Atención: el indicador 0x0000 inválido de la tabla de particiones 4


se corregirá m9.2. Procedimientos. ediante w(rite)

Luego de haber seleccionado el disco a particionar, procedemos a crear


las particiones que necesitemos. Con la opción l podemos observar los
tipos de sistemas de archivos soportados.

Después de conocer los tipos de sistemas de archivos soportados,


procedemos a crear la partición tipo Linux.

Indicando la opción n crearemos una nueva partición, solicitara que tipo


de partición deseamos crear, si primaria o lógica, oprimimos p para
primaria -recordemos que en un disco solo se pueden crear 4 particiones
primarias-. Después de ello solicita el número de la partición, indicamos
que es la uno (1) y por último el tamaño que se desea dar, puede ser
tipo sectores o tamaño directo indicando si va a ser en Kylobytes (K),
MegaBytes (M) o Gigabytes (G), pero lo dejaremos tal cual para usar
todo el disco.

Orden (m para obtener ayuda): n


Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Número de partición (1-4, valor predeterminado 1): 1
Primer sector (2048-16777215, valor predeterminado 2048):
Se está utilizando el valor predeterminado 2048
Last sector, +sectores or +size{K,M,G} (2048-16777215, valor
predeterminado 16777215):
Se está utilizando el valor predeterminado 16777215

Ya tenemos creada nuestra partición, ahora falta indicar el tipo de


archivo que soportara, ingresamos la opción t para indicarle el tipo de
sistema de archivos que se va a configurar -de forma predeterminada
las particiones se crean soportando el sistema de archivos ext-,
seleccionamos la partición que se va a cambiar el tipo de sistema de
archivos y luego con l vemos los distintos sistemas de archivos
soportados, validamos el que deseamos, en este momento nos interesa
el tipo Linux asi que escribimos 83. Con la opción p mostramos las

Administración de Servidores GNU/Linux 157


particiones que hemos creado en memoria pero que aun no se han
escrito en el disco.

Orden (m para obtener ayuda): t


Se ha seleccionado la partición 1
Código hexadecimal (escriba L para ver los códigos): 83

Orden (m para obtener ayuda): p

Disco /dev/sdb: 8589 MB, 8589934592 bytes


255 heads, 63 sectors/track, 1044 cylinders, 16777216 sectores en
total
Units = sectores of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificador del disco: 0x254b8c68

Disposit. Inicio Comienzo Fin Bloques Id Sistema


/dev/sdb1 2048 16777215 8387584 83 Linux

Como vemos ya el disco sdb tiene una partición creada en memoria mas
no se han escrito los campos en el disco, para que dichos cambios
tomen efecto, damos la opción w la cual indica Write sobre el disco.

Orden (m para obtener ayuda): w


¡Se ha modificado la tabla de particiones!

Llamando a ioctl() para volver a leer la tabla de particiones.

Después de haber particionado nuestro disco, lo podemos observar con


el comando fdisk -l | grep sdb el cual mostrara la información de dicho
disco y sus particiones.

root@sugeek:~# fdisk -l | grep sdb


El disco /dev/sdc no contiene una tabla de particiones válida
Disco /dev/sdb: 8589 MB, 8589934592 bytes
/dev/sdb1 2048 16777215 8387584 83 Linux

Ya tenemos nuestro disco preparado para ser formateado, y montado


sobre un directorio.

Para eliminar una partición seleccionamos el disco, y luego indicamos la


opción d seleccionamos la partición a borrar y por último escribimos los
cambios con la opción w. Recordemos que el dispositivo debe de estar
desmontado para poder eliminar las particiones.

158 www.sugeek.co
Si sobre el disco que estamos trabajando cuenta con particiones y no es
posible desmontarlo, pero aun así tiene bloques disponibles para crear
una nueva partición y dicha partición después de crearla no se muestra
en el sistema, se usa el comando partprobe /dev/sdx -la x indica la letra
del disco-, esto con el fin de sincronizar nuevamente las tablas de
particiones del sistema.

Comando gdisk
Como ya hemos visto, el comando fdisk está diseñado para administrar
particiones con MBR no mayores a 2TB, pero si vamos a administrar
particiones de mayor tamaño se recomienda el uso de UEFI y particiones
GPT.

El comando gdisk funciona de forma similar al comando fdisk. Si


tenemos particionado con MBR es muy probable que no se tenga
instalado dicho comando, para solventar esto, procedemos a instalarlo
con apt-get install gdisk.

Para evidenciar que particiones tiene un disco, se procede a ejecutar el


comando precedido del disco.

root@sugeek:~# gdisk -l /dev/sdc


GPT fdisk (gdisk) version 0.8.10

Partition table scan:


MBR: not present
BSD: not present
APM: not present
GPT: not present

Creating new GPT entries.


Disk /dev/sdc: 10485760 sectors, 5.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): ADFBBBCE-0BCA-4A4A-A4F7-0893C8EDB5A7
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 10485726
Partitions will be aligned on 2048-sector boundaries
Total free space is 10485693 sectors (5.0 GiB)

Number Start (sector) End (sector) Size Code

¡IMPORTANTE!
Ya la noción de particiones primarias o extendidas se pierden con GPT,

Administración de Servidores GNU/Linux 159


ahora las particiones van numeradas de 1 a 128.

Ahora que hemos identificado el disco a particionar, procedemos a crear


las particiones.

Evidenciamos que las opciones son similares a las del comando fdisk,
Crear una partición con la opción n, eliminarla con la d, imprimir en
pantalla las particiones creadas o del disco con p, escribir los cambios en
el disco con w, pero la ayuda es con el signo de interrogación ?.

root@sugeek:~# gdisk /dev/sdc


GPT fdisk (gdisk) version 0.8.10

Partition table scan:


MBR: not present
BSD: not present
APM: not present
GPT: not present

Creating new GPT entries.

Command (? for help): n


Partition number (1-128, default 1): 1
First sector (34-10485726, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-10485726, default = 10485726) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

Command (? for help): p


Disk /dev/sdc: 10485760 sectors, 5.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 83CA323D-1986-4824-87E7-FD23B8120E49
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 10485726
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number Start (sector) End (sector) Size Code Name


1 2048 10485726 5.0 GiB 8300 Linux
filesystem

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE
EXISTING
PARTITIONS!!

160 www.sugeek.co
Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.

Otro aspecto que cambia, son los códigos de particiones -se muestran
con la opción L-.

Por ejemplo, para crear tipo de partición de tipo LVM debemos de


ingresar el código 8e00 -en fdisk es 8e-.

root@sugeek:~# gdisk /dev/sdc


GPT fdisk (gdisk) version 0.8.10

Partition table scan:


MBR: protective
BSD: not present
APM: not present
GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): p


Disk /dev/sdc: 10485760 sectors, 5.0 GiB
Logical sector size: 512 bytes

Administración de Servidores GNU/Linux 161


Disk identifier (GUID): 83CA323D-1986-4824-87E7-FD23B8120E49
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 10485726
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number Start (sector) End (sector) Size Code Name


1 2048 10485726 5.0 GiB 8300 Linux
filesystem

Command (? for help): t


Using 1
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8e00
Changed type of partition to 'Linux LVM'

Command (? for help): p


Disk /dev/sdc: 10485760 sectors, 5.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 83CA323D-1986-4824-87E7-FD23B8120E49
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 10485726
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number Start (sector) End (sector) Size Code Name


1 2048 10485726 5.0 GiB 8E00 Linux LVM

Si abrimos el disco con fdisk arroja una advertencia donde indica que se
use GNU Parted (gparted).

root@sugeek:~# fdisk /dev/sdc


WARNING: GPT (GUID Partition Table) detected on '/dev/sdc'! The util
fdisk doesn't support GPT. Use GNU Parted.

Formatear Unidades
Después de tener preparado nuestro disco con las particiones, es
momento de darle un formato a dichas particiones para que este se
pueda usar como medio de almacenamiento. Para ello usamos el
comando mkfs.

En esta ocasión vamos a utilizar el sistema de archivos Linux ext4.

La estructura del comando mkfs es:

mkfs -t ext4 -b 1024 -c -i 163384 -m 0 -L “Datos” /dev/dispositivo

162 www.sugeek.co
Algunas opciones que tiene el comando mkfs es:

• -b → Tamaño de los bloques, en múltiplo de 512, se recomienda


dejar los bloques de 1024.
• -c → Comprobar el disco por sectores defectuosos
• -i → Indica el tamaño del inodo según el disco (un inodo es de 128
bytes), el cual puede limitar la cantidad de archivos que se
pueden crear, pero permite ganar mas espacio. -i 4096: un inodo
por cada 4KB.
• -m → Porcentaje reservado para root, normalmente el 5% del
espacio en disco. Ponerlo a 0 permite ganar espacio en disco en
cuanto al trabajo.
• -L → Etiqueta del Disco

Con el comando e2label permite cambiar el Label al disco.

También tenemos el comando mkfs.ext# el cual es un poco mas


completo y el mas usado, así que procederemos a darle un sistema de
archivos a nuestra partición.

root@sugeek:~# mkfs.ext4 /dev/sdb1


mke2fs 1.42.5 (29-Jul-2012)
Etiqueta del sistema de ficheros=
OS type: Linux
Tamaño del bloque=4096 (bitácora=2)
Tamaño del fragmento=4096 (bitácora=2)
Stride=0 blocks, Stripe width=0 blocks
524288 inodes, 2096896 blocks
104844 blocks (5.00%) reserved for the super user
Primer bloque de datos=0
Número máximo de bloques del sistema de ficheros=2147483648
64 bloque de grupos
32768 bloques por grupo, 32768 fragmentos por grupo
8192 nodos-i por grupo
Respaldo del superbloque guardado en los bloques:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: hecho


Escribiendo las tablas de nodos-i: hecho
Creating journal (32768 blocks): hecho
Escribiendo superbloques y la información contable del sistema de
ficheros: hecho

Con el comando mkfs.ext4 podremos indicar el tamaño del bloque, el

Administración de Servidores GNU/Linux 163


tamaño del inodo y muchas mas características, para ello diríjase a la
página manual del comando.

Unidad SWAP o Memoria de Intercambio


Es la partición que hace sus labores ocasionalmente como si fuese una
memoria RAM, cuando es requerida por el sistema. Esta memoria “RAM”
se encuentra en una partición/archivo especial dentro de nuestro disco
duro.

Esta se puede crear durante la instalación del sistema o luego en un


pendrive, archivo, etc. Para tener la partición SWAP se recomienda lo
siguiente.

• Colocarla después de la partición boot.


• Si el equipo tiene menos de 1GB de RAM física se recomienda
que la partición SWAP debe de duplicar la cantidad real de
memoria RAM, así que si tenemos 768MB de memoria física, la
SWAP debe de ser 1536MB, en cambio si supera el 1GB de
memoria física, la SWAP es igual a esta, mas 2GB, por ejemplo
tenemos 3GB de memoria física, la swap se recomienda de 5GB.

La Swap tiene como desventaja que al estar en el disco duro, hace que
sea demasiado lento las consultas de este, por tal motivo, si se tiene un
disco duro con RPM menores a 7200 se recomienda tener la SWAP en un
dispositivo externo u otro disco, pero el sistema solo pasara aquellos
procesos que estén “Estáticos” o los que demoren mas tiempo en
memoria, los procesos temporales siguen en la memoria RAM.

En algunos ambientes es importante tener una memoria SWAP asignada,


como:

• Servidores o estaciones donde ya no se pueda aumentar la


memoria física.
• Estaciones de Diseño Gráfico o similares, ya que en ocasiones
estas estaciones aunque tengan buena memoria RAM, no le es
suficiente.
• Servidores de Producción intensa esporádica.

Asi que, como vimos durante la instalación, nosotros no configuramos


una SWAP, pero la desventaja de tener la swap directamente sobre una
partición en el disco es contraproducente, ya que la swap estará limitada
al tamaño de la partición y no podrá aumentarse o disminuirse sin llegar

164 www.sugeek.co
a afectar el sistema de algún modo. En servidores de producción se
recomienda tener un disco aparte para la swap o en el común de los
casos tenerla en un archivo para poderla manipular a nuestro gusto
cuando el sistema así lo requiera -aumentar o disminuir el tamaño-.

Verificamos que no tenemos swap en nuestro sistema.


root@sugeek:~# free -m
total used free shared buffers cached
Mem: 7888 7015 873 0 605 3386
-/+ buffers/cache:3023 4864
Swap: 0 0 0

Procederemos a crear el archivo que realizará la labor de swap,


recordemos que podemos crearlo en una USB 3.0.

root@sugeek:~# dd if=/dev/zero of=/swap bs=1024 count=1048576


1048576+0 registros leídos
1048576+0 registros escritos
1073741824 bytes (1,1 GB) copiados, 4,72171 s, 227 MB/s

Desglosamos el anterior comando:

• dd → Sirve para crear y convertir ficheros


• if → Indicamos la entrada de datos, el cual van a ser ceros
(/dev/zero)
• of → Indicamos la salida, si el archivo no existe se crea.
• bs → Indicamos el tamaño del bloque de 1024 bytes
• count → Marca hasta donde se deben de crear bloques, es el
valor del bs multiplicado por la cantidad de MB que le vamos a
asociar a la SWAP, en esta ocasión le asociamos 1GB a la SWAP.

Ahora vamos a crear la SWAP.


root@sugeek:~# mkswap /swap
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=387c7671-ada8-428d-8112-98aff59c8ba6

Activamos la swap

root@sugeek:~# swapon /swap


root@sugeek:~# free -m | grep swap
Swap: 1023 0 1023

Como observamos ya tenemos una swap asociada al sistema, pero esta


desaparecerá cada vez que reiniciemos el servidor, por tal motivo
debemos de dejarla permanente, esto lo hacemos en el archivo fstab.

Administración de Servidores GNU/Linux 165


Echo “/swap swap swap defaults 0 0 ” >> /etc/fstab

Ya de ese modo la swap estaría montada en nuestro sistema y dispuesta


a ser usada, pero el sistema la usa demasiado, asi que vamos a
disminuir el uso de esta y solo en casos que en realidad se requiera,
aumentando asi el rendimiento del sistema.

Para ello escribimos:

echo 10 > /proc/sys/vm/swappiness


echo “vm.swappiness = 10 ” >> /etc/sysctl.conf

Ya con lo anterior tenemos optimizado el uso de nuestra swap.

Verificar el estado del disco con fsck


El comando fsck permite comprobar y arreglar un sistema de archivos.

Antes de verificar un sistema de archivos, el dispositivo no debería de


estar montado, o como mucho, montado en modo solo lectura.

Similar que mkfs, fsck invoca un comando teniendo en cuenta el sistema


de archivos para comprobar, como fsck.ext2 fsck.ext3 fsck.ext4, etc.

Cuando un sistema de archivos se encuentra defectuoso, fsck intentara


corregir los sectores que pueda y pregunta al usuario que hacer -aunque
se puede omitir con la opción y para aceptar a todo de forma
automática-, y aquellos que no, los pasara a la carpeta lost+founds de
dicho sistema de archivos u dispositivo.

El siguiente comando indica las opciones -v (verbose) y -f (force) para


corroborar el estado del dispositivo.

root@sugeek:~# fsck -fV /dev/sdb1


fsck de util-linux 2.20.1
[/sbin/fsck.ext4 (1) -- /dev/sdb1] fsck.ext4 -f /dev/sdb1
e2fsck 1.42 (29-Nov-2011)
Paso 1: Verificando nodos-i, bloques y tamaños
Paso 2: Verificando la estructura de directorios
Paso 3: Revisando la conectividad de directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
/dev/sdb1: 11/991616 files (0.0% non-contiguous), 104694/3965948
blocks

166 www.sugeek.co
Las Cuotas de Disco
Las cuotas permiten poner límites al uso del espacio en los sistemas de
archivos, estos límites pueden ser de 2 tipos:

• inodos: Limita el número máximo de archivos


• bloques: Limita el número de bloques

Se Implementan las cuotas por sistemas de archivos individual -por


dispositivo-, y no para un conjunto de sistema de archivos. Se puede
gestionar cada usuario o grupo de manera completamente
independiente.

En las cuotas, se puede fijar unos límites, estos límites son:

• Límite Duro: Es la cantidad máxima de inodos o bloques


utilizados que el usuario o grupo no podrá superar en ningún
caso.
• Límite Suave: Cantidad máxima de inodos o bloques que el
usuario o grupo puede superar de manera temporal. En este
caso, el usuario o grupo podrá superar el limite establecido hasta
cierto punto determinado por el periodo de gracia.
• Límite de Gracia: Durante un cierto periodo, se le permite al
usuario trabajar por encima de su cuota, un tiempo prudente
para que este borre o mueva información que no utilice.

Las cuotas se establecen a nivel de núcleo y de sistemas de archivos.


Para poder utilizarlas, se deben instalar las respectivas herramientas.

aptitude install quota quota tool

Habilitar las Cuotas


Antes que nada, para poder usar las “quotas” debemos de alistar el
dispositivo que va a tener estas características, para ello ingresamos al
archivo /etc/fstab y modificamos las opciones del dispositivo.

/dev/sdb2 /Compartida ext3 defaults,usrquota,grpquota 0 2

Como observa, se agregaron las opciones userquota (Usuarios) y


grpguota (Grupos). Después de modificar el dispositivo y si no lo
tenemos ocupado procederemos a remontar el dispositivo con mount -o
remount /Compartida.

Administración de Servidores GNU/Linux 167


Luego de haber establecido las características del dispositivo, se
procede a crear los archivos de configuración en la raíz del dispositivo
que se le habilitó las cuotas.

root@sugeek:/# quotacheck -acug /home/Compartida

La opción -a significa que todos los sistemas de archivos no NFS


montados en /etc/mtab son verificados para saber si las cuotas están
activadas. La opción -c específica que los archivos de cuota deberían ser
creados para cada sistema de archivos con cuotas activadas, la opción
-u específica que se debe verificar por cuotas de usuario, y la opción -g
indica, verificar por cuotas de grupo.

Si no se específica ninguna de las opciones -u ni -g, sólo se creará el


archivo de cuota de usuario. Si únicamente se específica la opción -g,
sólo se creará el archivo de cuota de grupo.

Luego que se crean los archivos se procede a generar la tabla de uso

root@sugeek:/# quotacheck -avug && quotaon /Compartida

Con el comando quotacheck -avug es muy probable que la primera vez


genere advertencias de archivos que se escribirán, ignoramos dicha
advertencia, además si se presentan problemas con la cuotas se ejecuta
dicho comando.

La opción -a Verifica todos los sistemas de archivos montados


localmente con cuotas activadas, -v Muestra detalles informativos a
medida que la verificación de cuotas se ejecuta (verbose), -u verifica la
información de cuota de disco y -g verifica la información de cuota de
disco del grupo.

El comando quotaon activa las cuotas en el disco. El quotaoff desactiva


la cuota

Habilitar las Cuotas a Usuarios


Para habilitar un usuario a usar las cuotas en un disco, solo basta con
indicar el comando edquota usuario.

¡IMPORTANTE!
Abre con el editor de texto predeterminado y los bloques de las cuotas

168 www.sugeek.co
son de 1KB.
Los valores de Blocks e inodes no se deben modificar, ya que es un valor
dinámico.

Disk quotas for user sugeek (uid 502):


Filesystem blocks soft hard inodes soft hard
/dev/sbd2 440436 0 0 37418 0 0

La primera columna es el nombre del sistema de archivos que tiene una


cuota activada, la segunda columna muestra cuántos bloques está
usando el usuario actualmente. Las próximas dos columnas son usadas
para colocar límites de bloques duros y suaves para el usuario del
sistema de archivos. La columna inodes muestra cuántos inodes está
usando el usuario actualmente. Las últimas dos columnas son usadas
para colocar los límites duros y suaves para los inodes del usuario en el
sistema de archivos.

Si cualquiera de los valores está especificado a 0, ese límite no está


configurado.

Para verificar que una cuota ha sido aplicada se usa el comando quota
usuario, y si se desea que un usuario tenga las misma cuota que otro se
ejecuta edquota -p sugeek user.

Habilitar las Cuotas a Grupos


Lo mismo que en usuarios pero indicando la opción -g al comando
edquota

root@sugeek:/# edquota -g tecnicos

Lo anterior mostrara en el editor de texto la cuota para dicho grupo.

Disk quotas for group tecnicos (gid 502):


Filesystem blocks soft hard inodes soft hard /dev/sdb2
440400 0 0 37418 0 0

Para verificar que dicha cuota si se aplicó al grupo se ejecuta el


comando quota -g tecnicos

Las cuotas pueden ser verificadas y generar un informe con repquota y


el comando warnquota permite ser programado en una tarea
programada para alertar a los usuarios que están a punto de superar o
llegar al limite de su cuota.

Administración de Servidores GNU/Linux 169


El comando edquota -t permite asignar cuotas a los usuarios o grupos
basándose en los sistema de archivos.

Unidades RAID (Arreglo de Discos)


Antes de iniciar con el tema de las unidades RAID debemos de conocer
como funciona, por esto se recomienda ver la Wikipedia
(http://es.wikipedia.org/wiki/RAID).

Nota: Utilizar esta herramienta si y sólo si nuestro servidor no tiene


controladora RAID y no se puede crear RAID por Hardware.

El RAID por Sistema Operativo es también conocido como RAID por


Software, y solo se puede crear RAID en unidades -particiones, Discos
Duros, etc- donde NO este la partición /boot o que contenga los archivos
de arranque.

Preparar los Discos Duros


Para poder trabajar con RAID por Software, es necesario alistar nuestros
discos duros con el comando fdisk y cambiar el tipo de partición a fd
(Linux Raid Auto)

Creando RAID con mdadm


Antes de iniciar con el RAID por Software, debemos de tener en cuenta
las variables sobre el uso del servidor, así que no es lo mismo tener un
servidor de custodia de información, como un servidor vivo de carpetas
compartidas o base de datos. En esta ocasión vamos a preparar un RAID
para base de datos, así que nuestra configuración va a ser un RAID 1+0
o RAID10 -mínimo 4 Discos del mismo tamaño, preferiblemente de la
misma marca, firmware y versión-.

El comando mdadm -se instala con aptitude install mdadm- es una


herramienta del kernel de Linux que permitirá crear el RAID por
software.

MDADM permite también configurar los siguientes arreglos No-RAID:

• LINEAR: Concatena unidades de almacenamiento en un sólo


dispositivo md.
• MULTIPATH: permite múltiples rutas con falla en un sólo

170 www.sugeek.co
dispositivo.
• FAULTY: Un dispositivo que emula varios escenarios de falla de
disco. Sólo se utiliza para pruebas y desarrollo.
• CONTAINER: Grupo de dispositivos que son gestionados como un
único dispositivo sobre el cual se pueden crear dispositivos RAID.

Creamos el RAID 10

root@sugeek:/# mdadm --create /dev/md126 --level=10 --raid-devices=4


/dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

Como observamos, tenemos algunas de las opciones básicas para


creación de RAID.

• --create → Indicamos que vamos a crear el RAID md0 (Puede


suceder que cambie a md126)
• --level → Indicamos el nivel de RAID que vamos a crear,
• --raid-devices → Cantidad de discos que harán parte del arreglo

Se puede verificar el estado del proceso de creación con el comando


mdadm --detail /dev/md126 o directamente verificando el archivo con
cat /proc/mdstat.

Mientras se va construyendo el arreglo, observe que el valor de State es


active, resyncing. El valor de Resync Status informará el porcentaje de
progreso de la operación. El proceso puede demorar desde unos pocos
minutos hasta varias horas dependiendo el tamaño de las unidades de
almacenamiento utilizadas.

root@sugeek:/home/soporte# mdadm --detail /dev/md126


/dev/md126:
Version : 1.2
Creation Time : Mon Jun 30 17:14:01 2014
Raid Level : raid10
Array Size : 16765952 (15.99 GiB 17.17 GB)
Used Dev Size : 8382976 (7.99 GiB 8.58 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent

Update Time : Mon Jun 30 17:14:28 2014


State : active, resyncing
Active Devices : 4
Working Devices : 4
Failed Devices : 0

Administración de Servidores GNU/Linux 171


Spare Devices : 0

Layout : near=2
Chunk Size : 512K

Resync Status : 31% complete

Name : debian:126 (local to host debian)


UUID : 23af9bba:c16e16ed:f7dc9809:a36f4c13
Events : 6

Number Major Minor RaidDevice State


0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
2 8 65 2 active sync /dev/sde1
3 8 49 3 active sync /dev/sdd1

root@sugeek:/home/soporte# cat /proc/mdstat


Personalities : [raid10]
md126 : active raid10 sdd1[3] sde1[2] sdc1[1] sdb1[0]
16765952 blocks super 1.2 512K chunks 2 near-copies [4/4]
[UUUU]
[=================>...] resync = 87.0% (14595584/16765952)
finish=0.1min speed=199853K/sec

unused devices: <none>

• Agregar un dispositivo al RAID:


mdadm --add /dev/md126 /dev/sdf1

• Quitar un dispositivo del arreglo:


mdadm /dev/md126 --remove /dev/sdf1

• Simular falla del RAID


mdadm /dev/md127 -f /dev/sdb1

• Activar un RAID después de haberlo detenido con stop


mdadm -AsR /dev/md127

Lo ideal seria tener otro disco para funcionar como hotspare o disco de
respaldo por si uno de los del arreglo falla. Para ello, seria ejecutar el
comando que mencionamos anteriormente “agregar un disco nuevo al
arreglo” y al ejecutar el mdadm --detail /dev/md126 observaremos que
al final tenemos la línea:

4 8 81 - spare /dev/sdf1

172 www.sugeek.co
root@debian:/home/soporte# mdadm --add /dev/md126 /dev/sdf1
mdadm: added /dev/sdf1
root@debian:/home/soporte# mdadm --detail /dev/md126
/dev/md126:
Version : 1.2
Creation Time : Mon Jun 30 17:14:01 2014
Raid Level : raid10
Array Size : 16765952 (15.99 GiB 17.17 GB)
Used Dev Size : 8382976 (7.99 GiB 8.58 GB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent

Update Time : Mon Jun 30 17:32:37 2014


State : clean
Active Devices : 4
Working Devices : 5
Failed Devices : 0
Spare Devices : 1

Layout : near=2
Chunk Size : 512K

Name : debian:126 (local to host debian)


UUID : 23af9bba:c16e16ed:f7dc9809:a36f4c13
Events : 20

Number Major Minor RaidDevice State


0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
2 8 65 2 active sync /dev/sde1
3 8 49 3 active sync /dev/sdd1
4 8 81 - spare /dev/sdf1

Ya solo queda guardar la configuración con:

root@sugeek:/# mdadm --detail --scan >> /etc/mdadm/mdadm.conf

Nuestro RAID queda listo para crear la partición con fdisk, luego formato
con mkfs.ext4 y montarlo en /etc/fstab.

Eliminar un RAID del sistema


• Se desmonta la unidad RAID del sistema, umount /dev/md126p1
recordemos que dicho dispositivo no debe de estar siendo
utilizado, en caso contrario usamos lsof para ubicar los archivos

Administración de Servidores GNU/Linux 173


abiertos.
• Eliminamos la línea que hace referencia al RAID en el /etc/fstab
• Paramos el RAID con mdadm –-stop /dev/md126
• Editamos el archivo /etc/mdadm/mdadm.conf y eliminamos la
línea que haga referencia al RAID.
• Escaneamos el RAID para validar que se borro adecuadamente
con mdadm --detail --scan
• Escribimos el/los disco(s) para poderlo(s) utilizar nuevamente
mdadm --misc --zero-superblock /dev/sda

Unidades LVM (Logical Volume Manager)


LVM es un sistema de gestión de volúmenes lógicos, el cual como
función principal es poder aumentar o disminuir la capacidad de una
unidad lógica y así poder dar espacios fijos a ciertos grupos, usuarios, o
carpetas.

Se recomienda que LVM cuente con un sistema RAID10 para funcionar


con un alto desempeño y con sistema de cuotas para una correcta
administración y gestión del sistema de archivos.

Las configuraciones de LVM se encuentran repartidas por los archivos y


directorios de /etc/lvm. El archivo /etc/lvm/lvm.conf contiene la
configuración global. La configuración de los diferentes volúmenes
-físicos, grupos y lógicos- no se encuentra en un archivo, sino en una
estructura presente en el interior de los propios periféricos, en sus
primeros bloques.

Antes de iniciar con la creación y administración de VL se recomienda


visitar: http://es.wikipedia.org/wiki/Logical_Volume_Manager

Volúmenes Físicos (Physical Volumen)


Para crear un PV solo es necesario un Disco Duro completo, una
partición o un dispositivo RAID.

Para poder preparar un dispositivo y soportar LVM, debemos de


seleccionar el tipo de partición “Linux LVM” (8e) con el comando fdisk.
Luego que se tengan los dispositivos listos para ser usados con LVM
-mínimo 2-, se procederá a crear el Physical Volumen con el comando
pvcreate.

root@sugeek:/home/soporte# pvcreate /dev/md126p1 /dev/sdg1

174 www.sugeek.co
Writing physical volume data to disk "/dev/md126p1"
Physical volume "/dev/md126p1" successfully created
Writing physical volume data to disk "/dev/sdg1"
Physical volume "/dev/sdg1" successfully created

Como se puede observar, utilizamos un dispositivo RAID (/dev/md126) y


un dispositivo normal (/dev/sdg). Para poder observar los volúmenes
físicos utilizamos el comando pvdisplay -v

root@sugeek:/home/soporte# pvdisplay -v

"/dev/md126p1" is a new physical volume of "15,99 GiB"


--- NEW Physical volume ---
PV Name /dev/md126p1
VG Name
PV Size 15,99 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID wTxgJN-nU5h-vmoP-Kjig-GMDi-Ay1g-wAdx2i

"/dev/sdg1" is a new physical volume of "8,00 GiB"


--- NEW Physical volume ---
PV Name /dev/sdg1
VG Name
PV Size 8,00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 6W8t6v-Lbmx-SlBk-KkX7-6bU1-N27A-yPaLrE

Si deseamos quitar un dispositivo del LVM, solo utilizamos el comando


pvremove /dev/dispositivo.

root@sugeek:/home/soporte# pvremove /dev/sdg1


Labels on physical volume "/dev/sdg1" successfully wiped

Grupo Volúmenes (Volumen Group)


Es la parte superior del LVM. Es la "caja" en la que tenemos nuestros
volúmenes lógicos (LV) y nuestros volúmenes físicos (PV). Se puede ver
como una unidad administrativa en la que se engloban nuestros
recursos. Hay que aclarar que mientras un PV no se añada al VG, no

Administración de Servidores GNU/Linux 175


podemos comenzar a usarlo.

Para crear un grupo de volúmenes, debe de disponer de al menos un


volumen físico. Puede crear un grupo de volúmenes con el comando
vgcreate. Un grupo de volúmenes llevará el nombre que se desee.

root@sugeek:/home/soporte# vgcreate vg01 /dev/sdg1


Volume group "vg01" successfully created

El ejemplo anterior, le estamos dando como nombre al grupo de vg01 y


asociando el pv que ya habíamos creado.

Para visualizar las propiedades de un vg lo realizamos con el comando


vgdisplay, podemos usar la opción v para que nos de información mas
detallada.

root@sugeek:/home/soporte# vgdisplay -v vg01


Using volume group(s) on command line
Finding volume group "vg01"
--- Volume group ---
VG Name vg01
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 8,00 GiB
PE Size 4,00 MiB
Total PE 2047
Alloc PE / Size 0 / 0
Free PE / Size 2047 / 8,00 GiB
VG UUID K79hjk-dmOc-DvVF-ounS-XbAx-7jv0-e3OrAA

--- Physical volumes ---


PV Name /dev/sdg1
PV UUID HdJgWX-K1ZY-Ec30-OTLB-aNkz-YEhy-ARhFey
PV Status allocatable
Total PE / Free PE 2047 / 2047

En la líneas MAX LV, y MAX PV, las cuales indican el número máximo de

176 www.sugeek.co
volúmenes lógicos que podemos crear en este grupo de volúmenes,
siendo 0 el valor que indica infinito y el número máximo de pv que
pueden ser asociados a dicho vg respectivamente.

La línea de PE Size, Total PE y Free PE indican el tamaño de las


extensiones físicas, de un total de 2047 extensiones físicas de las cuales
se tienen libre 2047 extensiones físicas respectivamente.

Además de dicha información, muestra los pv que se encuentran


asociados a dicho vg.

Observe con el comando pvdisplay /dev/sdg1 y notara que muestra


información con respecto al vg que hace parte.

Para quitar un vg de nuestro sistema solo basta con ejecutar el comando


vgremove dispositivo

Volúmenes Lógicos (Logical Volumen)


Después de tener los dispositivos físicos listos dentro de un VG, es hora
de crear el dispositivo lógico para poder darle formato y montarlo como
cualquier dispositivo tipo bloques. El LV se podrá crear dependiendo de
la cantidad de PE libres que tenga el VG.

Se crea un LV con el comando lvcreate. Un LV lleva un nombre, dispone


de un tamaño expresado en extensiones lógicas (LE) que corresponden
en realidad a los PE dentro del VG.

root@sugeek:/home/soporte# lvcreate -n Datos1 -L 8g vg01


Logical volume “Datos1” created

El anterior comando crea un LV usando como nombre “Datos1” con la


opción n, el tamaño con la opción L de 8 Gigabytes -podemos definir
megabytes con m, terabytes con t, petabytes con p o exabytes con e- y
va a pertenecer al Volumen Group vg01.

El sistema creara el dispositivo dentro de /dev/vg01/Datos1, a lo cual,


como se observa, el dispositivo se crea dentro de una carpeta que
contiene el nombre del VG. Este a su ves es un enlace simbólico
apuntando a /dev/mapper/vg01-Datos1.

Para ver las características del LV creado, se ejecuta el comando


lvdisplay, podemos usar las opciones -v (verbose) y -m (maps) para

Administración de Servidores GNU/Linux 177


obtener información mas detallada sobre los bloques de PE y LE
utilizados por el LV.

root@sugeek:~# lvdisplay -vm /dev/vg01/Datos1


Using logical volume(s) on command line
--- Logical volume ---
LV Path /dev/vg01/Datos1
LV Name Datos1
VG Name vg01
LV UUID EuDz0x-N41X-jCWz-sWA0-DarY-85Xw-UUu2Dm
LV Write Access read/write
LV Creation host, time debian, 2014-07-14 22:27:57 -0500
LV Status available
# open 0
LV Size 8,00 GiB
Current LE 2047
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:3

--- Segments ---


Logical extent 0 to 2046:
Type línear
Physical volume /dev/sdg1
Physical extents 0 to 2046

Luego para poder utilizar este LV, solo nos queda darle el formato
adecuado, montarlo y darle el uso que deseemos.

root@sugeek:/home# mkfs.ext4 /dev/vg01/Datos1 ; mount


/dev/vg01/Datos1 /home/LVM/

Observemos que ya tenemos listo nuestro “Disco Duro”, si lo queremos


permanente recordemos usar su UUID y colocarlo en el archivo fstab.

root@sugeek:/home# df -h
S.ficheros Tamaño Usados Disp Uso% Montado en
rootfs 5,0G 1,9G 2,9G 40% /
udev 10M 0 10M 0% /dev
tmpfs 101M 332K 100M 1% /run
/dev/mapper/System-etc 5,0G 1,9G 2,9G 40% /
tmpfs 5,0M 0 5,0M 0% /run/lock
tmpfs 201M 0 201M 0% /run/shm
/dev/sda1 184M 23M 152M 14% /boot
/dev/mapper/System-home 5,0G 139M 4,6G 3% /home
/dev/mapper/System-var 9,2G 343M 8,4G 4% /var

178 www.sugeek.co
/dev/mapper/vg01-Datos1 7,9G 146M 7,4G 2% /home/LVM

Ampliar y Reducir un VG
Si tenemos un nuevo disco duro, y lo queremos agregar a un sistema
LVM debemos de prepararlo y luego agregarlo a un VG para usarlo en un
LV.

Como vimos con el comando vgdisplay -v vg01 Solo tenemos asociado


un dispositivo, y con el comando pvdisplay observamos que tenemos
disponible el dispositivo RAID /dev/md126p1 para ser usado en cualquier
VG.

Para ampliar un VG, utilizamos el comando vgextend que funciona de la


misma manera que vgcreate, indicando el VG al cual se le desea añadir
el PV.

root@sugeek:/home/soporte# vgextend vg01 /dev/md126p1


Volume group "vg01" successfully extended
root@sugeek:/home/soporte# vgdisplay -v vg01
Using volume group(s) on command line
Finding volume group "vg01"
--- Volume group ---
VG Name vg01
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 23,98 GiB
PE Size 4,00 MiB
Total PE 6139
Alloc PE / Size 2047 / 8,00 GiB
Free PE / Size 4092 / 15,98 GiB
VG UUID K79hjk-dmOc-DvVF-ounS-XbAx-7jv0-e3OrAA

--- Logical volume ---


LV Path /dev/vg01/Datos1
LV Name Datos1
VG Name vg01

Administración de Servidores GNU/Linux 179


LV UUID EuDz0x-N41X-jCWz-sWA0-DarY-85Xw-UUu2Dm
LV Write Access read/write
LV Creation host, time debian, 2014-07-14 22:27:57 -0500
LV Status available
# open 1
LV Size 8,00 GiB
Current LE 2047
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:1
--- Physical volumes ---
PV Name /dev/sdg1
PV UUID HdJgWX-K1ZY-Ec30-OTLB-aNkz-YEhy-ARhFey
PV Status allocatable
Total PE / Free PE 2047 / 0
PV Name /dev/md126p1
PV UUID QHZC0o-VUuC-jlwG-QOUl-Wb6B-VC7t-HXc3TL
PV Status allocatable
Total PE / Free PE 4092 / 4092

Como se observa el VG Size paso de 8GB a 23,98GB y además los


valores del PE también aumentaron, el único que se mantiene es el Alloc
PE, el cual posee el tamaño del actual LV llamado Datos1, y si vemos los
PV asociados al VG, encontramos el PV /dev/md126p1.

Para reducir un VG utilizamos el comando vgreduce, al cual se le indica


el PV que se desea retirar, pero antes de ello, el PV debe de estar libre,
no debe estar montado o siendo utilizado por algún LV y observaremos
como los valores del PE dentro del VG cambian asi como sus PV
asociados.

root@sugeek:/home/soporte# vgreduce vg01 /dev/md126p1 && vgdisplay


-v vg01
Removed "/dev/md126p1" from volume group "vg01"
Using volume group(s) on command line
Finding volume group "vg01"
--- Volume group ---
VG Name vg01
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1

180 www.sugeek.co
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size 8,00 GiB
PE Size 4,00 MiB
Total PE 2047
Alloc PE / Size 2047 / 8,00 GiB
Free PE / Size 0 / 0
VG UUID K79hjk-dmOc-DvVF-ounS-XbAx-7jv0-e3OrAA

--- Logical volume ---


LV Path /dev/vg01/Datos1
LV Name Datos1
VG Name vg01
LV UUID EuDz0x-N41X-jCWz-sWA0-DarY-85Xw-UUu2Dm
LV Write Access read/write
LV Creation host, time debian, 2014-07-14 22:27:57 -0500
LV Status available
# open 1
LV Size 8,00 GiB
Current LE 2047
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:1

--- Physical volumes ---


PV Name /dev/sdg1
PV UUID HdJgWX-K1ZY-Ec30-OTLB-aNkz-YEhy-ARhFey
PV Status allocatable
Total PE / Free PE 2047 / 0

Ampliar y Reducir un LV
Como ya tenemos un nuevo PV dentro del VG el cual hace parte el LV,
solo queda asociarle el PV nuevo al LV, para ello utilizamos el comando
lvextend el cual permite los parámetros -l (Número de extensiones
lógicas LE) o -L como para lvcreate. Luego precisamos el nuevo tamaño
del LV o, si añadimos el prefijo +, el tamaño adicional que deseamos.

También se puede precisar, como último argumento, el nombre del PV


para forzar la extensión del LV, esto último solo sera posible si el PV
tiene suficiente PE disponibles.

Administración de Servidores GNU/Linux 181


A continuación vamos a agregar 12GB al LV Datos1.

root@sugeek:/home/soporte# lvextend -L +12g /dev/vg01/Datos1


Extending logical volume Datos1 to 20,00 GiB
Logical volume Datos1 successfully resized

Ahora observamos como están distribuidos los PE dentro del LV.

root@sugeek:/home/soporte# lvdisplay -vm /dev/vg01/Datos1


Using logical volume(s) on command line
--- Logical volume ---
LV Path /dev/vg01/Datos1
LV Name Datos1
VG Name vg01
LV UUID EuDz0x-N41X-jCWz-sWA0-DarY-85Xw-UUu2Dm
LV Write Access read/write
LV Creation host, time debian, 2014-07-14 22:27:57 -0500
LV Status available
# open 1
LV Size 20,00 GiB
Current LE 5119
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:1

--- Segments ---


Logical extent 0 to 2046:
Type línear
Physical volume /dev/sdg1
Physical extents 0 to 2046

Logical extent 2047 to 5118:


Type línear
Physical volume /dev/md126p1
Physical extents 0 to 3071

Con el comando vgdisplay notamos como el Free PE se ha reducido y el


AllocPE a aumentado.

root@sugeek:/home/soporte# vgdisplay vg01


--- Volume group ---
VG Name vg01
System ID
Format lvm2

182 www.sugeek.co
Metadata Areas 2
Metadata Sequence No 6
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 23,98 GiB
PE Size 4,00 MiB
Total PE 6139
Alloc PE / Size 5119 / 20,00 GiB
Free PE / Size 1020 / 3,98 GiB
VG UUID K79hjk-dmOc-DvVF-ounS-XbAx-7jv0-e3OrAA

Ahora lo que queda es asociar dicho incremento a nuestra “Partición” ya


que aun no se a agregado dicho aumento.

root@sugeek:/home/soporte# df -h /home/LVM
S.ficheros Tamaño Usados Disp Uso% Montado en
/dev/mapper/vg01-Datos1 7,9G 146M 7,4G 2% /home/LVM

Para ello utilizamos el comando resize2fs el cual permite reducir y


aumentar un sistema de archivos. El primer argumento es el sistema de
archivos, el segundo se indica el tamaño con un sufijo como lo podría ser
K (KB), M (MB), G (GB). Sin el sufijo, se indica el número de bloques del
sistema de archivos. Si no se define un tamaño, este de forma
automática tomara el tamaño total que este asociado al LV.

Se debe de tener en cuenta que para ampliar un LV se podrá realizar en


caliente, lo que quiere decir que no necesitamos desmontar el LV, en
cambio cuando se requiere reducir el LV es necesario desmontarlo.

root@sugeek:/home/soporte# df -h /home/LVM
S.ficheros Tamaño Usados Disp Uso% Montado en
/dev/mapper/vg01-Datos1 7,9G 146M 7,4G 2% /home/LVM

root@debian:/home/soporte# resize2fs /dev/vg01/Datos1


resize2fs 1.42.5 (29-Jul-2012)
Filesystem at /dev/vg01/Datos1 is mounted on /home/LVM; on-line
resizing required
old_desc_blocks = 1, new_desc_blocks = 2
Performing an on-line resize of /dev/vg01/Datos1 to 5241856 (4k)
blocks.
The filesystem on /dev/vg01/Datos1 is now 5241856 blocks long.

Administración de Servidores GNU/Linux 183


root@sugeek:/home/soporte# df -h /home/LVM
S.ficheros Tamaño Usados Disp Uso% Montado en
/dev/mapper/vg01-Datos1 20G 150M 19G 1% /home/LVM

Como hemos notado el LV paso de 8GB a 20GB, con las 12GB que le
hemos agregado. Nunca debemos de reducir por debajo del espacio real
utilizado por los datos contenidos en el LV.

Ahora queda reducir nuestro LV, vamos reducirlo a 10GB, para ello se
recomienda seguir los siguientes pasos.

• Desmontar el sistema de Archivos a reducir


• Comprobar el sistemas de archivos del LV que vamos a reducir
con fsck
• Reducir del LV lógico con resize2fs
• Reducir el LV con el comando lvreduce

root@sugeek:/home/soporte# umount /home/LVM/ && fsck -f


/dev/vg01/Datos1
fsck de util-linux 2.20.1
e2fsck 1.42.5 (29-Jul-2012)
Paso 1: Verificando nodos-i, bloques y tamaños
Paso 2: Verificando la estructura de directorios
Paso 3: Revisando la conectividad de directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
/dev/mapper/vg01-Datos1: 11/1310720 files (0.0% non-contiguous),
120657/5241856 blocks

Ya lo hemos desmontado y comprobado, ahora sigue el turno de


resize2fs.

root@sugeek:/home/soporte# resize2fs /dev/vg01/Datos1 10G


resize2fs 1.42.5 (29-Jul-2012)
Resizing the filesystem on /dev/vg01/Datos1 to 2621440 (4k) blocks.
The filesystem on /dev/vg01/Datos1 is now 2621440 blocks long.

Y ahora a reducir el LV con lvreduce, debemos de tener cuidado, si


colocamos un valor diferente al cual va a quedar el LV, puede destruir
los datos, en este, no se puede definir el PV como con lvextend. A la
pregunta que arroja le respondemos que si (y), por último montamos
nuevamente el sistema de archivo y verificamos si efectivamente quedo
en 10GB.

root@sugeek:/# lvreduce -L 10G /dev/vg01/Datos1

184 www.sugeek.co
WARNING: Reducing active logical volume to 10,00 GiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce Datos1? [y/n]: y
Reducing logical volume Datos1 to 10,00 GiB
Logical volume Datos1 successfully resized
root@sugeek:/home/soporte# mount /dev/vg01/Datos1 /home/LVM/
root@sugeek:/home/soporte# df -h /home/LVM
S.ficheros Tamaño Usados Disp Uso% Montado en
/dev/mapper/vg01-Datos1 10G 146M 7,8G 2% /home/LVM

Mover el contenido de un PV a otro PV


En entornos empresariales -cuando no se tiene una infraestructura de
almacenamiento y crecimiento bien planteada- es común ver como se
hace necesario cambiar un disco duro por otro, cumpliendo la necesidad
de aumentar su tamaño. En estos casos se puede mover el contenido de
un PV a otro, incluso varios PE de un LV a otro PV, o también
determinados PE específicos.

Sin precisar nada como destino, LVM va a mover todos los PE del PV -Lo
mas común-, en los otros PV del VG. Debemos de tener en cuenta que
para mover el contenido de un PV hacia otro, el otro PV debe de
encontrarse en el mismo VG.

El comando pvmove permite mover los PE de un PV hacia otro. Se trata,


de desplazar el contenido del PV /dev/sdg1 hacia /dev/md126p1.

Nota: Para simular un contenido de 7GB dentro del LV hemos usado el


comando dd if=/dev/zero of=/home/LVM bs=1024 count=7000000

A continuación verificamos cuanto espacio libre tiene el PV


/dev/md126p1 (Free PE) y cuanto espacio ocupado tiene el PV /dev/sdg1
(Allocated PE), veremos que el PV /dev/sdg1 tiene todos llenos.

root@sugeek:/home/soporte# pvdisplay -m /dev/md126p1


--- Physical volume ---
PV Name /dev/md126p1
VG Name vg01
PV Size 15,99 GiB / not usable 4,00 MiB
Allocatable yes
PE Size 4,00 MiB
Total PE 4092
Free PE 4091
Allocated PE 1
PV UUID QHZC0o-VUuC-jlwG-QOUl-Wb6B-VC7t-HXc3TL

Administración de Servidores GNU/Linux 185


--- Physical Segments ---
Physical extent 0 to 0:
Logical volume /dev/vg01/Datos1
Logical extents 2047 to 2047
Physical extent 1 to 4091:
FREE

root@sugeek:/home/soporte# pvdisplay -m /dev/sdg1


--- Physical volume ---
PV Name /dev/sdg1
VG Name vg01
PV Size 8,00 GiB / not usable 3,00 MiB
Allocatable yes (but full)
PE Size 4,00 MiB
Total PE 2047
Free PE 0
Allocated PE 2047
PV UUID HdJgWX-K1ZY-Ec30-OTLB-aNkz-YEhy-ARhFey

--- Physical Segments ---


Physical extent 0 to 2046:
Logical volume /dev/vg01/Datos1
Logical extents 0 to 2046

Vemos que el PV /dev/md126p1 tiene suficiente espacio para soportar el


contenido del PV /dev/sdg1, procederemos a mover su contenido con el
comando pvmove.

root@sugeek:/home/soporte# pvmove -v /dev/sdg1 /dev/md126p1


Executing: /sbin/modprobe dm-mirror
Finding volume group "vg01"
Archiving volume group "vg01" metadata (seqno 8).
Creating logical volume pvmove0
Moving 2047 extents of logical volume vg01/Datos1
Found volume group "vg01"
activation/volume_list configuration setting not defined:
Checking only host tags for vg01/Datos1
Updating volume group metadata
Found volume group "vg01"
Found volume group "vg01"
Creating vg01-pvmove0
Loading vg01-pvmove0 table (254:4)
Loading vg01-Datos1 table (254:1)
Suspending vg01-Datos1 (254:1) with device flush
Suspending vg01-pvmove0 (254:4) with device flush
Found volume group "vg01"
activation/volume_list configuration setting not defined:
Checking only host tags for vg01/pvmove0
Resuming vg01-pvmove0 (254:4)

186 www.sugeek.co
Found volume group "vg01"
Loading vg01-pvmove0 table (254:4)
Suppressed vg01-pvmove0 identical table reload.
Resuming vg01-Datos1 (254:1)
Creating volume group backup "/etc/lvm/backup/vg01" (seqno 9).
Checking progress before waiting every 15 seconds
/dev/sdg1: Moved: 100,0%
Found volume group "vg01"
Found volume group "vg01"
Loading vg01-Datos1 table (254:1)
Loading vg01-pvmove0 table (254:4)
Suspending vg01-Datos1 (254:1) with device flush
Suspending vg01-pvmove0 (254:4) with device flush
Found volume group "vg01"
Resuming vg01-pvmove0 (254:4)
Found volume group "vg01"
Resuming vg01-Datos1 (254:1)
Found volume group "vg01"
Removing vg01-pvmove0 (254:4)
Removing temporary pvmove LV
Writing out final volume group after pvmove
Creating volume group backup "/etc/lvm/backup/vg01" (seqno 11).

Ahora comprobamos el VG y verificamos que el PV /dev/sdg1 ya tiene


todos sus PE Libres, en cambio el PV /dev/md126p1 se ha ocupado
(Allocated PE).

root@sugeek:/home/soporte# pvdisplay -m /dev/m126p1 && pvdisplay


-m /dev/sdg1
--- Physical volume ---
PV Name /dev/sdg1
VG Name vg01
PV Size 8,00 GiB / not usable 3,00 MiB
Allocatable yes
PE Size 4,00 MiB
Total PE 2047
Free PE 2047
Allocated PE 0
PV UUID HdJgWX-K1ZY-Ec30-OTLB-aNkz-YEhy-ARhFey

--- Physical volume ---


PV Name /dev/md126p1
VG Name vg01
PV Size 15,99 GiB / not usable 4,00 MiB
Allocatable yes
PE Size 4,00 MiB
Total PE 4092
Free PE 2044

Administración de Servidores GNU/Linux 187


Allocated PE 2048
PV UUID QHZC0o-VuuC-jlwG-QOUl-Wb6B-VC7t-HXc3TL

Ya el PV sdg1 podemos quitarlo del VG. Con la opción -a quitaremos los


PV que no están siendo usados.

root@sugeek:/home/soporte# vgreduce -a vg01


Removed "/dev/sdg1" from volume group "vg01"
Physical volume "/dev/md126p1" still in use

Ahora nos queda indicarle al LV el nuevo tamaño del PV, asignarlo


-indicando el total de PE Libres que son 2044- y comprobar que
efectivamente se aplicó con df.

root@sugeek:/home/soporte# lvextend -r -l +2044 /dev/vg01/Datos1 &&


df -h /home/LVM
Extending logical volume Datos1 to 15,98 GiB
Logical volume Datos1 successfully resized
resize2fs 1.42.5 (29-Jul-2012)
Filesystem at /dev/mapper/vg01-Datos1 is mounted on /home/LVM; on-
line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/mapper/vg01-Datos1 to 4190208
(4k) blocks.
The filesystem on /dev/mapper/vg01-Datos1 is now 4190208 blocks
long.
S.ficheros Tamaño Usados Disp Uso% Montado en
/dev/mapper/vg01-Datos1 16G 6,9G 8,2G 46% /home/LVM

Como vemos el tamaño del LV es el tamaño de mi PV, además utiliza el


mismo tamaño que usaba el antiguo de 6,9G y sus correspondientes
archivos.

Suprimir un VG
Para poder suprimir de forma adecuada un LVM de nuestro sistema, es
necesario seguir la siguiente estructura.

• Desmontar por completo los LV que tengamos


• Suprimir todos los LV con lvremove
• Retirar todos los los PV de los VG con lvreduce
• Destruir el VG con vgremove
• Suprimir el PV con pvremove

Siguiendo las instrucciones anteriores:

188 www.sugeek.co
root@sugeek:/home# umount /home/LVM && lvremove /dev/vg01/Datos1
Do you really want to remove active logical volume Datos1? [y/n]: y
Logical volume "Datos1" successfully removed

El siguiente comando quitara todos los PV posibles, recordemos que LVM


siempre deja un PV asociado a un VG, Por tal motivo aparecerá un error
que no se puede quitar 1 PV del VG, no nos preocupemos, esto es
normal.

root@sugeek:/home# vgreduce -a vg01


Can't remove physical volume "/dev/md126p1" from volume group "vg01"

Procederemos a quitar el VG y luego eliminaremos el PV.

root@sugeek:/home# vgremove vg01 && vgdisplay -v vg01


Volume group "vg01" successfully removed
Volume group "vg01" not found
root@sugeek:/home# pvremove /dev/md126p1 /dev/sdg1
Labels on physical volume "/dev/md126p1" successfully wiped
Labels on physical volume "/dev/sdg1" successfully wiped

Existen otros comandos que no vimos, dichos comandos son:

• pvchange → Modifica el estado de un PV, por ejemplo para


prohibir la asignación de extensiones físicas en este volumen.
• Pvresize → Vuelve a dimensionar un PV si su partición o disco de
origen ha sido ampliado o reducido, común con los RAID por
software.
• Pvscan → Busca todos los volúmenes presentes en todos los
soportes de almacenamiento del sistema.
• Vgchange → Modifica los atributos de un VG, para activarlo o
desactivarlo por ejemplo, pero también para modificar sus
valores máximos del PV y de PE, o para prohibir su ampliación o
reducción.
• Vgscan → Busca todos los grupos de volúmenes en todos los
soportes.
• vgrename → Renombra un VG
• vgmerge → Ensambla 2 VG en uno solo
• lvresize → Vuelve a dimensionar un LV, es equivalente a lvextend
y lvreduce
• lvchange → Modifica los atributos del LV
• lvrename → Renombra un LV

Administración de Servidores GNU/Linux 189


Crear un Snapshot
Un snapshot es una opción rápida y eficaz para realizar un respaldo
completo de un LV con los datos contenida en esta, y así poder
recuperar el sistema y datos ante cualquier eventualidad. En pocas
palabras, una snapshot es un LV que copia el contenido de otro LV,

La creación del snapshot es similar que crear un LV, y se recomienda


que la snapshot se cree al crear el LV y tengan el mismo tamaño
-aunque la Snapshot puede ser de tamaño menor o mayor-, ya que la
snapshot solo genera imágenes de los bloques que sean modificados.

¡IMPORTANTE!
Una snapshot puede ser de RW o RO, pero aun así es recomendable que
al usar una snapshot solo sea montada -la snapshot se puede montar
como cualquier otro disco- en RO para no afectar la información allí
contenida.

Una snapshot no es una herramienta de copia de seguridad como tal,


sino un medio que se utiliza en la estrategia de copias de seguridad.

Como se mencionó al principio, un snapshot es un LV, y para crear la


snapshot debemos ejecutar.

root@sugeek:/#lvcreate -L 6g -s -n S_Datos /dev/VG01/Datos


Logical volume “S_Datos” Created

El tamaño -L se ha definido en 6g ya que el tamaño del LV es


efectivamente de 6g, además se indica que es un snapshot con la opción
-s y el nombre -n de dicha snapshot es S_Datos.

Valide y compare la salida del comando lvdisplay -v con y sin snapshot,


donde se evidencia los cambios a medida que se van escribiendo datos
en el disco origen.

Cifrar Unidades de Almacenamiento


Hoy en día la seguridad de la información o SecInfo se ha hecho tan
importante sin importar el tipo de información que se maneje, por eso se
hace recomendable, especialmente en servidores de archivos, de
custodia o almacenamiento, que las particiones donde esta la
información sea cifrada. GNU/Linux tiene un módulo de cifrado llamado

190 www.sugeek.co
dm_crypt.

Para validar si nuestro kernel cuenta con dicho módulo instalado:

root@sueek:~#grep -i config_dm_crypt /boot/config-$(uname -r)


CONFIG_DM_CRYPT=m

Se observa que el dm_crypt esta instalado como módulo


(CONFIG_DM_CRYPT=m). Ahora solo queda cargarlo y validar que este
cargado.

root@sugeek:~# modprobe dm_crypt


root@sugeek:~# lsmod | grep dm_crypt
dm_crypt 23456 0

Después que se ha validado y cargado el módulo, queda instalar el


paquete que hace posible el trabajo (cryptsetup)

root@sugeek:~# apt-get install cryptsetup

Después de haberlo instalado procederemos a establecer la partición


que va a contener los datos y que se va a compartir, para este caso
seria /dev/sdb1

¡IMPORTANTE!
Podemos cifrar particiones RAID y LVM pero cuando ya están listas para
ser formateadas, en pocas palabras, antes de darle formato a la
partición debemos de cifrarla.

root@sugeek:~# cryptsetup -y luksFormat /dev/sdb1

WARNING!
========
Sobrescribirá los datos en /dev/sdb1 de forma irrevocable.

Are you sure? (Type uppercase yes): YES


Introduzca frase contraseña:
Verify passphrase:
root@sugeek:~#

Como hemos visto, cifrar la partición fue relativamente sencillo, a


continuación debemos abrir la partición cifrada y luego darle formato -la
partición queda guardada en /dev/mapper/Nombre-.

root@root:~# cryptsetup luksOpen /dev/sdb1 ParticionCifrada

Administración de Servidores GNU/Linux 191


Introduzca una contraseña para /dev/sdb1:
root@root:~# ls -l /dev/mapper/
total 0
crw------- 1 root root 10, 236 jul 31 16:40 control
lrwxrwxrwx 1 root root 7 ago 1 08:35 ParticionCifrada ->
../dm-0
root@root:~# mkfs.ext4 /dev/mapper/ParticionCifrada
mke2fs 1.42.9 (4-Feb-2014)
...
Escribiendo superbloques y la información contable del sistema de
ficheros: hecho

Ya después de haberla formateado, solo queda montarla.

Algunos de los comandos que encontramos son:

• cryptsetup luksOpen /dev/sdb1 Nombre → Abrir la partición


cifrada y darle un nombre.
• crypsetup luksClose Nombre → Cierra la partición cifrada y evita
su uso.
• cryptsetup status Nombre → Muestra información sobre la
partición cifrada.

Si deseamos profundizar mas sobre este comando, recomendamos el


uso del man.

Comando smartctl
Este comando es muy útil si deseamos obtener información sobre los
discos, como por ejemplo la salud de estos y poder tomar medidas
preventivas antes de una posible falla que afecte el sistema.

El siguiente ejemplo arroja todos los datos posibles del disco /dev/sda, la
salida es extensa, por tal motivo se deja a criterio de cada quien el
análisis de la información que este arroja.

root@sugeek:~#smartctl -i --all /dev/sda

192 www.sugeek.co
ADMINISTRACIÓN DE RED
Al principio vimos algunos comandos para el diagnóstico de la red, como
netstat y ss, En esta ocasión vamos a profundizar sobre otros comandos
de red.

Nota: No se va configurar ninguna interfaz WiFi, un servidor con


conexión por WiFi?

Archivo /etc/network/interfaces
En este archivo encontramos la configuración de las interfaces de red
del sistema. Este archivo no funciona adecuadamente si estamos usando
GUI.

auto lo
iface lo inet loopback

#Direccionamiento Estatico
auto eth0
iface eth0 inet static
address DireccionIP
network DirecciondeRed
gateway Ipdelrouter
netmask mascaradered
broadcast direcciondebroadcast
up comando a ejecutar cuando la interfaz suba, como un route

#Direccionamiento Dinamico
auto eth1
iface eth1 inet dhcp

Además de lo anterior, el archivo puede contener información como los


servidores DNS, aunque se recomienda configurarlos en resolv.conf.

Si encuentra allow-hotplug en alguna interfaz, se recomienda cambiarlo


por auto, ya que el allow-hotplug evita que la interfaz suba si se ha
desconectado el cable de red.

Las diferentes líneas del archivo no se considera necesario explicarlas,


ya que se explican por si solas.

Administración de Servidores GNU/Linux 193


Archivo /etc/protocols
El archivo contiene la lista de los protocolos conocidos y soportados por
GNU/Linux.

Archivo /etc/resolv.conf
Encontramos los servidores DNS, se inicia la primera columna (Opciones)
con nameserver para indicar luego la IP del servidor DNS. Esta opción es
la principal.

#DNS de OpenDNS
nameserver 208.67.222.222
nameserver 208.67.220.220
domain sugeek.co
search sugeek.co
options timeout:5 attemps:1

Encontramos otras opciones, tales como:


• domain → Nombre del dominio local.
• Search → Nombre del servidor de Búsquedas.
• Options → Opciones varias.
◦ Timeout → Tiempo de espera (En segundos) de respuesta de
un servidor DNS.
◦ Attemps → Cantidad de veces que intenta el host en consultar
al mismo servidor DNS después de cumplirse el timeout.

Archivo /etc/hosts
Archivo encargado de asociar IP con nombres de host, el sistema
primero consulta este archivo y luego el archivo resolv.conf -según
configuración del archivo nsswitch-.

127.0.0.1 localhost

En el archivo /etc/hostname configuramos el nombre del servidor.

Comando ifconfig
Por si solo muestra información de las interfaces activas del sistema

• -a → Con la opción a mostrará todas las interfaces sin importar si


están o no activas

194 www.sugeek.co
• up → Activa una interfaz de red
ifconfig eth0 up
• down → Desactiva una interfaz de red
ifconfig eth0 down

Establecer una dirección IP

ifconfig eth0 192.168.0.2 netmask 255.255.255.0 broadcast


192.168.0.255

Establecer interfaz virtual

ifconfig eth0:1 192.168.1.2/24

Comando ip
• addr → Muestra la información de las interfaces

root@sugeek:~# ip addr
1: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
state UP qlen 1000
link/ether 00:24:e8:c9:e8:ee brd ff:ff:ff:ff:ff:ff
inet 192.168.252.60/24 brd 192.168.252.255 scope global eth0
inet6 fe80::224:e8ff:fec9:e8ee/64 scope link
valid_lft forever preferred_lft forever

• link → Muestra la información sobre el estado del enlace

root@sugeek:~# ip link
1: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
state UP mode DEFAULT qlen 1000
link/ether 00:24:e8:c9:e8:ee brd ff:ff:ff:ff:ff:ff

Habilitar una interfaz de red

ip link set eth0 up

Deshabilitar una interfaz de red

ip link set eth0 down

Establecer una dirección ip

ip addr add 192.168.0.2/24 broadcast 192.168.0.255 dev eth0

Administración de Servidores GNU/Linux 195


Eliminar una dirección IP

ip addr del 192.168.0.77/24 dev eth0

Establecer una interfaz virtual

ip addr add 192.168.1.2/24 dev eth0 label eth0:1

• route → Muestra la tabla de las rutas creadas en el sistema,


además permite crear nuevas rutas estáticas.

ip route add 192.168.3.0/24 dev eth0

También permite establecer la ruta predeterminada o gateway.

ip route add default via 192.168.1.254

Comando route
Por si solo visualiza las rutas que tiene creadas el sistema.

Tabla de rutas IP del núcleo


Destino Pasarela Genmask Indic Métric Ref Uso Interfaz
default 192.168.2.1 0.0.0.0 UG 0 0 0 wlan0
link-local * 255.255.0.0 U 1000 0 0 wlan0
192.168.2.0 * 255.255.255.0 U 2 0 0 wlan0

• Destino → Red o Host de Destino


• Pasarela → IP del siguiente salto por donde se alcanza la red.
• GenMask → Mascara de la Red de destino
• Indic (Flags) → Estado de la Ruta
◦ U → La ruta esta activa y alcanzable (UP)
◦ H → Es un HOST
◦ G → La red es alcanzable por el gateway predeterminado.
◦ D → La ruta fue creada por un protocolo dinámico.
◦ ! → Se rechaza la ruta
• Metric → Métrica de la Ruta
• Interfaz → Interfaz para alcanzar la red o host de destino.

Ruta hacia una IP por la interfaz de red eth1

route add 192.168.3.4 eth1

Ruta hacia una red por el dispositivo eth1

196 www.sugeek.co
route add -net 192.168.238.0/24 gw 192.168.3.1 dev eth1

Para Eliminar una ruta ya creada, solo basta con cambiar el add por del.
Para crear la ruta predeterminada del sistema (gateway) se escribe.

route add default gw 192.168.2.1

Comando whois
Este comando permite obtener información sobre un dominio/IP
especificado, así sabremos quien lo registró, cuanto tiempo ha estado
registrado, cuando fue la última renovación, cuando se vence, etc.

root@sugeek:~# whois kernel.org


Domain Name:KERNEL.ORG
Domain ID: D169413-LROR
Creation Date: 1997-03-07T05:00:00Z
Updated Date: 2014-01-10T15:48:30Z
Registry Expiry Date: 2017-03-08T05:00:00Z
Sponsoring Registrar:Gandi SAS (R42-LROR)
...

Comando mtr
Permite hacer pruebas de conexión desde el servidor al host indicado, su
hermano menor es el comando traceroute, pero como se evidencia en el
siguiente ejemplo, mtr es mas informativo y útil en pruebas de VozIP.

En el ejemplo anterior vemos que presentamos pérdidas en las IP's

Administración de Servidores GNU/Linux 197


172.17.0.85, ya con esta información podemos informar a nuestro ISP de
posibles fallas. Con la opción -n solo mostrará la IP del Host y no el
FQDN.

Comando arp
Verifica el estado de las tablas ARP del sistema, recordemos que las
tablas ARP son tablas que asocian las direcciones MAC con las IP's de los
distintos host que se conectan al servidor.

soporte@sugeek:~$ arp -n
Dirección TipoHW DirecciónHW Indic Máscara Interfaz
172.16.5.105 (incompleto) eth0
172.16.4.194 ether 74:d4:35:28:fb:a1 C eth0
172.16.5.108 ether 50:46:5d:45:33:ba C eth0
172.16.4.1 ether ac:f1:df:73:d3:55 C eth0

Comando ping
Permite corroborar si un host es alcanzable

root@sugeek:~# ping -nc 4 sugeek.co


PING sugeek.co (184.107.53.15) 56(84) bytes of data.
64 bytes from 184.107.53.15: icmp_req=1 ttl=51 time=110 ms
64 bytes from 184.107.53.15: icmp_req=2 ttl=51 time=107 ms
64 bytes from 184.107.53.15: icmp_req=3 ttl=51 time=107 ms
64 bytes from 184.107.53.15: icmp_req=4 ttl=51 time=107 ms
Si tenemos varias interfaces, con la opción -I me permite identificar la
interfaz de red. La opción -n permite ignorar el nombre de host y
mostrar solo la IP, y la opción -c permite indicar la cantidad de pings
enviados.

Si se desea modificar el envío de paquetes ICMP, se recomienda el uso


del comando hping3 el cual debe de ser instalado.

Comando traceroute
A diferencia de mtr, solo envía un tres paquetes, por lo demás hace
exactamente lo mismo que mtr, enviar un paquete para verificar los
saltos desde un host origen a un host destino.

root@sugeek:~# traceroute -n linux.com


traceroute to linux.com (140.211.167.51), 30 hops max, 60 byte
packets
1 192.168.1.1 2.337 ms 2.290 ms 5.005 ms

198 www.sugeek.co
2 181.63.92.1 52.320 ms 32.375 ms 44.426 ms
3 172.21.16.190 53.450 ms 52.248 ms 54.038 ms
4 190.157.11.186 54.669 ms 55.285 ms 55.909 ms
5 * * *
6 173.205.63.221 75.159 ms 80.353 ms 79.478 ms
7 199.229.229.174 93.108 ms 74.186 ms 78.410 ms
8 4.69.147.163 235.146 ms 237.084 ms 234.838 ms
9 4.69.147.163 235.429 ms 233.593 ms 234.724 ms
10 4.53.150.46 156.079 ms 149.967 ms 150.134 ms
11 207.98.64.39 136.895 ms 133.279 ms 130.617 ms
12 207.98.64.39 140.201 ms !X * *

Si se poseen varias interfaces, es posible definir las pruebas usando una


interfaz en particular con la opción -i, o cambiar la cantidad de pruebas
con la opción -q, y cambiar el tamaño del paquete o MTU con la opción
--mtu.

Comando nslookup
Obtiene la dirección ip de un dominio especificado

root@sugeek:~# nslookup sugeek.co


Server: 127.0.0.1
Address: 127.0.0.1#53

Non-authoritative answer:
Name: sugeek.co
Address: 184.107.53.15

Comando dig
Similar a nslookup, pero a diferencia del anterior, con este se puede
cambiar el servidor DNS, dig @servidordns dominioaconsultar

root@sugeek:~# dig @8.8.8.8 sugeek.co

; <<>> DiG 9.8.1-P1 <<>> @8.8.8.8 sugeek.co


; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5026
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;sugeek.co. IN A

;; ANSWER SECTION:

Administración de Servidores GNU/Linux 199


sugeek.co. 21182 IN A 184.107.53.15

;; Query time: 94 msec


;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Feb 24 22:24:42 2014
;; MSG SIZE rcvd: 43

También se puede especificar el tipo de registro a consultar sobre dicho


dominio como (A, NS, MX, CNAME, SOA, etc). Así, si deseamos consultar
los registros MX de un dominio seria dig MX @servidordns dominio o
consultar cualquier registro, cambiaríamos el MX por el ANY quedando,
dig ANY @servidordns dominio.

Se recomienda pasar el comando dig con la opción +trace, esto con el


fin de visualizar adecuadamente el proceso de consulta y por que
servidores pasa antes de obtener respuesta.

Comando IPTraf
Este comando -es necesario instalarlo- nos permite visualizar en tiempo
real la actividad de la red a través de una GUI. Las opciones mas usadas
son:

• iptraf → Ejecuta el programa gráfico


◦ -i → Indica cual es la interfaz que va a ser monitorizada
◦ -g → Muestra estadísticas de forma generales
◦ -d → Muestra estadísticas detalladas de la interfaz
seleccionada
◦ -s → Comienza el monitor de trafico TCP y UDP
◦ -L → específica el archivo donde se guardará el log.

IPTraf Es un comando ideal para el análisis de red de un servidor, así


sabremos si se esta comportando como debería de comportarse.

Archivo /etc/networks
En este archivo encontramos las redes que están directamente
conectadas a nuestro sistema o asociadas a este.

200 www.sugeek.co
REGISTROS DEL SISTEMA
Ya habíamos mencionado sobre el comando dmesg (Consulta el archivo
/var/log/dmesg), last y lastb, pero no son los únicos que generan
registros en el sistema.

Normalmente en GNU/Linux todos los servicios guardan información del


su estado y funcionamiento. Todos los logs del sistema y servicios se
guardan y deben de guardar en /var/log. Los servicios encargados de
manejar los logs son rsyslog y logrotate.

Servicio rsyslog
Rsyslog es un servicio muy completo y complejo, pero interesante,
podemos encontrar mas información en http://www.rsyslog.com/ , ya
que en este apartado se tocaran temas muy superficiales.

¡IMPORTANTE!
Systemd, en futuras versiones sera el encargado de administrar los
registros.

Rsyslog esta en la capacidad de manejar mas de un millón de mensajes


por segundo en un sistema local, de múltiples servicios o de reglas
creadas por el usuario

Si viene de syslogd -versiones antes de Debian 7- notara que este


servicio ya no esta, y rsyslog lo ha remplazado, su configuración la
podemos encontrar en /etc/rsyslog.conf y el directorio de archivos por
servicio lo encontramos en /etc/rsyslog.d/.

Rsyslog es compatible con diferentes tipos de configuración, tener en


cuenta que un comentario inician con numeral # o estén dentro de /* */-

• sysklogd → Este es el mas sencillo, muy útil para casos de uso


sencillos.
• RainerScript → Esta es la mejor opción para implementar ya que
soporta las características avanzadas de crear reglas mediante
estructuras complejas.

Administración de Servidores GNU/Linux 201


sysklogd
Proveniente de syslogd, es el mas simple de utilizar, un ejemplo es:

mail.info /var/log/mail.log
mail.err @server.example.net

Lo anterior indica que el servicio de mail, cuando genere cualquier


información lo registre en /var/log/mail.log pero si se presenta un error lo
registre en un servidor externo. Podemos crear logs propios utilizando
los recursos de usuario, los cuales van desde local0 hasta el local7.

local1.err /var/log/mylog

Los distintos recursos son:

• 0 (Kernel – kern) → Mensajes del kernel


• 1 (Usuario – user) → Mensajes del nivel de usuario
• 2 (Mail – mail) → Sistema de correo
• 3 (Demonio – daemon) → Demonios de sistema
• 4 (Autenticacion – auth) → Seguridad/Autorización
• 5 (Syslog – syslog) → Mensajes generados internamente por
syslogd
• 6 (Impresion – lpr) → Subsistema de impresión
• 7 (Noticias – news) → Subsistema de noticias sobre la red
• 8 (uucp) → Subsistema UUCP
• 9 → Demonio de reloj
• 10 (Autorizacion – authpriv) → Seguridad/Autorización
• 11 (FTP - ftp) → Demonio de FTP
• 12 → Subsistema de NTP
• 13 → Inspección del registro
• 14 → Alerta sobre el registro
• 15 (clock) → Demonio de reloj
• 16 (local0) → Uso local 0
• 17 (local1) → Uso local 1
• 18 (local2) → Uso local 2
• 19 (local3) → Uso local 3
• 20 (local4) → Uso local 4
• 21 (local5) → Uso local 5
• 22 (local6) → Uso local 6
• 23 (local7) → Uso local 7

Los distintos niveles de severidad son:

202 www.sugeek.co
• 0 (Emergencia - panic) → El sistema está inutilizable
• 1 (Alerta - alert) → Se debe actuar inmediatamente
• 2 (Crítico - crit) → Condiciones críticas
• 3 (Error - err) → Condiciones de error
• 4 (Peligro - warn) → Condiciones de peligro
• 5 (Aviso - notice) → Pero condiciones notables
• 6 (Información - info) → Mensajes informativos
• 7 (Depuración - debug) → Mensajes de bajo nivel

Para calcular la prioridad de un servicio se toma la siguiente fórmula:

Prioridad=Recurso*8+Severidad

Según lo anterior podríamos tomar como ejemplo el kernel, el cual tiene


un recurso de 0 y una severidad de 0, tendríamos como resultado
0*8+0=0, siendo cero el mayor nivel de prioridad.

RainerScript
Es el lenguaje predeterminado de rsyslog y el recomendado a utilizar
cuando poseemos mayores conocimientos sobre rsyslog. Este lenguaje
se asemeja al lenguaje utilizado en la creación de scripts en Bash.

El lenguaje soporta expresiones complejas arbitrarias. Todos los


operadores habituales son compatibles. La precedencia de las
operaciones es el siguiente:

• Expresiones entre paréntesis


• Not
• *, /,% (Módulo, como en C)
• +, -, & (concatenación de cadenas)
• ==,! =, <>, <,>, <=,> =, Contiene (cadenas!)
• and
• or

El siguiente ejemplo fusiona las funciones de rsyslog para obtener


información sobre cierto programa que en esta ocasión sera el
NetworkManager.

If ($programname == 'NetworkManager') or ($programname startWith


'nm-') then -/var/log/NetworkManager & ~

Administración de Servidores GNU/Linux 203


Servicio logrotate
La función de logrotate es evitar que los archivos de logs superen cierto
tamaño/tiempo y se vuelvan inmanejables, realizando actividades como
compresión, rotación, eliminación y envío de logs a mails.

Se podría planificar la rotación de los registros de forma diaria, semanal,


mensual, o cuando llegue a cierto tamaño. Normalmente logrotate corre
diariamente con un trabajo de crontab.

Para poder ejecutar logrotate sin necesidad de esperar, se ejecuta el


comando logrotate -f para forzar la ejecución, ya que si se ejecuta solo,
este validara si ya se ejecutó y si fue así no realiza ninguna acción.

El archivo de configuración se podrá encontrar en /etc/logrotate.conf


y /etc/logrotate.d/, allí se encuentra la configuración para cada uno de
los logs que están en /var/log, normalmente los nuevos servicios
escriben allí sus líneas para la rotación de los registros.

compress

/var/log/messages {
rotate 5
weekly
postrotate
/usr/bin/killall -HUP syslogd
endscript
}

"/var/log/httpd/access.log" /var/log/httpd/error.log {
rotate 5
mail www@my.org
size 100k
sharedscripts
postrotate
/usr/bin/killall -HUP httpd
endscript
}

/var/log/news/* {
monthly
rotate 2
olddir /var/log/news/old
missingok
postrotate
kill -HUP `cat /var/run/inn.pid`

204 www.sugeek.co
endscript
nocompress
}

Las primeras líneas sin “Encapsular” -dentro de ningún corchete o


llaves- son las opciones globales, después van las reglas hacia cada uno
de los archivos, o carpetas -se podrá notar en la carpeta /var/log/news
como se usa un comodín para hacer énfasis en todos los archivos
contenidos en esta-.

Tomando como ejemplo el /var/log/messages en donde indica que va a


rotar los registros durante 5 semanas, pero antes el antiguo registro se
comprime -en gzip opción global compress- y se ejecuta el comando
indicado luego de hacer la rotación, en el ejemplo de httpd rota 5 veces
cuando llegue a los 100k de tamaño y sera enviado al mail
www@my.org. En el último ejemplo además de hacer 2 rotaciones
mensuales se crea un “olddir” o directorio donde se guardaran los
antiguos registros comprimidos.

Algunas de las opciones que se podrán incluir en este archivo son:

• compress → Antiguas versiones de los logs son comprimidas


• copy → Crea una copia del log generado, ideal para realizar
backups de los logs o cuando estos son consultados por otras
aplicaciones, y se quiere evitar al máximo la interacción con el
log original.
• Monthly → Se guarda el log cada mes
• weekly → Se guarda el log cada semana
• postrotate/endscript → Las líneas dentro de postrotate y
endscript, ejecutan un comando indicado después que se hace la
rotación de logs, no siempre es necesario ejecutar un comando.
• rotate → Cantidad de antiguas versiones que se mantienen antes
de ser eliminadas.
• Size → Tamaño del archivo que se tiene en cuenta para poder
realizar la rotación del log, podríamos definir tamaños con M y k.
(10M para 10 Megabytes o 10k para 10 Kilobytes)
• Create → Crea el nuevo archivo log para que el sistema siga
escribiendo.

Probando los Registros Locales


Para probar el sistema de forma local, vamos a simular un error en una
aplicación de correo. Los registros no se escriben a mano sino a través

Administración de Servidores GNU/Linux 205


de la orden “logger”.
Un ejemplo seria un error:

root@sugeek:~# logger -p mail.err "Esto es una prueba"

La opción -p (prioridad) imprime el mensaje “Esto es una prueba” en el


registro llamado “mail.err”

Si verificamos el registro de los errores de mail notaremos la prueba.

root@sugeek:~# cat /var/log/mail.err


May 13 21:47:55 debian root: Esto es una Prueba

Debian y root son el host o servidor que genero el error y el usuario.

Archivo /var/log/messages
En este archivo se guardan la mayoría de mensajes que arrojan los
servicios del sistema, se puede cambiar el archivo de registro según la
configuración de cada servicio.

206 www.sugeek.co
TAREAS PLANIFICADAS
Poder automatizar algunos procesos del sistema hace que la labor del
administrador sea mas eficiente, para esto existen los comandos crond y
at, además de la herramienta anacron la cual no veremos en esta
ocasión ya que esta herramienta se enfoca para computadores de
escritorio.

Nota: Se requiere conocimientos básicos en BASH para poder realizar


tareas planificadas

Archivo /etc/crontab
En este archivo se encuentra la configuración general del demonio
crond. El contenido de dicho archivo es similar a:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command


17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts
--report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts
--report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts
--report /etc/cron.monthly )
#

Como se puede evidenciar, el archivo ya viene con unas reglas


apuntando a los directorios /etc/cron.hourly/ /etc/cron.daily/
/etc/cron.weekly y /etc/cron.monthly. Los cuales contienen los scripts
que se deseen ejecutar cada cierto tiempo.

El archivo de configuración de crond posee 7 columnas separadas por


espacios:

• m → Minutos
• h → Horas
• dom → Día del Mes (Day of Month)
• mon → Mes (Month)
• dow → Día de la Semana (Day of Week) 0-6 (0 Es domingo y 6 es
el Sábado)

Administración de Servidores GNU/Linux 207


• user → Usuario que ejecuta el comando
• command → Comando a ejecutar o script

Tomando como ejemplo la primera línea de nuestro archivo,


procederemos a interpretarlo:

17 * * * * root cd / && run-parts --report /etc/cron.hourly

La anterior línea indica

• 17 → A los 17 Minutos
• * → De cada hora
• * → Todos los Días
• * → Todos los meses
• * → Todos los días de la Semana
• root → Con el Usuario Root
• cd / && run-parts --report /etc/cron.hourly → Ejecutar este
comando

Si deseamos que se ejecute ciertos meses, en el apartado del mes,


definimos el número del mes separados por comas. 1,2,5,7,10 Para
Enero, Febrero, Mayo, Julio y Octubre.

Como se observa, existen ciertos operadores.

• El asterisco (*) → Este operador abarca todos los valores posibles


en un campo. Por ejemplo, un asterisco en el campo de hora,
será equivalente a cada hora, o, un asterisco en el campo mes
será equivalente a todos los meses.

• La coma (,) → Este operador específica una lista de valores, por


ejemplo: "1,5,10,15,20, 25".

• El guión (-) → Este operador específica una serie de valores, por


ejemplo: ""5-15" días, lo que equivale a escribir "5,6,7,8,9, ... ,
13,14,15" usando el operador coma.

Pero aparte de usar operadores también podemos utilizar abreviaciones:

• @reboot → Ejecutar una vez, en el inicio.


• @yearly → Ejecutar una vez al año, es igual que indicar "0 0 1 1
*".
• @annually → (igual que @yearly)

208 www.sugeek.co
• @monthly → Ejecutar una vez al mes, es igual que indicar "0 0 1
* *".
• @weekly → Ejecutar una vez a la semana, es igual que indicar "0
0 * * 0".
• @daily → Ejecutar una vez al día, es igual que indicar "0 0 * * *".
• @midnight → (igual que @daily)
• @hourly → Ejecutar a cada hora, es igual que indicar "0 * * * *".

Comando crontab
Con este comando se puede gestionar las funciones del demonio crond
por usuario, siempre y cuando tenga permisos de ejecutarlo.
Dependiente de los archivos /etc/cron.allow /etc/cron.deny y
/var/spool/cron/crontabs/ en este último se guardan las tareas
planificadas del usuario. Algunas opciones este comando son:

• u → Indica el usuario
• l → Lista la tareas del usuario indicado
• e → Edita las tareas planificadas del usuario
• r → Elimina los crontabs del usuario indicado

root@suge3k:~# crontab -l -u soporte


no crontab for soporte

Comando at
Este comando a diferencia del crontab -también posee at.allow y at.deny
dentro de /etc- solo permite ejecutar una tarea planificada, por ende, si
se va a ejecutar mas de una sola vez, se recomienda el uso de crontab.

root@sugeek:/etc# at 19:58
warning: commands will be executed using /bin/sh
at> echo "HOLA"
at> <EOT>
job 2 at Tue May 13 19:58:00 2014

Como se observa, hemos definido que at se ejecute a la 19:58 y luego


solicita el comando a ejecutar, después de escribir el comando
terminamos la tarea con la combinación de teclas [Ctrl] + [D].

Cada tarea planificada se guardara en /var/spool/atjobs


Para indicar un script, solo basta con la opción -f y la ruta del script.

root@sugeek:/etc# at -f /home/ruta/del/script 20:00

Administración de Servidores GNU/Linux 209


Además, se puede indicar que se ejecute en n días a x hora.

root@sugeek:/etc# at -f /home/ruta/del/script 20:00 + 2 days

Lo anterior es una buena idea si tenemos que hacer algo y no nos


encontramos en sitio, así que lo planificamos una sola vez.

Para saber que tareas tenemos planificadas con at procedemos a usar el


comando atq, y para borrar una tarea planificada usamos atrm n siendo
n el número de la tarea.

210 www.sugeek.co
SEGURIDAD EN GNU/LINUX
Aunque GNU/Linux es uno de los sistemas operativos mas robustos en
cuanto a seguridad se refiere, una mala configuración o administración
podría afectar notablemente la integridad de la información allí
almacenada o en su defecto que nuestro servidor sea usado en una
bootnet.

Archivo /etc/securetty
Este archivo permite bloquear las consolas TTY para su conexión local,
solo basta con eliminar o comentar las TTY que no deseemos conexión,
se recomienda dejar 3 por lo mínimo.

Rootkits
Un RootKit permite suplantar cierto comando para poder obtener
credenciales de root y así darle permisos al atacante de realizar
cualquier actividad en nuestro servidor.

Un ejemplo de rootkit es el siguiente:

soporte@debian:~$ pwd
/home/soporte
soporte@debian:~$ cat su
#!/bin/bash
echo -e "Contraseña: \c"
read -s password
echo "$@ $password" > /tmp/fic
echo
echo "su: Fallo de Autenticación"
/bin/su $@
soporte@debian:~$ chmod +x su
soporte@debian:~$ export PATH=$HOME:$PATH
soporte@debian:~$ su root
Contraseña: #Falso Su
su: Fallo de Autenticación #Falso su
Contraseña: #Verdadero SU
root@debian:/home/soporte# cat /tmp/fic
root D3B14N

Como se puede observar se ha suplantado el comando su el cual es


importante en el sistema.

Administración de Servidores GNU/Linux 211


Existe la herramienta chkrootkit, la cual permite escanear y detectar los
rootkits mas conocidos. El uso es muy sencillo, el comando seguido de
las opciones. Se instala con apt-get install chkrootkit.

Virus
Se tiene que desmitificar la frase “En GNU/Linux no existen virus”, ya
que si existen virus en GNU/Linux, pero no tanto como en otros sistemas
mas extendidos, es mas, para que un virus sea ejecutado en GNU/Linux
debe de tener acceso a root, el cual accede con el permiso del usuario
-el usuario instala software sin saber que es-, Pero aun así es difícil que
dicho virus afecte notablemente el sistema por la estructura del sistema
de archivos de Linux (FHS).

Pero si nuestro equipo o servidor, se conecta de forma constante a


equipos de otras plataformas como Windows, se recomienda tener
instalado un antivirus, el motor de antivirus para GNU/Linux se llama
ClamAV, el cual se instala de la siguiente manera:

apt-get install clamav clamav-daemon

Clamav es el antivirus en si, el cual se debe de ejecutar en función de la


necesidad, y el clamav-daemon es el demonio que se mantiene
ejecutando y verificar en “Caliente” los archivos copiados y archivados.

La herramienta freshclam se encarga de actualizar la base de datos de


clamav, se puede actualizar de forma manual, o de forma periódica
configurando el archivo /etc/clamav/fresclam.

Para la ejecución manual del antivirus, procederemos a ejecutar el


siguiente comando:

root@suge3k:~#clamscan -r -v --remove=yes /home/*


--log=/var/log/logvirus

Entendamos el comando anterior, la opción -r indica recursivo, la -v es


verbose -la información mostrada es mas detallada-, la opción
--remove=yes elimina los archivos infectados, luego la carpeta que se
realiza el escaneo, y por último el resultado de dicho escaneo se guarda
en el archivo indicado con --log=/var/log/ogvirus

Se recomienda el uso del manual del comando con man clamscan.

212 www.sugeek.co
Bloquear USB
En ocasiones es necesario bloquear ciertos dispositivos USB para evitar
el robo de información, o posibles infecciones.

¡IMPORTANTE!
HCI hace referencia a Host Controller Interface o Interfaz Controladora
de Host, OHCI es OpenHCI proveniente de Compaq -actual HP-, UHCI es
UniversalHCI, EHCI es EnhancedHCI y XHCI eXtensibleHCI, las dos
últimas desarrolladas por Intel. Si se tiene XHCI instalado, las anteriores
no son necesarias ya que XHCI soporta las antiguas versiones de USB.

Para bloquear los puertos usb, debemos de conocer algunos módulos


integrados al usbcore, entre los cuales destacamos:

• ohci_hcd → Soporte a USB 1.0


• uhci_hcd → Soporte a USB 1.1
• ehci_hcd → Soporte a USB 2.0
• usb_storage → Soporte a dispositivos de almacenamiento
• usbhid → Soporte a dispositivos de interfaz humana (Teclados,
Mouse, Gamepad, etc)
• snd-usb-audio → Soporte para dispositivos de audio
• usbvideo → Soporte para dispositivos de vídeos
• irda-usb → Soporte para Infrarrojos USB
• usbnet → Soporte para tarjetas de red alámbricas o inalámbricas

Suponiendo que deseamos bloquear los dispositivos de almacenamiento


para que no puedan extraer información de nuestros sistemas,
procedemos a bloquear el usb_storage. Para ello solo escribimos lo
siguiente:

root@sugeek:/#echo “blacklist usb_storage” >


/etc/modprobe.d/usb_storage.conf && depmod -ae && update-initramfs
-u

Ya con lo anterior hemos bloqueado el módulo usb_storage para evitar la


fuga de información.

Herramienta SUDO
El comando de sustitución de usuario (substitute user do), o SUDO,
permite ejecutar ciertos comandos de y usuario con x usuario. En Debian
por defecto no viene instalado, lo podemos instalar con el comando apt-

Administración de Servidores GNU/Linux 213


get install sudo . No confundir con el comando su.

¡IMPORTANTE!
La configuración por defecto de SUDO hace que cualquier usuario del
sistema pueda ejecutar actividades de root, se recomienda instalar sudo
y no dejar la configuración por defecto.

Los permisos de SUDO pueden ser por usuarios, grupos, y comandos.

El comando sudo al ejecutarse y al ser satisfactoria la conexión, de


forma predeterminada se genera una sesión abierta por 15 minutos. Las
diferentes opciones que se pueden enviar a sudo son:

• u → Indica el usuario con el cual se va a ejecutar cierto comando,


si no se específica de forma predeterminada, sudo toma como
usuario al usuario root.
• g → Lo mismo que los usuarios pero enfocado a un grupo.
• k → Invalida la sesión de sudo, esto quiere decir que los 15
minutos se cancelan y se cerrará la sesión.
• l → Indica los permisos que tiene el usuario actual con sudo, se
puede ayudar de -u para especificar el usuario.

Archivo /etc/sudoers
En este archivo se definen las reglas por defecto del comando sudo.

root@sugeek:~# cat /etc/sudoers


Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:"
root ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL

Las reglas generales son las Defaults, estas son utilizadas para modificar
el comportamiento de sudo. Dichas opciones son aplicables tanto a nivel
global, a nivel de usuario o a nivel de maquina. Ya el resto de opciones
es donde se definen los permisos por usuarios o por grupos.

Las reglas generales pueden ser declaradas de forma independiente


(defaults regla) o agrupadas (defaults regla,regla,regla). Negar una regla
con !regla.

Algunas de las reglas mas utilizadas son:

214 www.sugeek.co
• secure_path: Ubicación de los binarios que se ejecutan con sudo
• logfile: Podemos definir la ubicación del log, adicional las reglas
log_host, log_year, log_input y log_output mejora el registro.
• badpass_message: Muestra el mensaje definido cuando se
ingresa mal la contraseña, se puede insultar al usuario con la
regla insults.
• passwd_tries: Limite de intentos para ingresar la contraseña es
(por defecto 3), podemos disminuirlo o aumentarlo. se
recomienda combinar con la regla passwd_timeout la cual define
el tiempo que se espera en minutos para que el usuario ingrese
la contraseña.
• timestamp_timeout: Cuando se ingresa la contraseña por primera
vez al ejecutar sudo, el sistema lo recordara por defecto durante
15 minutos, podemos disminuirlo o aumentar este tiempo,
recomendamos dejarlo en 0 para que siempre pida la contraseña.

A nivel de alias o reglas de usuarios, grupos y host, la estructura de


permisos dentro del archivo sudoers es:

user machine = (user2) comando

• user → El usuario o alias al cual se aplica la regla.


◦ Los usuarios pueden ser:
▪ Nombre de Usuario
▪ #uid
▪ %group
▪ +netgroup
▪ User_Alias
• machine → La maquina o alias en la cual se aplica la regla.
• user2 → La cuenta con la cual el usuario ejecutara el comando
• comando → Comando a ejecutar.

Un ejemplo seria: soporte ALL = /sbin/fsck

Lo anterior indica que el usuario soporte, desde cualquier estación va a


ejecutar el comando fsck.

Lo demás que podemos hacer es (a los grupos se le definen como alias) :

• Crear grupos de usuarios


• Crear grupos de maquinas
• Crear grupos de comandos
• Forzar el uso o no de una contraseña

Administración de Servidores GNU/Linux 215


• Forzar la ejecución de un comando bajo un usuario distinto a root.

A continuación veremos un archivo /etc/sudoers modificado a medida


donde se evidencia la creación de alias de usuarios y comandos, esto
con la finalidad de tener un control sobre quienes y que podrán ejecutar
en nuestro servidor.

#OPCIONES Se puede ver todas en SUDOERS OPTIONS utilizando el manual


Defaults env_reset,timestamp_timeout=5,passwd_timeout=1,
passwd_tries=1,insults

#ALIAS (Grupo de Usuarios)


User_Alias ADMINS = admin1,admin2
User_Alias TECNICOS = tecnico1,tecnico2

#ALIAS (Comandos)
Cmnd_Alias ADMIN =/sbin/,/usr/sbin/,/usr/local/sbin/
Cmnd_Alias TECNI =/sbin/ifconfig,/sbin/fsck

#REGLAS (ACL)
#Usuario root y grupo sudo continúan con sus reglas
root ALL=(ALL) ALL

#Administradores no se les solicita password prohibiendo el apagado


ADMINS ALL = NOPASSWD: ADMIN,!/sbin/shutdown
TECNICOS ALL = TECNI

Se recomienda ver el manual de sudoers con man sudoers ya que


contiene información muy específica y muy bien explicada en donde
también se encuentran ejemplos prácticos.

PAM (Pluggable Authentication Modules)


PAM es un mecanismo centralizado y flexible para la autenticación de
usuarios. Permite modelar políticas de seguridad personalizadas
dependiendo el servicio y usuarios. Con este mecanismo, un usuario se
puede autenticar utilizando una cuenta de sistema, un LDAP, una llave
USB, Biométrico, etc. además de horarios preestablecidos.

Todo método de autenticación depende directamente de la librería


libpam.so, cuando el método de autenticación es identificado esta valida
el archivo de configuración, el cual dependiendo del tipo de
autenticación así mismo cargará ciertos módulos y procederá a validar
que todo el proceso de autenticación sea válido.

216 www.sugeek.co
Para saber si un comando utiliza PAM, se valida si está montado con la
librería PAM libpam.so:

root@sugeek:/etc/pam.d# ldd /usr/bin/passwd


linux-vdso.so.1 (0x00007ffe769c9000)
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0
libpam_misc.so.0 => /lib/x86_64-linux-gnu/libpam_misc.so.0
libaudit.so.1 => /lib/x86_64-linux-gnu/libaudit.so.1
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3
/lib64/ld-linux-x86-64.so.2 (0x00007f6fd9b32000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0

Todos los archivos de configuración se guardan en /etc/pam.d/ y suele


existir un archivo de configuración por cada método de autenticación.

Veamos un ejemplo ficticio de autenticación:

auth requisite /lib/security/pam_securetty.so


auth required /lib/security/pam_env.so
auth sufficient /lib/security/pam_unix.so
auth required /lib/security/pam_deny
auth required /lib/security/pam_nologin.so

1. La primera línea comprueba si el usuario intenta conectarse

Administración de Servidores GNU/Linux 217


desde un terminal sin seguridad, si es así, PAM devuelve
directamente falso y la autenticación fracasa.
2. La segunda línea carga el entorno del usuario. Un fracaso no
impide aquí la ejecución de las líneas siguientes, pero al final PAM
devolverá falso.
3. La tercera línea intenta una autenticación mediante los
mecanismos Unix clásicos (archivo de contraseñas, NIS, etc.). El
éxito detiene el proceso en este punto: se autentica directamente
al usuario. Si no, se pasa directamente a la línea siguiente.
4. La cuarta línea siempre devuelve falso. Como los módulos de
autenticación anteriores han fracasado, la conexión del usuario
fracasa. A pesar de todo, se ejecuta la línea siguiente.
5. Si el archivo /etc/nologin existe, se muestra.

Como se observa, se tienen 3 columnas las cuales se dividen en Tipo de


módulo, control y módulo.

Tipo de Modulo
• Auth → Módulo de autenticación (por ejemplo, petición de login y
contraseña).
• Account → Autorización, gestión de cuentas (verificación del
usuario para el servicio dado. ¿Se autoriza?).
• Password → Comprobación y actualización de la información de
seguridad (p. ej.: ¿sigue siendo válida la contraseña? Si no es así,
petición de una nueva contraseña).
• Session → Modificación del entorno del usuario.

Control
• Required → Éxito requerido. En caso de denegación, se llama a
los módulos restantes a pesar de todo, pero, pase lo que pase, al
final PAM devolverá una denegación.
• Requisite → La denegación termina de manera inmediata la
autenticación. El éxito le autoriza a proseguir.
• Sufficient → Un éxito evita los otros módulos. Dicho de otro modo,
PAM devuelve ok pase lo que pase en caso de éxito.
• Optional → Se ignora el resultado.

Modulo
• pam_unix.so → Autenticación estándar mediante la función C
getpw().

218 www.sugeek.co
• pam_env.so → Definición de las variables de entorno.
• pam_securetty.so → Prohíbe una conexión de superusuario (root)
desde un terminal sin suficiente seguridad. Se coloca la lista de
los terminales autorizados en /etc/securetty.
• pam_stack.so → Llama a otro servicio PAM para cargar módulos
adicionales.
• pam_nologin.so → Prohíbe la conexión de usuarios si el archivo
/etc/nologin está presente. En ese caso, se visualiza su contenido.
• pam_deny.so → Siempre devuelve una denegación.
• pam_console.so → Da permisos adicionales a un usuario local.

Limites del Usuario


El comando ulimit permite actuar en el entorno del shell y de los
procesos que controla, con la opción -a muestra las opciones controladas
por este.

root@debian:/var/Kernel# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7534
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7534
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

Los valores que nos interesa en este momento son:

• max memory size → El tamaño máximo de RAM que puede usar


un usuario
• open files → El número máximo de archivos que se puede abrir
por usuario.
• max users processes → Número máximo de procesos que puede
iniciar un usuario.

Estos valores pueden ser cambiados editando el archivo

Administración de Servidores GNU/Linux 219


/etc/security/limits.conf con el usuario root. Al abrir el archivo
notaremos una guía muy fácil para editar los límites tanto suaves (soft) y
duros (hard), veremos que podemos colocar dichos límites tanto por
usuario como por grupos.

Proteger el GRUB2 con contraseñas


Es probable que nuestro sistema caiga en manos de una persona que
sepa realizar la actividad que vimos al inicio del libro, la cual consistía en
recuperar la contraseña de root y tener acceso al servidor, por ello
también se recomienda asegurar nuestro GRUB2 con contraseña,
aunque GRUB2 permite crear usuarios y grupos con roles distintos no los
configuraremos, solo veremos la contraseña.

Para establecer la contraseña de GRUB2 se utiliza la herramienta grub-


mkpasswd-pbkdf2

root@sugeek:/# grub-mkpasswd-pbkdf2
Enter password:
Reenter password:
Your PBKDF2 is
grub.pbkdf2.sha512.10000.D29EE80C313168F16E637F3D5B579AA5F08C40B5949
71B01D9E8B8DE39CB78F664CB8ABE5605B00878E34ECCD326FA848CD201ACDD24EBC
4E25F0259C1D63D2E.F840FED5C672E80C5F50BA46289AB5C45B9B444B34B0A33D3

Dicha contraseña generada se debe de copiar en el archivo


/etc/grub.d/40_custom quedando dicho archivo de la siguiente manera

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply
type the
# menu entries you want to add after this comment. Be careful not
to change
# the 'exec tail' line above.

set superusers="admin"
password_pbkdf2 admin
grub.pbkdf2.sha512.10000.D29EE80C313168F16E637F3D5B579AA5F08C40B5949
71B01D9E8B8DE39CB78F664CB8ABE5605B00878E34ECCD326FA848CD201ACDD24EBC
4E25F0259C1D63D2E.F840FED5C672E80C5F50BA46289AB5C45B9B444B34B0A33D3

Ya con lo anterior solo se requiere recargar el grub con update-grub y la


próxima vez que inicie el sistema y queramos modificar el grub nos
solicitara la contraseña que establecimos.

220 www.sugeek.co
BIBLIOGRAFÍA
Parte del contenido de esta obra se sustrajo de:

• Wikipedia (https://www.wikipedia.org)
• Documentación de Debian (https://www.debian.org/doc/)
• Debian-Administration (https://www.debian-administration.org/)
• Debian Handbook (http://debian-handbook.info/)
• Gentoo Handbook (https://gentoo-handbook.lugons.org/)
• Certificación Linux LPIC-1 (http://www.ediciones-eni.com)

Administración de Servidores GNU/Linux 221

Вам также может понравиться