PRUEBA DE EVALUACION CONTINUA Nº 2 “Kernel” y “Administración Local”.
JORGE ALBERTO AROCHA MUÑOZ
Trabajo presentado dentro de la asignación ADMINISTRACIÓN AVANZADA DEL SISTEMA OPERATIVO GNU/LINUX
ALAN WARD KOECK TUTOR REMO SUPPI BOLDRITO TUTOR
UNIVERSIDAD OBERTA DE CALUNYA MAESTRIA EN SOFTWARE LIBRE 2009
I PARTE 1 MODULO 4: El Núcleo 1 Determinar la versión actual del núcleo instalada en la distribución de trabajo y obtener información sobre si existe alguna nueva versión del mismo. En caso de que sea posible (es decir si la máquina es de pruebas, personal etc.) instalarla automáticamente. Si no es posible indicar los pasos a seguir por realizar esta opción. Para ello se deberán tener en cuenta la dependencia de los módulos utilizados (pcmcia, alsa, etc...) y con el cargador (bootloader) Grub o Lilo. a Versión actual del núcleo instalada.
El comando que inicialmente se puede usar es uname con la opción -r, que devuelve el release del kernel instalado. pc-caliope:/home/caliope# uname -r 2.6.26-2-686
En este caso está instalada la versión 2.6.26 la revisión 2 arquitectura 686. Si se desea trener mayor información, específicamente el paquete se puede utilizar dpkg con la opción -l para tener un listado de los paquetes, después filtrar la salida con grep para seleccionar las lineas que tengan ii (que significa que es un paquete instalado) y posteriormente se filtra nuevamente con grep para buscar linux-image. pc-caliope:/home/caliope# dpkg -l | grep ii |grep linux-image | more ii linux-image-2.6-686 2.6.26+17+lenny1 Linux 2.6 image on PPro/Celeron/PII/PIII/P4 ii linux-image-2.6.26-2-686 2.6.26-19lenny1 Linux 2.6.26 image on Ppro/Celeron/PII/PIII/
b Obtener información si existe alguna nueva versión.
Se pueden utilizar las herramientas de administración de paquetes con el fin de ver si existen nuevas versiones del kernel, o de cualquier programa, para este efecto se puede utilizar aptitude, synaptic, dpkg, apt, etc. En este caso para usar desde la consola de comandos se usará apt. pc-caliope:/home/caliope# apt-get update pc-caliope:/home/caliope# apt-get -u upgrade Leyendo lista de paquetes... Hecho Creando árbol de dependencias Leyendo la información de estado... Hecho Se actualizarán los siguientes paquetes: kdelibs-data kdelibs4c2a libnspr4-0d libpurple0 linux-headers-2.6.26-2-686 linux-headers-2.6.26-2common linux-image-2.6.26-2-686 linux-libc-dev pidgin pidgin-data
10 actualizados, 0 se instalarán, 0 para eliminar y 0 no actualizados. Necesito descargar 53,6MB de archivos. Se utilizarán 20,0MB de espacio de disco adicional después de esta operación.
Con apt-get update se actualizan las listas de paquetes disponibles y con apt-get upgrade se instalan las actualizaciones disponibles para los paquetes instalados, se puede usar la opción -u saber qué paquetes específicamente se van actualizar, en este caso si el interés es saber si existen actualizaciones del kernel se debe observar si dentro de los paquetes a actualizar se encuentra alguno llamado linuximage-XXXXXX. En este caso se puede observar que se actualizará linux-image-2.6.26-2-686 y algunas dependencias como los headers. c Instalación de una versión actualizada.
Como se mencionó anteriormente se puede usar el comando apt-get upgrade, se puede usar la opción -y para que no pregunte por la confirmación de la actualización. pc-caliope:/home/caliope# apt-get -u upgrade Leyendo lista de paquetes... Hecho Creando árbol de dependencias Leyendo la información de estado... Hecho Se actualizarán los siguientes paquetes: kdelibs-data kdelibs4c2a libnspr4-0d libpurple0 linux-headers-2.6.26-2-686 linux-headers-2.6.26-2common linux-image-2.6.26-2-686 linux-libc-dev pidgin pidgin-data 10 actualizados, 0 se instalarán, 0 para eliminar y 0 no actualizados. Necesito descargar 53,6MB de archivos. Se utilizarán 20,0MB de espacio de disco adicional después de esta operación. ¿Desea continuar [S/n]? S Des:1 http://security.debian.org lenny/updates/main linux-image-2.6.26-2-686 2.6.26-19lenny2 [20,2MB] Des:2 http://security.debian.org lenny/updates/main kdelibs-data 4:3.5.10.dfsg.1-0lenny3[8719kB] Des:3 http://security.debian.org lenny/updates/main kdelibs4c2a 4:3.5.10.dfsg.1-0lenny3 [10,4MB] Des:4 http://security.debian.org lenny/updates/main libnspr4-0d 4.7.1-5 [124kB] Des:5 http://security.debian.org lenny/updates/main pidgin-data 2.4.3-4lenny5 [7010kB] Des:6 http://security.debian.org lenny/updates/main libpurple0 2.4.3-4lenny5 [1584kB] Des:7 http://security.debian.org lenny/updates/main linux-headers-2.6.26-2-686 2.6.26-19lenny2 [398kB] Des:8 http://security.debian.org lenny/updates/main linux-headers-2.6.26-2-common 2.6.26-19lenny2 [3719kB] Des:9 http://security.debian.org lenny/updates/main linux-libc-dev 2.6.26-19lenny2 [750kB] Des:10 http://security.debian.org lenny/updates/main pidgin 2.4.3-4lenny5 [681kB] Descargados 53,6MB en 4min4s (219kB/s) Preconfigurando paquetes ... (Leyendo la base de datos ... 132284 ficheros y directorios instalados actualmente.) Preparando para reemplazar linux-image-2.6.26-2-686 2.6.26-19lenny1 (usando .../linuximage-2.6.26-2-686_2.6.26-19lenny2_i386.deb) ... The directory /lib/modules/2.6.26-2-686 still exists. Continuing as directed. Done. Desempaquetando el reemplazo de linux-image-2.6.26-2-686 ... Running postrm hook script /sbin/update-grub.
Searching for GRUB installation directory ... found: /boot/grub Searching for default file ... found: /boot/grub/default Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst Searching for splash image ... none found, skipping ... Found kernel: /boot/vmlinuz-2.6.26-2-686 Updating /boot/grub/menu.lst ... done Preparando para reemplazar kdelibs-data 4:3.5.10.dfsg.1-0lenny2 (usando .../kdelibsdata_4%3a3.5.10.dfsg.1-0lenny3_all.deb) ... Desempaquetando el reemplazo de kdelibs-data ... Preparando para reemplazar kdelibs4c2a 4:3.5.10.dfsg.1-0lenny2 (usando .../kdelibs4c2a_4%3a3.5.10.dfsg.1-0lenny3_i386.deb) ... Desempaquetando el reemplazo de kdelibs4c2a ... Preparando para reemplazar libnspr4-0d 4.7.1-4 (usando .../libnspr4-0d_4.7.1-5_i386.deb) ... Desempaquetando el reemplazo de libnspr4-0d ... Preparando para reemplazar pidgin-data 2.4.3-4lenny4 (usando .../pidgindata_2.4.3-4lenny5_all.deb) ... Desempaquetando el reemplazo de pidgin-data ... Preparando para reemplazar libpurple0 2.4.3-4lenny4 (usando .../libpurple0_2.4.3-4lenny5_i386.deb) ... Desempaquetando el reemplazo de libpurple0 ... Preparando para reemplazar linux-headers-2.6.26-2-686 2.6.26-19lenny1 (usando .../linuxheaders-2.6.26-2-686_2.6.26-19lenny2_i386.deb) ... Desempaquetando el reemplazo de linux-headers-2.6.26-2-686 ... Preparando para reemplazar linux-headers-2.6.26-2-common 2.6.26-19lenny1 (usando .../linuxheaders-2.6.26-2-common_2.6.26-19lenny2_i386.deb) ... Desempaquetando el reemplazo de linux-headers-2.6.26-2-common ... Preparando para reemplazar linux-libc-dev 2.6.26-19lenny1 (usando .../linux-libcdev_2.6.26-19lenny2_i386.deb) ... Desempaquetando el reemplazo de linux-libc-dev ... Preparando para reemplazar pidgin 2.4.3-4lenny4 (usando .../pidgin_2.4.3-4lenny5_i386.deb) ... Desempaquetando el reemplazo de pidgin ... Procesando disparadores para man-db ... Procesando disparadores para menu ... Configurando linux-image-2.6.26-2-686 (2.6.26-19lenny2) ... Running depmod. Running mkinitramfs-kpkg. Not updating initrd symbolic links since we are being updated/reinstalled (2.6.26-19lenny1 was configured last, according to dpkg) Not updating image symbolic links since we are being updated/reinstalled (2.6.26-19lenny1 was configured last, according to dpkg) Running postinst hook script update-grub. Searching for GRUB installation directory ... found: /boot/grub Searching for default file ... found: /boot/grub/default Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst Searching for splash image ... none found, skipping ... Found kernel: /boot/vmlinuz-2.6.26-2-686 Updating /boot/grub/menu.lst ... done Configurando kdelibs-data (4:3.5.10.dfsg.1-0lenny3) ... Configurando kdelibs4c2a (4:3.5.10.dfsg.1-0lenny3) ... Configurando libnspr4-0d (4.7.1-5) ... Configurando pidgin-data (2.4.3-4lenny5) ... Configurando libpurple0 (2.4.3-4lenny5) ... Configurando linux-headers-2.6.26-2-common (2.6.26-19lenny2) ... Configurando linux-headers-2.6.26-2-686 (2.6.26-19lenny2) ... Configurando linux-libc-dev (2.6.26-19lenny2) ... Configurando pidgin (2.4.3-4lenny5) ... Procesando disparadores para menu ... pc-caliope:/home/caliope#
Como se puede observar además de actualizar el núcleo el proceso de actualización configura, si es necesario, el GRUB y las opciones de arranque, y usa los comandos depmod y mkinitramfs con el fin de generar automáticamente la postconfiguración generarando el initramfs y modules.dep para cargar los
módulos. 2 Instalar el código fuente del núcleo de la versión actual o de una nueva si existe, configurarlo para seleccionar únicamente el hardware disponible. En el informe se habrá de indicar qué se ha incluido. Decidir que será configurado con el núcleo y que será cargado como módulo en el momento del boot. No olvidarse de compilar los módulos. Finalmente realizar una instalación y arrancar el nuevo núcleo.
Como es costumbre en GNU/Linux existen varias formas de hacer lo mismo, unas mas complejas otras mas sencillas, en lo personal nunca había tratado de compilar un kernel ni de agregar algún modulo porque nunca lo necesite y además siempre me pareció algo complejo, claro está GNU/Linux ha evolucionado bastante desde entonces y ahora cuenta con herramientas para facilitarnos el trabajo, entre ellas la forma de compilar el kernel a la manera Debian (Debian Way, obviamente funciona en Debian y sus derivados). Para este caso: Preparar el ambiente, para lo cual se instalan los paquetes necesarios: pec2:~# apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential udev devhelp
Bajar el kernel de www.kernel.org. pec2:~#wget -t 1000 http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.6.tar.bz2
Copiar el kernel a compilar en la carpeta /usr/src y descomprimirlo. pec2:~# cp ~qwerty/linux-2.6.31.6.tar.bz2 /usr/src/ pec2:~# cd /usr/src pec2:/usr/src# tar -jxvf linux-2.6.31.6.tar.bz2 pec2:/usr/src# rm linux-2.6.31.6.tar.bz2 pec2:/usr/src# ln -s kernel-2.6.31.6 linux-2.6.31.6
Para comenzar con la configuración actual del kernel se puede obtener del archivo /boot/configxxxx, así: pec2:/usr/src# cd linux-2.6.31.6 pec2:/usr/src/linux-2.6.31.6# cp /boot/config-2.6.26-2-686 .config
Ahora se inicia alguna de las maneras de configurar el kernel: make config (es en modo de texto y va dirigiendo de acuerdo a preguntas), make menuconfig (menú de texto, requiere la librería ncurses) o make xconfig (menú gráfico, es necesario tener instalado Qt), para esta labor se escogió la segunda opción. pec2:/usr/src/linux-2.6.31.6# make menuconfig
La apariencia que tiene en la máquina virtual:
De esta forma se van seleccionando las opciones requeridas, en este caso particular se ha suprimido el soporte AX.25 ya que no se utiliza, como es una máquina virtual se ha dejado el soporte para raid teniendo en cuenta que se va usar en el taller mas adelante, no se ha dejado soporte para discos sata, ata, etc., se suprimieron varias características experimentales y como no usará wifi, mucho menos wimax también se deshabilitaron. Una vez se realicen estos cambios se proceden a utilizar los comandos para compilar el kernel: pec2:/usr/src/linux-2.6.31.6# make-kpkg clean pec2:/usr/src/linux-2.6.31.6# make-kpkg --initrd kernel-image kernel-headers
Durante la ejecución de estos comandos se presentaron dos errores relacionados con: la ausencia de la librería zlib1g-dev y con la versión de librería liddev, los cuales se solucionaron así: pec2:/usr/src/linux-2.6.31.6# apt-get install zlib1g-dev pec2:/usr/src/linux-2.6.31.6# vi Documentation/lguest/Makefile Cambiar la linea 7 all: lguest a: all:
El comando make-kpkg realmente es un comando Debian que nos facilita la vida, lo que hace es compilar el kernel y con el generar un paquete .deb que al momento de
instalarlo ubica todos los archivos en su lugar, con la opción --initrd genera el initramfs correspondiente, etc., de esta manera obtenemos dos paquetes .deb: linux-headers-2.6.31.6_2.6.31.6-10.00.Custom_i386.deb, linuximage-2.6.31.6_2.6.31.6-10.00.Custom_i386.deb en el directorio /usr/src, uno es el kernel como tal y el otro son los headers. Procedemos a instalar los paquetes generados: pec2:/usr/src# dpkg -i linux-image-2.6.31.6_2.6.31.6-10.00.Custom_i386.deb Seleccionando el paquete linux-image-2.6.31.6 previamente no seleccionado. (Leyendo la base de datos ... 104765 ficheros y directorios instalados actualmente.) Desempaquetando linux-image-2.6.31.6 (de linux-image-2.6.31.6_2.6.31.6-10.00.Custom_i386.deb) ... Done. Configurando linux-image-2.6.31.6 (2.6.31.6-10.00.Custom) ... Running depmod. Finding valid ramdisk creators. Using mkinitramfs-kpkg to build the ramdisk. Running postinst hook script update-grub. Searching for GRUB installation directory ... found: /boot/grub Searching for default file ... found: /boot/grub/default Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst Searching for splash image ... none found, skipping ... Found kernel: /boot/vmlinuz-2.6.31.6 Found kernel: /boot/vmlinuz-2.6.26-2-686 Updating /boot/grub/menu.lst ... done
De la salida de este comando se puede ver que se instala el kernel, se genera el initramfs con el comando mkinitrd-kpkg, se actualiza el bootloader, en este caso Grub, etc. En el siguiente arranque en el menú de Grub se puede observar el nuevo kernel con el cual se arrancará por defecto y opcionalmente se podrá arrancar con el anterior.
3 Sobre el nuevo núcleo realizar un análisis de los módulos cargados, aspectos básicos de funcionamiento y que mejoras ha aportado esta nueva compilación del núcleo: medida del mismo, adecuación al HW disponible, inclusión/no inclusión de aspectos de seguridad, etc.
Como se puede observar en la siguiente gráfica:
El tamaño de la imagen disminuyo de 6,2 Mb a 4,1 Mb. La cantidad de módulos cargados también disminuyó de 56 a 38, esto se revisó con el comando lsmod | wc -l.
4 Hacer un análisis detallado de initramfs -sustitución de la initrd en núcleos de versiones anteriores-. Indicar funciones cumple, qué incluye, como se genera, como se carga y que ventajas tiene y decidir si el núcleo configurado al paso 3) lo ha de incluir o no. Si la respuesta es afirmativa repetir el paso 3). En caso negativo justificar la respuesta.
El proceso de arranque del GNU/Linux está conformado por: 1. BIOS: En esta fase del inicio de una máquina realmente es independiente del sistema operativo que tenga, básicamente lo que hace es inicializar la pantalla y el teclado, tomar la fecha de la CMOS, comprobar la memoria RAM y reconocer el disco duro principal. Una vez terminada pasa el control al cargador de arranque (MBR) 2. MBR: El cargador de arranque son los primeros 512 bytes del disco principal, estos son transferidos a la memoria. En estos 512 bytes están almacenados el boot loader, la tabla de particiones y un numero mágico de comprobación, el objetivo de este es iniciar el boot loader. 3. BOOT LOADER: En el caso de GNU/Linux los mas conocidos son: LILO, Grub, syslinux, isolinux, etc., es el encargado de arrancar el sistema operativo en sí, para lo cual monta un sistema de archivos en ram en el cual se ejecuta un reducido núcleo con los módulos imprescindibles para el arranque, desde este sistema se inicia el sistema operativo en espacio del usuario. Este reducido núcleo arranca un proceso INIT (proceso padre de todos los procesos en GNU/Linux) que se ejecuta en memoria y un sistema de archivos (File System) en memoria RAM, de ahí el nombre INITRAMFS. 4. INIT en INITRAMFS: Este reducido sistema es el encargado de montar el resto de controladores necesarios para que funcione el sistema operativo y lanzar el INIT en espacio del usuario. Si este proceso fluye sin errores INIT pasa a ejecutarse en el sistema de archivos real. 5. INIT: Continúa con la carga de procesos acuerdo /etc/inittab. En conclusión INITRAMFS es pequeño sistema de archivos contenido en un archivo comprimido que contiene lo necesario para que se ejecute el núcleo y programas antes que se monte el sistema de archivos raíz. Con el comando mkinitrd se genera el initramfs.
II PARTE II MÓDULO 5: Administración Local. 1 Instalar un servidor de impresión accesible desde una red local, en la que pueden coexistir ordenadores con sistemas operativos diferentes. Desarrollar un script que se ejecute cada día a las 2h13m de la mañana. Este script debe calcular el número de páginas impresas, haciendo el total diario por cada usuario y por cada impresora configurada.
Para este ejercicio se ha instalado y configurado CUPS, el cual fue instalado y configurado durante la instalación del sistema, pero de ser necesario se puede utilizar cualquier manejador de paquetes como apt-get o aptitude, su configuración es bastante sencilla a través de una interfaz web al puerto 631 aunque como siempre en Linux hay mas formas de hacerlo incluso manualmente editando los archivos de configuración, este servidor se puede compartir con Windows® por medio de SAMBA. Para lograr lo solicitado en el enunciado nos valdremos del archivo page_log (/var/log/cups/page_log) que es un archivo de log de CUPS donde va registrando las paginas que va imprimiendo por impresora y por usuario, cada línea de este archivo contiene: impresora
usuario
#trabajo
[fecha y hora]
Nº Pag. Copias – Máquina
Por ejemplo: pc-caliope:/home/caliope# cat /var/log/cups/page_log prueba_ pdf caliope 9 [17/Nov/2009:22:13:41 prueba_pdf caliope 9 [17/Nov/2009:22:13:41 prueba_pdf caliope 9 [17/Nov/2009:22:13:41 prueba_pdf caliope 9 [17/Nov/2009:22:13:41 prueba_pdf caliope 9 [17/Nov/2009:22:13:41 prueba_pdf caliope 9 [17/Nov/2009:22:13:41 prueba_pdf caliope 10 [17/Nov/2009:22:23:26 prueba_pdf caliope 10 [17/Nov/2009:22:23:26 impresora1 caliope 11 [18/Nov/2009:11:22:06 impresora1 caliope 11 [18/Nov/2009:11:22:06 impresora2 caliope 12 [18/Nov/2009:11:22:18 impresora2 caliope 12 [18/Nov/2009:11:22:18 impresora2 caliope 12 [18/Nov/2009:11:22:18 impresora2 caliope 12 [18/Nov/2009:11:22:18 impresora3 caliope 13 [18/Nov/2009:11:22:34 impresora3 caliope 13 [18/Nov/2009:11:22:34
-0500] -0500] -0500] -0500] -0500] -0500] -0500] -0500] -0500] -0500] -0500] -0500] -0500] -0500] -0500] -0500]
1 2 3 4 5 6 1 2 1 2 1 2 3 4 1 2
1 1 1 1 1 1 3 3 3 3 3 3 3 3 1 1
-
localhost localhost localhost localhost localhost localhost localhost localhost localhost localhost localhost localhost localhost localhost localhost localhost
La solución propuesta consta de tres elementos: ●
Un script que procesa el archivo escogiendo los trabajos desde una fecha dada, porque el archivo puede contener trabajos que son muy antiguos y no nos interesan.
●
Un script que ejecuta el anterior y envía su salida por correo.
●
Agregar la tarea a cron.
El primer script tiene como opciones si el reporte se imprimirá agrupado por impresoras o por usuarios y se le pasará como argumento la fecha desde la cual tendrá en cuenta el registro para el reporte. Archivo /home/caliope/maestria_semestreII/admon_avanzada_so/scripts/sum_impresion.sh #!/bin/bash #########################DEFININICION VARIABLES##################### USO=" \n Este script imprime un reporte sumarizando las impresiones realizadas por el servidor clasificado por impresoras o usuarios. Desde la fecha suministrada.\n\n Uso: \tsum_impresion.sh -h\n \tsum_impresion.sh -[i|u] dd/mm/aaaa hh:mm:ss\n\n \t-h \t\tImprime esta ayuda\n \t-i \t\tImprime el reporte clasificado por impresoras\n \t-u \t\tImprime el reporte clasificado por usuarios\n " LOGCUPS=/var/log/cups/page_log PROG=/usr/bin/awk ##########################DEFININICION VARIABLES##################### FECHA=(${2//\// }) HORA=(${3//:/ }) FECHACADENA="${FECHA[2]}-${FECHA[1]}-${FECHA[0]} ${HORA[0]}:${HORA[1]}:${HORA[2]}"; TS=`date +%s --utc -d"$FECHACADENA"` case $1 in -i) $PROG ' function tiempounix (ano, mes, dia, horas, minutos,segundos) { diasbis=int((ano-1968)/4); esbis=(ano-1968)%4; if (esbis == 0 && mes < 3) diasbis=diasbis-1; dias=((ano-1970)*365)+diasmes[mes]+dia+diasbis-1; ut=(((dias* 24)+horas)*60+minutos)*60+segundos; return ut; } BEGIN { print "REPORTE DE IMPRESIONES ORDENADO POR IMPRESORA"; print; diasmes["Ene"] = 0; diasmes["Feb"] = 31; diasmes["Mar"] = 59; diasmes["Abr"] = 90; diasmes["May"] = 120; diasmes["Jun"] = 151; diasmes["Jul"] = 181; diasmes["Ago"] = 212; diasmes["Sep"] = 243; diasmes["Oct"] = 273; diasmes["Nov"] = 304; diasmes["Dic"] = 334; } { pos = index($4, ":"); fechacad = substr($4, 2, pos-2); horacad = substr($4, pos+1); split(fechacad, fecha, "/"); split(horacad, hora, ":"); tiem_u=tiempounix(fecha[3],fecha[2],fecha[1],hora[1],hora[2],hora[3]); if (tiem_u >= '$TS')
{
total = total + $7; impresora[$1] = impresora[$1] + $7; usuarios[$2] = " "; imp_usuario[$1, $2] = imp_usuario[$1, $2] + $7;
} } END { for (i in impresora) { print "Impresora: " i; print "usuarios"; for (j in usuarios) printf("\t%-12s\t\t\t%d\n", j, imp_usuario[i, j]); printf("\t\tTotal\t\t%i\n\n",impresora[i]) } printf("Total impresiones:\t%i\n", total) }' $LOGCUPS ;; -u) $PROG ' function tiempounix (ano, mes, dia, horas, minutos,segundos) { diasbis=int((ano-1968)/4); esbis=(ano-1968)%4; if (esbis == 0 && mes < 3) diasbis=diasbis-1; dias=((ano-1970)*365)+diasmes[mes]+dia+diasbis-1; ut=(((dias* 24)+horas)*60+minutos)*60+segundos; return ut; } BEGIN { print "REPORTE DE IMPRESIONES ORDENADO POR USUARIO"; print; diasmes["Ene"] = 0; diasmes["Feb"] = 31; diasmes["Mar"] = 59; diasmes["Abr"] = 90; diasmes["May"] = 120; diasmes["Jun"] = 151; diasmes["Jul"] = 181; diasmes["Ago"] = 212; diasmes["Sep"] = 243; diasmes["Oct"] = 273; diasmes["Nov"] = 304; diasmes["Dic"] = 334; } { pos = index($4, ":"); fechacad = substr($4, 2, pos-2); horacad = substr($4, pos+1); split(fechacad, fecha, "/"); split(horacad, hora, ":"); tiem_u=tiempounix(fecha[3],fecha[2],fecha[1],hora[1],hora[2],hora[3]); if (tiem_u >= '$TS') { total = total + $7; usuario[$2] = usuario[$2] + $7; impresoras[$1] = " "; usuario_imp[$2, $1] = usuario_imp[$2, $1] + $7; } } END { for (i in usuario) { print "Usuario: " i; print "impresoras"; for (j in impresoras) printf("\t%-12s\t\t\t%d\n", j, usuario_imp[i, j]); printf("\t\tTotal\t\t%i\n\n",usuario[i]) } printf("Total impresiones:\t%i\n", total) }' $LOGCUPS ;; -h) echo -e $USO ;; *) echo "Parรกmetros invรกlidos" echo -e $USO
esac echo -e "Generado el" `date`
El segundo script simplemente ejecuta el anterior pasándole como argumento la fecha y hora en que se ejecuta el script menos un día, de manera tal que sólo seleccionará los trabajos realizados durante las últimas 24 horas y el resultado lo envía por correo, además lo ejecuta una vez agrupado por impresoras y la otra por usuario de manera tal que llegarán dos correos. Archivo /home/caliope/maestria_semestreII/admon_avanzada_so/scripts/impresion_cron.sh #!/bin/bash PROG="/home/caliope/maestria_semestreII/admon_avanzada_so/scripts/sum_impresion.sh" DIRCORREO="caliope" MAIL="/usr/bin/mail" FECHACADENA=`date +"%d %m %Y %H %M %S"` FECHA=(${FECHACADENA//\// }) let "FECHA[0] = ${FECHA[0]} - 1" FECHACADENA="${FECHA[0]}/${FECHA[1]}/${FECHA[2]} ${FECHA[3]}:${FECHA[4]}:${FECHA[5]}" ASUNTO="Reporte impresion $FECHACADENA por impresora" $PROG -i $FECHACADENA | $MAIL "$ASUNTO" $DIRCORREO &> /dev/null ASUNTO="Reporte impresion $FECHACADENA por usuario" $PROG -u $FECHACADENA | $MAIL "$ASUNTO" $DIRCORREO &> /dev/null
Finalmente para que se ejecute diariamente se programa la ejecución del ultimo script con CRON, mediante el comando crontab -e agregando la siguiente línea:
pc-caliope:/home/caliope# crontab -e # m h dom mon dow command 13 2 * * * /home/caliope/maestria_semestreII/admon_avanzada_so/scripts/impresion_cron.sh
Para verificar se crearon tres impresoras virtuales pdf y desde tres usuarios locales se mandaron varios trabajos de impresión y la ejecución del comando se programo a las 22:15, el resultado obtenido fue:
Ilustraci贸n 1: Lectura con mutt del primer correo recibido con el reporte ordenado por impresoras.
Ilustración 2: Lectura con mutt del segundo correo recibido con el reporte ordenado por impresoras.
2 En este ejercicio, crearemos una unidad RAID-1, o sea de dos unidades de disco configurados por hacer mirroring.
●
Se pueden emplear dos pendrives en un ordenador físico, o bien dos discos duros virtuales en una máquina virtual. No hace falta que tengan una capacidad demasiada elevada: con unos cuántos MB será suficiente, por ejemplo 128 MB.
●
Crear y formatear una partición RAID-1 en estas dos unidades. Configurar la máquina porque lo monte automáticamente, en una ubicación y de manera tal que los usuarios sin derechos de administración la puedan usar y grabar documentos.
●
Empezar a hacer una copia de un fichero algo grande, parar la máquina y retirar físicamente uno de los dos dispositivos (o desconectar un en caso de usar una
máquina virtual). Con esta acción estamos simulando un fallo físico de una unidad de disco. Volver a arrancar, y comprobar la accesibilidad e integridad de los datos al dispositivo que queda. ●
Documentarse sobre el procedimiento a llevar a término por reemplazar la unidad de disco y volver a construir la tabla RAID completa.
Los pasos a seguir para montar el arreglo de discos en raid1 son básicamente: 1. Instalar mdadm (Multidisk Administrator) que es el software que nos permite administrar en GNU/Linux los arreglos de discos. 2. Preparar los discos con particiones del mismo tamaño y el tipo de partición cambiarlo a “fd” que es el tipo de partición para arreglos. 3. Con mdadm crear el arreglo. 4. Formatear el nuevo dispositivo. 5. Crear un punto de montaje. 6. Configurar el arreglo para que arranque en /etc/mdadm/mdadm.conf 7. Agregar el dispositivo en el archivo /etc/fstab para que el montaje se automático. Para el desarrollo de este numeral he decidido utilizar una máquina virtual a la cual se le instalará Debian Lenny, a continuación en la imagen se muestra la configuración de la máquina virtual, configurada inicialmente con los disco virtuales pec2.vdi, donde se instalará el sistema, raid1.vdi y raid2.vdi para configurar el raid:
Ilustración 3: Configuración máquina virtual
Instalación de mdadm pec2:/home/qwerty# apt-get install mdadm Leyendo lista de paquetes... Hecho Creando árbol de dependencias Leyendo la información de estado... Hecho Se instalarán los siguientes paquetes NUEVOS: mdadm 0 actualizados, 1 se instalarán, 0 para eliminar y 1 no actualizados. Se necesita descargar 0B/272kB de archivos. Se utilizarán 791kB de espacio de disco adicional después de esta operación. Cambio de medio: Por favor inserte el disco etiquetado 'Debian GNU/Linux 5.0.1 _Lenny_ - Official i386 DVD Binary-1 20090413-00:33' en la unidad '/cdrom/' y presione Intro Preconfigurando paquetes ... Seleccionando el paquete mdadm previamente no seleccionado. (Leyendo la base de datos ... 89454 ficheros y directorios instalados actualmente.) Desempaquetando mdadm (de .../mdadm/mdadm_2.6.7.2-1_i386.deb) ... Procesando disparadores para man-db ... Configurando mdadm (2.6.7.2-1) ... Generating array device nodes... done. Generating mdadm.conf... done. update-initramfs: deferring update (trigger activated) Starting MD monitoring service: mdadm --monitor. Assembling MD arrays...done (no arrays found in config file or automatically). Procesando disparadores para initramfs-tools ... update-initramfs: Generating /boot/initrd.img-2.6.26-2-686 W: mdadm: /etc/mdadm/mdadm.conf defines no arrays. W: mdadm: no arrays defined in configuration file.
Formateo de las unidades con las que se configurará el arreglo, que en este caso son las hdb y hdd. pec2:/home/qwerty# fdisk -l Disco /dev/hda: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = cilindros of 16065 * 512 = 8225280 bytes Disk identifier: 0x00076d86 Disposit. Inicio /dev/hda1 * /dev/hda2 /dev/hda5
Comienzo Fin Bloques Id Sistema 1 993 7976241 83 Linux 994 1044 409657+ 5 Extendida 994 1044 409626 82 Linux swap / Solaris
Disco /dev/hdb: 1073 MB, 1073741824 bytes 16 heads, 63 sectors/track, 2080 cylinders Units = cilindros of 1008 * 512 = 516096 bytes Disk identifier: 0x00000000 El disco /dev/hdb no contiene una tabla de particiones válida Disco /dev/hdd: 1073 MB, 1073741824 bytes 16 heads, 63 sectors/track, 2080 cylinders Units = cilindros of 1008 * 512 = 516096 bytes Disk identifier: 0x00000000 El disco /dev/hdd no contiene una tabla de particiones válida pec2:/home/qwerty# fdisk /dev/hdb El dispositivo no contiene una tabla de particiones DOS válida ni una etiqueta de disco Sun o SGI o OSF Building a new DOS disklabel with disk identifier 0x6c6bcfcf. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable.
El número de cilindros para este disco está establecido en 2080. No hay nada malo en ello, pero es mayor que 1024, y en algunos casos podría causar problemas con: 1) software que funciona en el inicio (p.ej. versiones antiguas de LILO) 2) software de arranque o particionamiento de otros sistemas operativos (p.ej. FDISK de DOS, FDISK de OS/2) Atención: el indicador 0x0000 inválido de la tabla de particiones 4 se corregirá mediante w(rite) Orden (m para obtener ayuda): n Acción de la orden e Partición extendida p Partición primaria (1-4) p Número de partición (1-4): 1 Primer cilindro (1-2080, valor predeterminado 1): Se está utilizando el valor predeterminado 1 Último cilindro o +tamaño o +tamañoM o +tamañoK (1-2080, valor predeterminado 2080): Se está utilizando el valor predeterminado 2080 Orden (m para obtener ayuda): t Se ha seleccionado la partición 1 Código hexadecimal (escriba L para ver los códigos): fd Se ha cambiado el tipo de sistema de la partición 1 por fd (Linux raid autodetect) Orden (m para obtener ayuda): p Disco /dev/hdb: 1073 MB, 1073741824 bytes 16 heads, 63 sectors/track, 2080 cylinders Units = cilindros of 1008 * 512 = 516096 bytes Disk identifier: 0x6c6bcfcf Disposit. Inicio /dev/hdb1
Comienzo Fin Bloques Id Sistema 1 2080 1048288+ fd Linux raid autodetect
Orden (m para obtener ayuda): w ¡Se ha modificado la tabla de particiones! Llamando a ioctl() para volver a leer la tabla de particiones. Se están sincronizando los discos. pec2:/home/qwerty# fdisk /dev/hdc No se puede abrir /dev/hdc pec2:/home/qwerty# fdisk /dev/hdd El dispositivo no contiene una tabla de particiones DOS válida ni una etiqueta de disco Sun o SGI o OSF Building a new DOS disklabel with disk identifier 0x708a48de. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. El número de cilindros para este disco está establecido en 2080. No hay nada malo en ello, pero es mayor que 1024, y en algunos casos podría causar problemas con: 1) software que funciona en el inicio (p.ej. versiones antiguas de LILO) 2) software de arranque o particionamiento de otros sistemas operativos (p.ej. FDISK de DOS, FDISK de OS/2) Atención: el indicador 0x0000 inválido de la tabla de particiones 4 se corregirá mediante w(rite) Orden (m para obtener ayuda): n Acción de la orden e Partición extendida p Partición primaria (1-4) p Número de partición (1-4): 1 Primer cilindro (1-2080, valor predeterminado 1): Se está utilizando el valor predeterminado 1
Último cilindro o +tamaño o +tamañoM o +tamañoK (1-2080, valor predeterminado 2080): Se está utilizando el valor predeterminado 2080 Orden (m para obtener ayuda): t Se ha seleccionado la partición 1 Código hexadecimal (escriba L para ver los códigos): fd Se ha cambiado el tipo de sistema de la partición 1 por fd (Linux raid autodetect) Orden (m para obtener ayuda): p Disco /dev/hdd: 1073 MB, 1073741824 bytes 16 heads, 63 sectors/track, 2080 cylinders Units = cilindros of 1008 * 512 = 516096 bytes Disk identifier: 0x708a48de Disposit. Inicio /dev/hdd1
Comienzo Fin Bloques Id Sistema 1 2080 1048288+ fd Linux raid autodetect
Orden (m para obtener ayuda): w ¡Se ha modificado la tabla de particiones! Llamando a ioctl() para volver a leer la tabla de particiones. Se están sincronizando los discos.
Creación del arreglo de discos. pec2:/home/qwerty# mdadm --create /dev/md0 --verbose --level=1 --raid-devices=2 /dev/hdb1 /dev/hdd1 mdadm: size set to 1048192K mdadm: array /dev/md0 started.
Creación del punto de montaje para montar el arreglo de discos, formateo del arreglo de discos, configuración de mdadm.conf para que el arreglo sea iniciado con el arranque del equipo y edición del archivo /etc/fstab para que el arreglo sea montado al sistema de archivo con el inicio. pec2:/home/qwerty# mkdir /media/raid pec2:/home/qwerty# chmod ugo+w /media/raid pec2:/home/qwerty# mkfs -T ext3 /modnta/md0 mke2fs 1.41.3 (12-Oct-2008) Etiqueta del sistema de ficheros= Tipo de SO: Linux Tamaño del bloque=4096 (bitácora=2) Tamaño del fragmento=4096 (bitácora=2) 65536 nodos-i, 262048 bloques 13102 bloques (5.00%) reservados para el superusuario Primer bloque de datos=0 Número máximo de bloques del sistema de ficheros=268435456 8 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 Escribiendo las tablas de nodos-i: hecho Creating journal (4096 blocks): hecho Escribiendo superbloques y la información contable del sistema de ficheros: hecho Este sistema de ficheros se revisará automáticamente cada 28 montajes o 180 días, lo que suceda primero. Utilice tune2fs -c o -i para cambiarlo. pec2:/home/qwerty# echo "/dev/md0 /media/raid ext3 rw,user,auto /etc/fstab pec2:/home/qwerty# mount /media/raid pec2:/home/qwerty# df -h S.ficheros Tamaño Usado Disp Uso% Montado en
0
1" >>
/dev/hda1 7,5G 2,6G 4,7G 36% / tmpfs 253M 0 253M 0% /lib/init/rw udev 10M 100K 10M 1% /dev tmpfs 253M 0 253M 0% /dev/shm /dev/hdc 4,4G 4,4G 0 100% /media/cdrom0 /dev/md0 1008M 18M 940M 2% /media/raid pec2:/home/qwerty# cd /etc/mdadm pec2:/etc/mdadm# cp mdadm.conf mdadm.conf.`date +%y%m%d` pec2:/etc/mdadm# mdadm --detail --scan >> mdadm.conf pec2:/etc/mdadm# cat mdadm.conf # mdadm.conf # # Please refer to mdadm.conf(5) for information about this file. # # by default, scan all partitions (/proc/partitions) for MD superblocks. # alternatively, specify devices to scan, using wildcards if desired. DEVICE partitions # auto-create devices with Debian standard permissions CREATE owner=root group=disk mode=0660 auto=yes # automatically tag new arrays as belonging to the local system HOMEHOST <system> # instruct the monitoring daemon where to send mail alerts MAILADDR root # definitions of existing MD arrays # This file was auto-generated on Sat, 21 Nov 2009 14:01:43 -0500 # by mkconf $Id$ ARRAY /dev/md0 level=raid1 num-devices=2 UUID=39608f32:a84a8bcb:11b1dfeb:60704b86
metadata=00.90
Comprobación del arreglo: con el comando df -h se observa que /dev/mdo (el arreglo) está montado en /media/raid y con el contenido de /proc/mdstat se puede comprobar que las particiones hdb1 y hdd1 conforman el arreglo md0 configurado como raid1, además con el [UU] significa que las dos estan cargadas y sincronizadas. pec2:/home/qwerty# df -h S.ficheros Tamaño Usado Disp Uso% Montado en /dev/hda1 7,5G 2,6G 4,7G 36% / tmpfs 253M 0 253M 0% /lib/init/rw udev 10M 100K 10M 1% /dev tmpfs 253M 0 253M 0% /dev/shm /dev/md0 1008M 18M 940M 2% /media/raid pec2:/home/qwerty# cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 hdb1[0] hdd1[1] 1048192 blocks [2/2] [UU] unused devices: <none>
Se reinicia el sistema con el fin de comprobar si los cambios realizados quedan de manera permanente, como se puede observar durante el inicio del sistema después de iniciar el kernel nos presenta el mensaje de mdadm indicando que ha encontrado el arreglo md0 compuesto por dos discos y los dos discos están activos.
Para verificar el funcionamiento del mirroring, se crearán dos archivos con contenido aleatorio en el raid (random1 y random2) de 54 Mb y 108 Mb respectivamente y con el comando md5sum se obtendrá un hash de cada archivo para poder comprobar su integridad cuando se realicen los cambios de discos. Todo esto se realizará con un usuario sin privilegios administrativos con el fin de comprobar que haya quedado configurado acuerdo a lo indicado. qwerty@pec2:~$ dd if=/dev/urandom of=/media/raid/random1 count=104800 104800+0 records in 104800+0 records out 53657600 bytes (54 MB) copied, 19,9553 s, 2,7 MB/s qwerty@pec2:~$ dd if=/dev/urandom of=/media/raid/random2 count=209600 209600+0 records in 209600+0 records out 107315200 bytes (107 MB) copied, 37,3906 s, 2,9 MB/s qwerty@pec2:~$ md5sum /media/raid/random1 811bea0cb90cdce3a5ccfb5f049190f1 /media/raid/random1 qwerty@pec2:~$ md5sum /media/raid/random2 361469ed7836bc1acdbb6db90666dc22 /media/raid/random2 qwerty@pec2:~$
A continuación se simula un fallo en la máquina eliminando el disco raid2.vdi que corresponde a hdb, como se puede apreciar en la ilustración.
Al iniciar la mรกquina nuevamente no informa del fallo y que el arreglo se montarรก con un solo disco:
Con fdisk se evidencia la ausencia de hdb. pec2:/home/qwerty# fdisk -l Disco /dev/hda: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = cilindros of 16065 * 512 = 8225280 bytes Disk identifier: 0x00076d86 Disposit. Inicio /dev/hda1 * /dev/hda2 /dev/hda5
Comienzo Fin Bloques Id Sistema 1 993 7976241 83 Linux 994 1044 409657+ 5 Extendida 994 1044 409626 82 Linux swap / Solaris
Disco /dev/hdd: 1073 MB, 1073741824 bytes 16 heads, 63 sectors/track, 2080 cylinders Units = cilindros of 1008 * 512 = 516096 bytes Disk identifier: 0x708a48de Disposit. Inicio /dev/hdd1
Comienzo Fin Bloques Id Sistema 1 2080 1048288+ fd Linux raid autodetect
Disco /dev/md0: 1073 MB, 1073348608 bytes 2 heads, 4 sectors/track, 262048 cylinders Units = cilindros of 8 * 512 = 4096 bytes Disk identifier: 0x00000000 El disco /dev/md0 no contiene una tabla de particiones válida
Aún así, el usuario que no cuenta con privilegios administrativos tiene disponible /dev/md0 montado en /media/raid y si se obtiene el hash de los archivos con el comando md5sum se puede comprobar que son idénticos a los obtenidos anteriormente confirmando que el contenido no se ha variado; además mediante /proc/mdstat se puede constatar que falta un disco en el arreglo. qwerty@pec2:~$ df -h S.ficheros Tamaño Usado Disp Uso% Montado en /dev/hda1 7,5G 2,6G 4,7G 36% / tmpfs 253M 0 253M 0% /lib/init/rw udev 10M 92K 10M 1% /dev tmpfs 253M 0 253M 0% /dev/shm /dev/md0 1008M 171M 786M 18% /media/raid qwerty@pec2:~$ cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 hdd1[1] 1048192 blocks [2/1] [_U] unused devices: <none> qwerty@pec2:~$ md5sum /media/raid/random1 811bea0cb90cdce3a5ccfb5f049190f1 /media/raid/random1 qwerty@pec2:~$ md5sum /media/raid/random2 361469ed7836bc1acdbb6db90666dc22 /media/raid/random2
A continuación se instalará otro disco (raid3.vdi) reemplazará el hdb anterior y se realizará la recuperación del arreglo. En la ilustración se puede observar los discos en la máquina virtual.
Con fdisk se comprueba que el disco hdb no tiene formato: pec2:/home/qwerty# fdisk -l Disco /dev/hda: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = cilindros of 16065 * 512 = 8225280 bytes Disk identifier: 0x00076d86 Disposit. Inicio /dev/hda1 * /dev/hda2 /dev/hda5
Comienzo Fin Bloques Id Sistema 1 993 7976241 83 Linux 994 1044 409657+ 5 Extendida 994 1044 409626 82 Linux swap / Solaris
Disco /dev/hdb: 1073 MB, 1073741824 bytes 16 heads, 63 sectors/track, 2080 cylinders Units = cilindros of 1008 * 512 = 516096 bytes Disk identifier: 0x00000000 El disco /dev/hdb no contiene una tabla de particiones vรกlida Disco /dev/hdd: 1073 MB, 1073741824 bytes 16 heads, 63 sectors/track, 2080 cylinders Units = cilindros of 1008 * 512 = 516096 bytes Disk identifier: 0x708a48de Disposit. Inicio /dev/hdd1
Comienzo Fin Bloques Id Sistema 1 2080 1048288+ fd Linux raid autodetect
Disco /dev/md0: 1073 MB, 1073348608 bytes 2 heads, 4 sectors/track, 262048 cylinders Units = cilindros of 8 * 512 = 4096 bytes Disk identifier: 0x00000000 El disco /dev/md0 no contiene una tabla de particiones vรกlida
En lineas generales lo que se hace es marcar el dispositivo hdb como que está fallando con el comando mdadm y la opción --fail, después de esto es necesario crear una partición del mismo tamaño y tipo en el nuevo disco, lo cual se realiza con sfdisk que nos permite copiar la tabla de particiones del disco hdd (el que está funcionando en el arreglo) en hdb, después con el comando mdadm y la opción --add se agrega el disco nuevo al arreglo y automáticamente mdadm comenzará la recuperación de los datos, lo cual se puede verificar mediante el contenido de /proc/mdstat. pec2:/home/qwerty# mdadm --manage /dev/md0 --fail /dev/hdb1 pec2:/home/qwerty# sfdisk -d /dev/hdd | sfdisk /dev/hdb Comprobando que nadie esté utilizando este disco en este momento... Correcto Disco /dev/hdb: 2080 cilindros, 16 cabezas, 63 sectores/pista sfdisk: ERROR: el sector 0 no tiene una firma msdos /dev/hdb: tipo de tabla de particiones no reconocido Situación anterior: No se ha encontrado ninguna partición Situación nueva: Unidades = sectores de 512 bytes, contando desde 0 Disp. Inicio Principio Fin Nº sect. Id Sistema /dev/hdb1 63 2096639 2096577 fd Linux raid autodetect /dev/hdb2 0 0 0 Vacía /dev/hdb3 0 0 0 Vacía /dev/hdb4 0 0 0 Vacía Atención: no hay ninguna partición primaria marcada como iniciable (activa). Esto no es problema para LILO, pero el MBR de DOS no iniciará con este disco. La nueva tabla de particiones se ha escrito correctamente Volviendo a leer la tabla de particiones... Si ha creado o modificado una partición DOS, como /dev/foo7, utilice dd(1) para poner a cero los 512 primeros bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1 (Véase fdisk(8).) pec2:/home/qwerty# mdadm --manage /dev/md0 --add /dev/hdb1 mdadm: metadata format 00.90 unknown, ignored. mdadm: added /dev/hdb1 pec2:/home/qwerty# cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 hdb1[2] hdd1[1] 1048192 blocks [2/1] [_U] [=========>...........] recovery = 49.1% (516032/1048192) finish=0.4min speed=19112K/sec unused devices: <none> pec2:/home/qwerty# cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 hdb1[2] hdd1[1] 1048192 blocks [2/1] [_U] [============>........] recovery = 61.2% (642944/1048192) speed=18795K/sec
finish=0.3min
unused devices: <none> pec2:/home/qwerty# cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 hdb1[2] hdd1[1] 1048192 blocks [2/1] [_U] [===============>.....] recovery = 76.4% (802688/1048192) finish=0.2min speed=16254K/sec unused devices: <none> pec2:/home/qwerty# cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 hdb1[0] hdd1[1]
1048192 blocks [2/2] [UU] unused devices: <none>
Una vez terminada la actualización se vuelve a comprobar que el contenido de los archivos no ha variado. qwerty@pec2:~$ md5sum /media/raid/random1 811bea0cb90cdce3a5ccfb5f049190f1 /media/raid/random1 qwerty@pec2:~$ md5sum /media/raid/random2 361469ed7836bc1acdbb6db90666dc22 /media/raid/random2
3 Escribir un script que permita hacer una copia de seguridad de ficheros de usuario, con las características siguientes:
●
Ejecución cada día, a las 4h13m.
●
Hace la copia tan sólo de los ficheros que se han modificado o añadido desde su última ejecución.
●
No hace la copia de ficheros que empiecen por “.”, “~”, o que acaben por “.bak” o bien que tengan más de 200 Mbytes de tamaño.
●
La copia se hace en el servidor nfs://192.168.0.1/backups .
●
Sólo se debe montar este directorio en el momento de hacer las copias, y desmontarla tras acabar. No tendrán acceso los usuarios normales.
Se asume que los datos de todos los usuarios se encuentran en /home, para el desarrollo de este script se realizarán los siguientes pasos: 1. Configurar el servidor nfs, el cual para efectos de pruebas se ha creado en la misma máquina. 2. Crear un script que ejecute lo solicitado mediante: a) Montar el disco nfs. b) Usando el comando find seleccionar los archivos pedidos y copiarlos a la carpeta nfs montada. c) Enviar un correo al adminstrador informando que archivos se copiaron. d) Desmontar la carpeta nfs. 3. Editar el crontab para que realice la tarea a la hora especificada. Para configurar el servidor de nfs, se instala el paquete nfs-kernel-server y se configura la carpeta a compartir en /etc/exports: pc-caliope:~# apt-get install nfs-kernel-server pc-caliope:~# echo “/home/caliope/backup localhost(rw,no_root_squash)” >> /etc/exports pc-caliope:~# cat /etc/exports # /etc/exports: the access control list for filesystems which may be exported # to NFS clients. See exports(5). #
# # # # # # #
Example for NFSv2 and NFSv3: /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) Example for NFSv4: /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check) /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
/home/caliope/backup
localhost(rw,no_root_squash)
El script: #!/bin/bash ######################DESCRIPCION SCRIPT########################### # # Este script realiza una copia de seguridad del directorio pasado como argumento en el # directorio especificado en CARPETAREMOTA el cual es una carpeta compartida con nfs, # copia los archivos seleccinados de acuerdo a los criterios dados conservando su estrutura # ####################DEFINICION VARIABLES############################ MOUNT="/bin/mount" UMOUNT="/bin/umount" FIND="/usr/bin/find" MAIL="/usr/bin/mail" CARPETAREMOTA="localhost:/home/caliope/backup" CARPETALOCAL="/media/backup" DIRMAIL="caliope" ASUNTO="Backup diario" ############################################################## #Monta la carpeta nfs $MOUNT -t nfs $CARPETAREMOTA $CARPETALOCAL # # # # # # # # # # # # # # # # # # # # # #
Con el comando find se selleccionan lo archivos a los que se les realizará copia de seguridad atendiendo los siguientes criterios de búsqueda: ! -name ".*" Usando el signo ! negamos el patron de busqueda en este caso se le indica al comando find seleccionar archivos que no comiencen con "." ! -name '~*' Se le indica al comando find seleccionar archivos que no comiencen con "~" ! -name '*.bak'Se le indica al comando find seleccionar archivos que no terminen con ".bak" ! -path '*\/\.*' Se le indica al comando find seleccionar archivos que no tengan en su ruta la secuencia de caracteres "/." lo que indica que es una carpeta oculta, así se evita hacer copia de archivos de estas carpetas. -size -200M Selecciona archivos de tamaño menor a 200Mb. -mtime -1 Archivos modificados en el último dia (24 horas) -tipe f Que seleccione solo archivos, es decir, omita los directorios. -exec Permite ejecutar un comando con el archivo hallado, aqui se le que haga una copia del archivo con el comando cp y la opcion --parents con el fin que se conserve la misma estructura de directorios que el sistema original. -print Se imprime la ruta completa del archivo y se direcciona con tubería (pipe) al comando mail.
eval "$FIND $1 ! -name '.*' \ ! -name '~*' \ ! -name '*.bak' \ ! -path '*\/\.*'\ -size -200M \ -mtime -1 \ -type f \ -exec cp --parents {} $CARPETALOCAL \\; \
-print" | $MAIL -s "$ASUNTO" $DIRMAIL #Se desmonta la carpeta nfs umount $CARPETALOCAL
Programar el cron: pc-caliope:/home/caliope# crontab -e # m h dom mon dow command 15 02 * * * /home/caliope/maestria_semestreII/admon_avanzada_so/scripts/impresion_cron.sh 13 04 * * * /home/caliope/maestria_semestreII/admon_avanzada_so/scripts/backup.sh /home crontab: installing new crontab