{"id":40,"date":"2013-06-06T18:13:21","date_gmt":"2013-06-06T18:13:21","guid":{"rendered":"http:\/\/0aps.zzl.org\/blog\/?p=40"},"modified":"2021-06-21T23:50:55","modified_gmt":"2021-06-21T23:50:55","slug":"introduccion-a-los-clusters-con-debian-y-kerrighed","status":"publish","type":"post","link":"https:\/\/0aps.me\/blog\/2013\/06\/06\/introduccion-a-los-clusters-con-debian-y-kerrighed\/","title":{"rendered":"Introducci\u00f3n a los clusters con Debian y Kerrighed"},"content":{"rendered":"<h1>Introducci\u00f3n<\/h1>\n<h2>Computaci\u00f3n Paralela y Distribuida<\/h2>\n<p>HPC es el acr\u00f3nimo de high performance computing, en espa\u00f1ol, computaci\u00f3n de alto rendimiento. Que una m\u00e1quina tenga alto rendimiento implica que posee una capacidad de c\u00e1lculo y procesamiento mayor que la media de las computadoras.<\/p>\n<p>Este campo del hpc pertenence a la computaci\u00f3n distribuida, el cual a la vez es un sub-conjunto de la computaci\u00f3n paralela y \u00e9sta de la ciencia computacional. En la computaci\u00f3n distribuida se utilizan un gran n\u00famero de ordenadores interconectados y estructurados en diferentes modelos para la resoluci\u00f3n de problemas que requieren una cantidad de procesamiento masiva, cosa que con equipos corriente e individuales, usualemtne tomar\u00eda una larga cantidad de tiempo.<\/p>\n<p>La computaci\u00f3n paralela es una forma de c\u00f3mputo en la que muchas instrucciones se ejecutan simult\u00e1neamente, operando sobre el principio de que problemas grandes, a menudo se pueden dividir en unos m\u00e1s peque\u00f1os, que luego son resueltos simult\u00e1neamente (en paralelo).<\/p>\n<h2>Clusters y Grids<\/h2>\n<p>Los clusters (racimos o conjunto en su traducci\u00f3n al espa\u00f1ol) de computadoras, son muy utilizados en la computaci\u00f3n distribuida pues nos permiten compilar la fuerza de procesamiento de varios equipos y utilizarlos en conjunto para distintas aplicaciones.<\/p>\n<p>Hay varios tipos de clusters seg\u00fan la forma en la cual se les estructure y los requisitos que cumplan, est\u00e1n:<\/p>\n<p>Los Clusters de Alto Rendimiento, los de Alta Disponibilidad y los de Alta Eficiencia.<\/p>\n<p>A nivel empresarial son muy utlizados los de alta disponibilidad y los de alta eficiencia cuando se necesita ofrecer un servicio que est\u00e9 disponible todo el tiempo, utlizando t\u00e9cnicas como Failover en donde si ocurre una falla en alg\u00fan equipo se migran los procesos que estaban corriendo en \u00e9ste hacia otro que est\u00e9 inutilizable.<\/p>\n<p>En las comunidades cient\u00edficas a nivel de investigaci\u00f3n se utilizan clusters de altos rendimientos pues se requiere gran capacidad de c\u00f3mputo para aplicaciones que van desde simulaciones del medio ambiente, biomedicina, f\u00edsica de part\u00edculas, estad\u00edsticas, criptograf\u00eda, etc.<\/p>\n<p>La computaci\u00f3n en grid o en malla es un nuevo paradigma de computaci\u00f3n distribuida en el cual todos los recursos de un n\u00famero indeterminado de computadoras son englobados para ser tratados como un \u00fanico superordenador de manera transparente.<\/p>\n<p>Estas computadoras englobadas no est\u00e1n conectadas o enlazadas firmemente, es decir no tienen por qu\u00e9 estar en el mismo lugar geogr\u00e1fico. Se puede tomar como ejemplo el proyecto SETI@Home, en el cual trabajan computadoras alrededor de todo el planeta para buscar vida extraterrestre.<\/p>\n<p>En un cluster todos los nodos se encuentran en el mismo lugar, conectados por una red local para as\u00ed englobar todos los recursos. En cambio, en un grid no tienen por qu\u00e9 estar en el mismo espacio geogr\u00e1fico; pueden estar en diferentes puntos del mundo.<\/p>\n<p>Para que un cl\u00faster funcione como tal, no basta solo con conectar entre s\u00ed los ordenadores, sino que es necesario proveer un sistema de manejo del cl\u00faster, el cual se encargue de interactuar con el usuario y los procesos que corren en \u00e9l para optimizar el funcionamiento.<br \/>\nEn nuestro caso utilizaremos un SSI.<\/p>\n<h2>SSI (Single Sistem Image)<\/h2>\n<p>Un sistema de una \u00fanica imagen es aqu\u00e9l que se encarga de darnos la sensaci\u00f3n de que todas las computadoras trabajan como una sola, proveyendo una capa de abstracci\u00f3n intermendia entre las aplicaciones y el sistema operativo de modo que se centralizen y compartan los recursos ejectuados. Como ejemplo tenemos:<\/p>\n<p>* Quantian<br \/>\n* BProc<br \/>\n* DragonFly BSD<br \/>\n* Genesis<br \/>\n* Kerrighed<br \/>\n* Mosix\/OpenMosix<br \/>\n* OpenSSI<br \/>\n* Plurix<br \/>\n* Scyld<br \/>\n* TruCluster<\/p>\n<h2>Implementando un Cluster (HPC) con Kerrighed<\/h2>\n<p>Debo decir de antemano que hay formas m\u00e1s f\u00e1ciles de montarse un cluster, simplificado todo el proceso al alcanze de dos o tres clicks de distancia. Sin embargo, el ensuciarse y hacer las cosas \u201cmanualmente\u201d siempre ayuda a aprender, y como hay una variopinta cantidad de protocolos que interact\u00faan el uno con el otro para llevar todo acabo resulta una experiencia gratificamente verlos en acci\u00f3n. Bien, empecemos.<\/p>\n<p>El cluster lo van a formar 2 m\u00e1quinas secundar\u00edas y el servidor principal. Usar\u00e9 Debian Squeeze como distribuci\u00f3n y Kerrighed como SSI. Sobra decir que el mismo procedimiento se aplica en otras distribuciones derivadas y no necesariamente tienen que ser 2 m\u00e1quinas, sino que son las que utilizo para ilustrar el turorial.(y son las que tengo en casa \ud83d\ude1b ) Ignoro si por igual todo funcione en m\u00e1quinas virtuales (pues no lo prob\u00e9) pero te\u00f3ricamente deber\u00eda funcionar si el proceso se lleva a cabo d manera correcta.<\/p>\n<p>Lo primero que haremos es construir una peque\u00f1a estructura en donde los nodos secundarios puedan iniciar desde la red (en vez del disco duro o la usb), todos conectados por medio de un peque\u00f1o swtich (al igual que el servidor).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/img13.imageshack.us\/img13\/9055\/estructuray.jpg\" alt=\"null\" width=\"400\" height=\"245\"><\/p>\n<p>Para que todo se lleve a cabo debemos montar en el nodo principal un servidor:<\/p>\n<p>DHCP<br \/>\nPXE<br \/>\nTFTP<br \/>\nNFS<\/p>\n<h2>Procedimiento:<\/h2>\n<p>El nodo principal debe tener los servicios DHCP, NFS, TFTP y PORTMAP configurados y ejecut\u00e1ndose correctamente, as\u00ed como tener montada toda la infraestructura de archivos que ser\u00e1n exportados y usados por los protocolos de red para serv\u00edrsela a los nodos esclavos. Una vez iniciados los nodos, el servidor DHCP reparte las direcciones correspondientes a cada una de las m\u00e1quinas conectadas bas\u00e1ndose en la MAC de el equipo que haya hecho la petici\u00f3n, el protocolo PXE (cliente) leer\u00e1 el archivo de configuraci\u00f3n que le ser\u00e1 enviado del servidor y descargar\u00e1 en la RAM de cada uno de los nodos secundarios el kernel de Kerrighed previamente configurado por medio del protocolo TFTP. Una vez descargado, se ejecutar\u00e1 y empezar\u00e1 el proceso de booteo en donde posteriormente se importar\u00e1 el directorio de archivos a trav\u00e9s del protocolo NFS. Finalmente el cluster de Kerrighed iniciar\u00e1 cargando los nodos que se encuentren conectados y comenzar\u00e1 la repartici\u00f3n de carga.<\/p>\n<p>Instalaci\u00f3n de paquetes necesarios:<\/p>\n<p>Primero instalaremos todo lo necesario para ejecutar los servidores:<\/p>\n<blockquote><p>sudo apt-get install isc-dhcp-server tftpd-hpa syslinux nfs-kernel-server nfs-common<\/p><\/blockquote>\n<p>En su orden correspondiente, los paquetes para el servidor dhcp, tftp, pxe y nfs.<br \/>\nCuando se est\u00e9 instalando el paquete tftpd-hpa, (si lo pide) recordar poner la ruta siguiente (\/var\/lib\/tftpboot) como directorio en donde se encontrar\u00e1n los archivos que se suban o descarguen del servidor. De lo contrario, sigan con la gu\u00eda, m\u00e1s adelante se arregla.<\/p>\n<h2>Montar el servidor DHCP<\/h2>\n<p>Por medio del protocolo DHCP el servidor podr\u00e1 otorgarle una direcci\u00f3n IP a los nodos de la red en funci\u00f3n de la MAC de cada computadora, as\u00ed podr\u00e1n identificarse entre ellas. Primero verificamos la interfaz por la cual el servidor escuchar\u00e1 los paquetes DHCPREQUEST que les enviar\u00e1n los nodos cuando inicien. Abrimos el archivo isc-dhcp-server (ac\u00e1 usamos nano pero pueden abrir el archivo con su editor de preferencia, d\u00edgase gedit, vim, emacs, etc):<\/p>\n<blockquote><p>nano \/etc\/default\/isc-dhcp-server<\/p>\n<p># Defaults for dhcp initscript<br \/>\n# sourced by \/etc\/init.d\/dhcp<br \/>\n# installed at \/etc\/default\/isc-dhcp-server by the maintainer scripts<br \/>\n#<br \/>\n# This is a POSIX shell fragment<br \/>\n#<br \/>\n# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?<br \/>\n# Separate multiple interfaces with spaces, e.g. \u201ceth0 eth1\u2033.<br \/>\nINTERFACES=&#8221;eth0&#8243;<\/p><\/blockquote>\n<p>En nuestro caso es la interfaz eth0 al estar utilizando nuestra tarjeta de red cableada.<\/p>\n<p>Ahora editamos el archivo de configuraci\u00f3n del servidor y agregamos el segmento de red que ser\u00e1 repartido as\u00ed como los archivos y las rutas que ser\u00e1n usadas por los dem\u00e1s protocolos. Tambi\u00e9n agregamos la IP que le tocar\u00e1 a cada computador en funci\u00f3n de su MAC. (para obtener la MAC de cada tarjeta de red basta con iniciar en windows y escribir en la consola (ipconfig \/all) o en linux (ip addr) y anotarlas. (o en su defecto abrir la m\u00e1quina y ver si est\u00e1 anotada en alguna etiqueta de la tarjeta de red).<\/p>\n<blockquote><p>nano \/etc\/dhcp\/dhcpd.conf<\/p><\/blockquote>\n<p>Agregamos esta configuraci\u00f3n en cualquier parte:<\/p>\n<blockquote><p>#Configuraci\u00f3n en caso de que se quiera agregar un servidor DNS y proveer internet a los nodos.<br \/>\noption domain-name &#8220;kerrighed&#8221;; #el nombre de dominio del servidor, puede ser cualquiera.<br \/>\noption domain-name-servers 192.168.1.2; #la ip del servidor, configurada manualmente.<\/p>\n<p># Segmento de red repartido<br \/>\nsubnet 192.168.1.0 netmask 255.255.255.0 {<br \/>\noption routers 192.168.1.2; # ip del servidor.<br \/>\noption broadcast-address 192.168.1.255; # la IP que servir\u00e1 para los mensajes de broadcast de la red.<br \/>\n}<br \/>\n# La IP de los nodos y configuraci\u00f3n para otros protocolos<br \/>\ngroup {<br \/>\nfilename &#8220;pxelinux.0&#8221;; # archivo de configuraci\u00f3n del protocolo PXE (\/var\/lib\/tftpboot)<br \/>\noption root-path &#8220;192.168.1.2:\/nfsroot\/kerrighed&#8221;; # sistema de archivos que ser\u00e1 exportado por el protocolo NFS<\/p>\n<p>#nodo1<br \/>\nhost kerrighednode1 {<br \/>\nfixed-address 192.168.1.101; #La ip del primer nodo.<br \/>\nhardware ethernet xx:xx:xx:xx:xx:xx; # MAC<br \/>\n}<br \/>\n#nodo2<br \/>\nhost kerrighednode2 {<br \/>\nfixed-address 192.168.1.102; # La ip del segundo nodo.<br \/>\nhardware ethernet xx:xx:xx:xx:xx:xx; # MAC<br \/>\n}<br \/>\nserver-name &#8220;kerrighedserver&#8221;; # El nombre del servidor, puede ser cualquiera.<br \/>\nnext-server 192.168.1.2; # IP del servidor PXE, obviamente la de nuestro server.<br \/>\n}<\/p><\/blockquote>\n<p>Con esto terminanos la configuraci\u00f3n del servidor DHCP. \ud83d\ude00<\/p>\n<h2>Montar el servidor TFTP y PXE<\/h2>\n<p>El servidor TFTP nos permitir\u00e1 descargar el kernel de Kerrighed en cada uno de los nodos una vez el protoclo PXE lo permita. Iniciamos la configuraci\u00f3n verificando que el archivo de configuraci\u00f3n est\u00e9 as\u00ed:<\/p>\n<blockquote><p>nano \/etc\/default\/tftpd-hpa<\/p>\n<p># \/etc\/default\/tftpd-hpa<\/p>\n<p>RUN_DAEMON=&#8221;yes&#8221;<br \/>\nTFTP_USERNAME=&#8221;tftp&#8221;<br \/>\nTFTP_DIRECTORY=&#8221;\/var\/lib\/tftpboot&#8221;<br \/>\nTFTP_ADDRESS=&#8221;0.0.0.0:69&#8243;<br \/>\nTFTP_OPTIONS=&#8221;\u2013secure&#8221;<\/p><\/blockquote>\n<p>En caso de que no nos haya pedido modificar la ruta del directorio tftp, lo arreglamos en el archivo, vamos a \/var\/lib y creamos la carpeta tftpboot.<\/p>\n<p>El paquete syslinux que instalamos arriba nos provee de los archivos necesarios para permitir el booteo por medio del protocolo PXE. Copiamos el archivo que permite el booteo al directorio del servidor TFTP:<\/p>\n<blockquote><p>cp \/usr\/lib\/syslinux\/pxelinux.0 \/var\/lib\/tftpboot<\/p><\/blockquote>\n<p>Creamos el directorio en donde estar\u00e1 el archivo de configuraci\u00f3n por default que usar\u00e1n los clientes PXE.<\/p>\n<blockquote><p>mkdir \/var\/lib\/tftpboot\/pxelinux.cfg<\/p><\/blockquote>\n<p>Se tiene la libertad de crear archivos de configuraci\u00f3n distintos para cada uno de los nodos si se desea creando un archivo con la IP de cada nodo en hexadecimal. Por ejemplo:<br \/>\nSi la ip fuera 192.168.1.101, el nombre del archivo ser\u00eda C0A80165.<br \/>\nPero como no nos interesa, no lo haremos.<\/p>\n<h2>Montando el servidor NFS y el sistema de archivos<\/h2>\n<p>Por medio de este protocolo exportaremos el sistema de archivos que utilizar\u00e1n y compartir\u00e1n todos los nodos.<\/p>\n<p>Creamos el directorio en donde estar\u00e1 el sistema de archivos:<\/p>\n<blockquote><p>mkdir \/nfsroot\/ &amp;&amp; mkdir \/nfsroot\/kerrighed<\/p><\/blockquote>\n<p>Creamos una caperta que ser\u00e1 necesaria para que el cluste funcione:<\/p>\n<blockquote><p>mkdir \/nfsroot\/kerrighed\/config<\/p><\/blockquote>\n<p>Configuramos el archivo que contiene los directorios que ser\u00e1n exportados por NFS a los clientes:<\/p>\n<blockquote><p>nano \/etc\/exports<\/p><\/blockquote>\n<p>Y agregamos:<\/p>\n<blockquote><p>\/nfsroot\/kerrighed 192.168.1.0\/255.255.255.0(rw,no_subtree_check,async,no_root_squash)<\/p><\/blockquote>\n<p>Re-exportamos el archivo pues acabamos de configurarlo:<\/p>\n<blockquote><p>exportfs -avr<\/p><\/blockquote>\n<p>Ahora vamos a crear una instalaci\u00f3n minimalista de Debian Squeeze en el directorio que acabos de crear (\/nfsroot\/kerrighed), \u00e9stos ser\u00e1n los archivos que compartir\u00e1n los nodos secundarios.<\/p>\n<p>Instalamos la aplicaci\u00f3n debootstrap, la cual nos permitir\u00e1 crear la instalaci\u00f3n minimalista:<\/p>\n<blockquote><p>apt-get install debootstrap<\/p><\/blockquote>\n<p>Creamos la instalaci\u00f3n:<\/p>\n<blockquote><p>debootstrap &#8211;arch i386 squeeze \/nfsroot\/kerrighed http:\/\/ftp.us.debian.org\/debian<\/p><\/blockquote>\n<p>Aqu\u00ed squeeze (o wheezy, o lenny, etc) es la versi\u00f3n de Debian a descargar, \/nfsroot\/kerrighed es el directorio donde el nuevo sistema residir\u00e1, y http:\/\/ftp.us.debian.org\/debian\/ es el mirror desde donde se descargar\u00e1n los paquetes. En caso de que est\u00e9n en ubuntu cambian la versi\u00f3n (quantal x ejemplo) y el mirror (http:\/\/archive.ubuntu.com\/ubuntu\/).<\/p>\n<p>Nota:la p\u00e1gina oficial del proyecto de Kerrighed recomienda Debian Lenny como distribuci\u00f3n para instalar su kernel.<\/p>\n<p>Una vez terminada la instalaci\u00f3n, debemos \u201cloguearnos\u201d al directorio creado para modificarlo sin problemas. Para ello usamos chroot como sigue:<\/p>\n<blockquote><p>chroot \/nfsroot\/kerrighed<\/p><\/blockquote>\n<p>Caeremos en la ra\u00edz del sistema, es decir, en el direcorio \u201c\/\u201d . Solo recuerda que en realidad es el directorio \/nfsroot\/kerrighed en tu sistema anfitri\u00f3n.<\/p>\n<p>Creamos una contrase\u00f1a para root:<\/p>\n<blockquote><p>passwd<\/p><\/blockquote>\n<p>Montamos el directorio \/proc de nuestro sistema anfitri\u00f3n en el sistema d archivos que ser\u00e1 exportado de modo que podamos ejecutar programas en los nodos.<\/p>\n<blockquote><p>mount -t proc none \/proc<\/p><\/blockquote>\n<p>Agregamos los paquetes b\u00e1sicos que necesitar\u00e1n los nodos para comunicarse con el servidor:<\/p>\n<blockquote><p>nano \/etc\/apt\/sources.list<\/p>\n<p>deb http:\/\/ftp.us.debian.org\/debian squeeze main non-free contrib<br \/>\ndeb-src http:\/\/cdn.debian.net\/debian\/ squeeze main non-free contrib<br \/>\ndeb http:\/\/cdn.debian.net\/debian\/ squeeze-updates main<br \/>\ndeb-src http:\/\/cdn.debian.net\/debian\/ squeeze-updates main<\/p><\/blockquote>\n<p>Actualizamos e instalamos los paquetes:<\/p>\n<blockquote><p>apt-get update<br \/>\napt-get install automake autoconf libtool pkg-config gawk rsync bzip2 libncurses5 libncurses5-dev wget lsb-release xmlto patchutils xutils-dev build-essential subversion dhcp3-common nfs-common openssh-server<\/p><\/blockquote>\n<p>Ahora necesitamos que se pueda comunicar con el servidor nfs, para eso modificamos este archivo:<\/p>\n<blockquote><p>nano \/etc\/fstab<\/p><\/blockquote>\n<p>y agregamos:<\/p>\n<blockquote><p>proc \/proc proc defaults 0 0<br \/>\n\/dev\/nfs \/ nfs defaults 0 0<br \/>\nconfigfs \/config configfs defaults 0 0<br \/>\nnone \/var\/run tmpfs defaults 0 0<\/p><\/blockquote>\n<p>Modificamos el archivo hosts de modo que el servidor DHCP sepa a qui\u00e9n le asignar\u00e1 cual IP:<\/p>\n<blockquote><p>nano \/etc\/hosts<\/p><\/blockquote>\n<p>Agregamos:<\/p>\n<blockquote><p>127.0.0.1 localhost<br \/>\n192.168.1.2 kerrighedserver<br \/>\n192.168.1.101 kerrighednode1<br \/>\n192.168.1.102 kerrighednode2<\/p><\/blockquote>\n<p>Creamos un enlace simb\u00f3lico de modo que el sistema de archivo se automonte en el servidor cuando \u00e9ste est\u00e9 disponible.<\/p>\n<blockquote><p>ln -sf \/etc\/network\/if-up.d\/mountnfs \/etc\/rcS.d\/S34mountnfs<\/p><\/blockquote>\n<p>Configuramos la interfaz de red de modo que Network Manager no interfiera con el cliente NFS.<\/p>\n<blockquote><p>nano \/etc\/network\/interfaces<\/p><\/blockquote>\n<p>Debe quedar:<\/p>\n<blockquote><p># The loopback interface:<br \/>\nauto lo<br \/>\niface lo inet loopback<\/p>\n<p># The primary network interface, manually configured to protect NFS:<br \/>\niface eth0 inet manual<\/p><\/blockquote>\n<p>Creamos un nombre de usuario y salimos del chroot:<\/p>\n<blockquote><p>adduser nombre_de_usuario<br \/>\nexit<\/p><\/blockquote>\n<p>Una vez llegado hasta aqu\u00ed podemos probar si los nodos secundarios pueden botear correctamente desde la red a la consola de nuestro debian squeeze reci\u00e9n instalado. Para eso creamos el siguiente archivo:<\/p>\n<blockquote><p>nano \/var\/lib\/tftpboot\/pxelinux.cfg\/default<\/p><\/blockquote>\n<p>y agregamos el c\u00f3digo d configuraci\u00f3n para el cliente PXE:<\/p>\n<blockquote><p>LABEL linux<br \/>\nDEFAULT vmlinuz-KERNEL_VERSION console=tty1 root=\/dev\/nfs initrd=initrd.img-KERNEL_VERSION nfsroot=192.168.1.2:\/nfsroot\/kerrighed ip=dhcp rw<\/p><\/blockquote>\n<p>La versi\u00f3n del Kernel pueden obtenerla escribiendo en la consola:<\/p>\n<blockquote><p>uname -r<\/p><\/blockquote>\n<p>Ahora copiamos en el directorio del tftp el kernel y el initrd para poder bootear nuestro debian reci\u00e9n instalado.<\/p>\n<blockquote><p>cp \/boot\/vmlinuz-KERNEL_VERSION \/boot\/initrd.img-KERNEL_VERSION \/var\/lib\/tftpboot\/<\/p><\/blockquote>\n<p>Ahora reiniciamos todos los servicios:<\/p>\n<blockquote><p>\/etc\/init.d\/tftpd-hpa restart<br \/>\n\/etc\/init.d\/isc-dhcp-server restart<br \/>\n\/etc\/init.d\/nfs-kernel-server restart<\/p><\/blockquote>\n<p>Finalmente entramos a la BIOS de cada nodo y configuramos el booteo desde la red. Si nos pide logearnos a la consola es porque todo ha ido bien. Ahora estamos preparados para instalar Kerrighed y centralizar nuestros nodos.<\/p>\n<p>En caso de presentar el siguiente error una vez se ha cargado el kernel:<\/p>\n<blockquote><p>It display \u201cBegin : Waiting for root file system\u2026\u201d and few minutes later :<br \/>\n\u201cALERT! \/dev\/nfs does not exist. Dropping to a shell!<\/p><\/blockquote>\n<p>Hay que reconstruir el initrd.img de modo que est\u00e9 configurado para iniciar a trav\u00e9s del NFS. En el sistema anfitri\u00f3n hacemos lo siguiente:<\/p>\n<blockquote><p>nano \/etc\/initramfs-tools\/initramfs.conf<\/p>\n<p>Cambiamos la linea:<br \/>\nBOOT=local<br \/>\na<br \/>\nBOOT=nfs<\/p><\/blockquote>\n<p>Guardamos y reconstruimos el initrd.<\/p>\n<blockquote><p>update-initramfs -u<\/p><\/blockquote>\n<p>Volvemos a ponerlo en el directorio del tftp y probamos de nuevo.<\/p>\n<blockquote><p>cp \/boot\/initrd.img-KERNEL_VERSION \/var\/lib\/tftpboot\/<\/p><\/blockquote>\n<h1>Instalando Kerrighed<\/h1>\n<p>Kerrighed no es m\u00e1s que el kernel d linux en su versi\u00f3n 2.6.x con un conjunto de parches y aplicaciones creadas con el objetivo de permitir el sistema de \u00fanica imagen. Para instalarlo hacemos lo siguiente:<\/p>\n<p>Nota: Para compilar el kernel de Kerrighed desde la versi\u00f3n 2.3 el equipo de desarrollo ha dejado de darle soporte a las arquitecturas i386 \/ x86-32 \/ IA32 (32 bits), por lo tanto s\u00f3lo desde las arquitecturas x86-64 (64 bits), ser\u00e1 posible compilar el kernel desde la versi\u00f3n 2.4 en adelante. Voy a dividir la gu\u00eda de instalaci\u00f3n una para la versi\u00f3n 2.3.0 y otra para la 3.0 (\u00faltima versi\u00f3n hasta el momento).<\/p>\n<p>Nos \u201clogueamos\u201d dentro del sistema d archivo otra vez:<\/p>\n<blockquote><p>chroot \/nfsroot\/kerrighed<\/p><\/blockquote>\n<h2>Versi\u00f3n 2.3.0<\/h2>\n<p>El Kernel de Kerrighed parece no poder compilar con versiones mayores de gcc-4.2, as\u00ed que dependiendo de la distribuci\u00f3n y la versi\u00f3n de ella que hayan instalado tendr\u00e1n versiones distintas de gcc.<\/p>\n<p>Para saber cu\u00e1l versi\u00f3n tienen escribimos en la consola:<\/p>\n<blockquote><p>gcc -v<\/p><\/blockquote>\n<p>Si tienen una menor o igual que la 4.2 est\u00e1 bien, de lo contrario:<\/p>\n<blockquote><p>apt-get install gcc-4.1<\/p><\/blockquote>\n<p>Cambiamos el nombre del directorio original, remplazamos y likeamos:<\/p>\n<blockquote><p>mv \/usr\/bin\/gcc \/usr\/bin\/gcc.orig<br \/>\nln -s \/usr\/bin\/gcc-4.1 \/usr\/bin\/gcc<\/p><\/blockquote>\n<p>Descargamos la versi\u00f3n 2.3.0 de la p\u00e1gina oficial del proyecto, el kernel de linux en su versi\u00f3n 2.6 y lo guardamos en la ruta \/usr\/src.<\/p>\n<blockquote><p>wget -O \/usr\/src\/kerrighed-2.3.0.tar.gz https:\/\/gforge.inria.fr\/frs\/download.php\/4491\/kerrighed-2.3.0.tar.gz<br \/>\nwget -O \/usr\/src\/linux-2.6.20.tar.bz2 http:\/\/www.kernel.org\/pub\/linux\/kernel\/v2.6\/linux-2.6.20.tar.bz2<\/p><\/blockquote>\n<p>Nos desplazamos hasta el directorio y descomprimimos.<\/p>\n<blockquote><p>cd \/usr\/src<br \/>\ntar zxf kerrighed-2.3.0.tar.gz<br \/>\ntar jxf linux-2.6.20.tar.bz2<\/p><\/blockquote>\n<p>Accedemos al directorio y creamos el archivo de configuraci\u00f3n.<\/p>\n<blockquote><p>cd kerrighed-2.3.0<br \/>\n.\/configure \u2013with-kernel=\/usr\/src\/linux-2.6.20<\/p><\/blockquote>\n<p>Patchamos el kernel, y creamos la configuraci\u00f3n por defecto que usar\u00e1 el kernel:<\/p>\n<blockquote><p>make patch<br \/>\nmake defconfig<\/p><\/blockquote>\n<p>Construimos los binarios e instalamos:<\/p>\n<blockquote><p>make kernel<br \/>\nmake<br \/>\nmake kernel-install<br \/>\nmake install<\/p><\/blockquote>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/imageshack.us\/a\/img211\/4826\/krgbuild.jpg\" alt=\"null\" width=\"510\" height=\"368\"><\/p>\n<p>Si todo ha ido bien, tendremos nuestro kernel de kerrighed compilado e instalado! \ud83d\ude42<br \/>\nAhora saltamos a la parte de verificar los archivos m\u00e1s abajo.<\/p>\n<h2>Versi\u00f3n 3.0<\/h2>\n<p>Descargamos la versi\u00f3n 3.0.0 de la p\u00e1gina oficial del proyecto y lo guardamos en la ruta \/usr\/src<\/p>\n<blockquote><p>wget -O \/usr\/src\/kerrighed-3.0.0.tar.gz http:\/\/gforge.inria.fr\/frs\/download.php\/27161\/kerrighed-3.0.0.tar.gz<\/p><\/blockquote>\n<p>Nos desplazamos a la ruta d la descarga, lo descomprimimos, renombramos el nombre de la carpeta y accedemos.<\/p>\n<blockquote><p>cd \/usr\/src<br \/>\ntar zxf kerrighed-3.0.0.tar.gz<br \/>\nmv kerrighed-3.0.0 kerrighed-src<br \/>\ncd kerrighed-src<\/p><\/blockquote>\n<p>Configuramos c\u00f3mo ser\u00e1 la instalaci\u00f3n y se descargar\u00e1 la versi\u00f3n necesaria del Kernel d linux que ser\u00e1 pacheado.<\/p>\n<blockquote><p>.\/configure \u2013sysconfdir=\/etc<\/p><\/blockquote>\n<p>En caso de que la descarga del kernel falle, ejecuten la siguiente linea:<\/p>\n<blockquote><p>wget -O \/usr\/src\/kerrighed-src\/patches\/linux-2.6.30.tar.bz2 http:\/\/www.kernel.org\/pub\/linux\/kernel\/v2.6\/linux-2.6.30.tar.bz2 &amp;&amp; .\/configure \u2013sysconfdir=\/etc<\/p><\/blockquote>\n<p>Construimos los binarios e instalamos:<\/p>\n<blockquote><p>make<br \/>\nmake install<\/p><\/blockquote>\n<p>Si todo ha ido bien deber\u00edamos tener los siguientes archivos en las siguientes rutas:<\/p>\n<blockquote><p>\/boot\/vmlinuz-x.x.x-krg Kerrighed kernel<br \/>\n\/boot\/System.map Kerrighed kernel tabla de s\u00edmbolos<br \/>\n\/lib\/modules\/x.x.x-krg Kerrighed m\u00f3dulos<br \/>\n\/etc\/init.d\/kerrighed Kerrighed service script *<br \/>\n\/etc\/default\/kerrighed Configuraci\u00f3n de Servicios<br \/>\n\/usr\/local\/share\/man Manpages<br \/>\n\/usr\/local\/bin\/krgadm Cluster herramientas de administraci\u00f3n<br \/>\n\/usr\/local\/bin\/krgcapset Herramienta de capacidades de los procesos<br \/>\n\/usr\/local\/bin\/krgcr-run Process checkpoint\/restart helper<br \/>\n\/usr\/local\/bin\/migrate Herramienta de migraci\u00f3n de procesos<br \/>\n\/usr\/local\/lib\/libkerrighed-* Librer\u00edas de Kerrighed<br \/>\n\/usr\/local\/include\/kerrighed Archivos de Cabecera de Kerrighed<\/p><\/blockquote>\n<p>Ahora necesitamos atar los \u00faltimos cabos sueltos para dejar todo funcionando. Modificaremos el archivo kerrighed_nodes el cual se encarga de ver c\u00f3mo el cluster trata a sus nodos.<\/p>\n<blockquote><p>nano \/etc\/kerrighed_nodes<br \/>\nsession=1 #Es el identificador del cluster, esto es para cuando se tiene m\u00e1s de un cluster funcionando en una misma red. El valor puede ser de 1 a 255.<br \/>\nnbmin=2 #El n\u00famero de nodos que deben cargar antes que el cluster se autoinicie.<\/p><\/blockquote>\n<p>Ahora verificamos el archivo que condiciona el comportamiento del cluster. Abrimos:<\/p>\n<blockquote><p>nano \/etc\/default\/kerrighed<\/p>\n<p># Inicia el Cluster de Kerrighed<br \/>\nENABLE=true<br \/>\n#ENABLE=false<\/p>\n<p># Inicia o desactiva el balanceador de carga autom\u00e1tico.<br \/>\nLEGACY_SCHED=true<br \/>\n#LEGACY_SCHED=false<\/p><\/blockquote>\n<p>Salimos del chroot:<\/p>\n<blockquote><p>exit<\/p><\/blockquote>\n<p>Ahora debemos configurar el server TFTP para que cargue el kernel de Kerrgihed reci\u00e9n instalado y no el origianl de debian.<\/p>\n<blockquote><p>cp \/nfsroot\/kerrighed\/boot\/vmlinuz-x.x.x-krg \/var\/lib\/tftpboot\/<\/p><\/blockquote>\n<p>De igual forma modificamos el archivo de configuraci\u00f3n que el server PXE env\u00eda a los clientes:<\/p>\n<blockquote><p>nano \/var\/lib\/pxelinux.cfg\/default<\/p><\/blockquote>\n<p>y le ponemos:<\/p>\n<blockquote><p>LABEL linux<br \/>\nDEFAULT vmlinuz-x.x.x-krg console=tty1 root=\/dev\/nfs nfsroot=192.168.1.2:\/nfsroot\/kerrighed ip=dhcp rw session_id=1<\/p><\/blockquote>\n<p>Ta d\u00e1! Ya tenemos todo atado, reiniciamos los servicios en el servidor y probamos:<\/p>\n<blockquote><p>\/etc\/init.d\/tftpd-hpa restart<br \/>\n\/etc\/init.d\/isc-dhcp-server restart<br \/>\n\/etc\/init.d\/nfs-kernel-server restart<\/p><\/blockquote>\n<h1>Utilizando Kerrighed<\/h1>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/0aps.me\/blog\/wp-content\/uploads\/kerrighed.png\" alt=\"null\"><\/p>\n<p>Desde el servidor nos logueamos a uno de los nodos por medio de ssh:<\/p>\n<blockquote><p>ssh usuario_del_cluster@192.168.1.101<br \/>\nTambi\u00e9n directamente como root:<br \/>\nssh 192.168.1.101<\/p><\/blockquote>\n<p>Podemos verificar que todos los nodos est\u00e1n arriba de la siguiente manera:<\/p>\n<blockquote><p>krgadm nodes<\/p><\/blockquote>\n<p>Podemos tener los siguientes resultados:<br \/>\n101:online<br \/>\n102:present<\/p>\n<p>Online implica que est\u00e1n participando activamente en el cluster. Present implica que est\u00e1n presentes pero no est\u00e1 formando parte del cluster.<\/p>\n<p>Podemos verificar el proceso de booteo, viendo el log de inicio:<\/p>\n<blockquote><p>tail -f \/var\/log\/messages<\/p><\/blockquote>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/imageshack.us\/a\/img839\/1786\/krdstart30.jpg\" alt=\"null\" width=\"510\" height=\"368\"><\/p>\n<p>Podemos obtener informaci\u00f3n de los procesadores ejecut\u00e1ndose e informaci\u00f3n de la memoria disponible:<\/p>\n<blockquote><p>cat \/proc\/cpuinfo | grep \u201cmodel name\u201d<br \/>\ncat \/proc\/meminfo | grep \u201cMemFree\u201d<\/p><\/blockquote>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/imageshack.us\/a\/img11\/6093\/krg3stat.jpg\" alt=\"null\" width=\"510\" height=\"94\"><\/p>\n<p>Para mostrar un ejemplo de la migraci\u00f3n de procesos, compilamos el sgt programa:<br \/>\n<code>#include <\/code><\/p>\n<p><code><code><\/code><\/code><\/p>\n<p>int es_primo(int n)<br \/>\n{<br \/>\nint tmp, lim;<br \/>\nfor (tmp = 1, lim=0; tmp &lt;= n; tmp++) if ( !(n%tmp) ) lim++; if(lim &gt; 2) return 1;<br \/>\nreturn 0;<br \/>\n}<br \/>\nint main()<br \/>\n{<\/p>\n<p><code><br \/>\n<\/code><\/p>\n<p><code>int tmp=0, countx;<br \/>\nwhile(tmp++ &lt;= 2000000)<br \/>\nif( !(es_primo(tmp) ) )<br \/>\nprintf(\"%d\\n\", tmp ), countx++;<br \/>\nreturn 0;<\/code><\/p>\n<p><code><br \/>\n<\/code><code>}<br \/>\n<\/code><\/p>\n<p>Compilamos:<\/p>\n<blockquote><p>gcc primo.c -o primo<\/p><\/blockquote>\n<p>Para monitorear el cluster ejecutamos el comando top y presionamos la tecla de n\u00famero 1 para ver los cpu ejecut\u00e1ndose:<\/p>\n<blockquote><p>top<\/p><\/blockquote>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/imageshack.us\/a\/img266\/2227\/top3yr.jpg\" alt=\"null\" width=\"510\" height=\"368\"><\/p>\n<p>Ejecutamos el programa:<\/p>\n<blockquote><p>.\/primo<\/p><\/blockquote>\n<p>Observamos c\u00f3mo aumenta la carga en un procesador:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/imageshack.us\/a\/img23\/1048\/top1wj.jpg\" alt=\"null\" width=\"510\" height=\"94\"><\/p>\n<p>Volvemos a ejecutar el mismo programa en el mismo cpu, pero ahora permitiendo que el proceso pueda migrar hacia otro nodo:<\/p>\n<blockquote><p>krgcapset -d +CAN_MIGRATE<br \/>\n.\/primo<\/p><\/blockquote>\n<p>Vemos el log del proceso migrado:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/imageshack.us\/a\/img515\/2244\/top2r.jpg\" alt=\"null\" width=\"510\" height=\"94\"><\/p>\n<p>Y observamos c\u00f3mo se distribuye la carga entre los nodos:<br \/>\n<img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/imageshack.us\/a\/img43\/3007\/top3yq.jpg\" alt=\"null\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n Computaci\u00f3n Paralela y Distribuida HPC es el acr\u00f3nimo de high performance computing, en espa\u00f1ol, computaci\u00f3n de alto rendimiento. Que una m\u00e1quina tenga alto rendimiento implica que posee una capacidad de c\u00e1lculo y procesamiento mayor que la media de las computadoras. Este campo del hpc pertenence a la computaci\u00f3n distribuida, el cual a la vez [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[3,4,1],"tags":[34,35,36],"class_list":["post-40","post","type-post","status-publish","format-standard","hentry","category-c","category-others","category-prog","tag-clusters","tag-debian","tag-kerrighed"],"acf":[],"_links":{"self":[{"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/posts\/40","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/comments?post=40"}],"version-history":[{"count":7,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/posts\/40\/revisions"}],"predecessor-version":[{"id":111,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/posts\/40\/revisions\/111"}],"wp:attachment":[{"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/media?parent=40"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/categories?post=40"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/0aps.me\/blog\/wp-json\/wp\/v2\/tags?post=40"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}