Académique Documents
Professionnel Documents
Culture Documents
Raspberry Pi.
Se har un cluster utilizando cuatro tarjetas Raspberry Pi, para ello se utiliz tres tablas
Raspberry Pi 2 para los nodos informticos y una Raspberry Modelo B para el nodo principal. Se
procur que el clster fuera lo ms compacto posible, con solo dos cables saliendo, uno para la
energa y el otro para la red. Se utiliz un concentrador USB para alimentar las placas, y un
conmutador Ethernet, que se modific, para alimentarse tambin desde el concentrador USB
en lugar de un conector de pared separado.
Por ahora estoy tomando un atajo y estoy usando el enrutador de mi casa para asignar
direcciones IP a cada uno de los nodos. Arrancando cada Pi por turno, y tomando una nota de la
direccin IP que se asignan usando la interfaz web del enrutador, termin con el nodo principal
que tiene una direccin IP de 192.168.1.173, con los tres nodos de cmputo que tienen
192.168.1.177, 192.168 .1.178 y 192.168.1.180.
Al iniciar sesin en los nodos, hice la configuracin estndar en cada nodo ejecutando,
% sudo raspi-config
Luego se expande el sistema de archivos al tamao de la tarjeta SD, dndome unos gigabytes
adicionales. Se cambi la contrasea de cada nodo a algo un poco ms seguro y se renombr los
nodos rpi0, rpi1, rpi2 y rpi3, respectivamente.
Despus de hacer eso, se edita el archivo / etc / hosts en cada uno de los nodos,
% cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.1.1 rpi0
192.168.1.173 rpi0 rpi0.local rpi0.lan
192.168.1.177 rpi1 rpi1.local rpi1.lan
192.168.1.178 rpi2 rpi2.local rpi2.lan
192.168.1.180 rpi3 rpi3.local rpi3.lan
Despus se generan las claves SSH para los cuatro nodos, sin ninguna frase de paso,
distribuyendo las claves pblicas de cada nodo a las otras tres. Esto significa que puedo pasar
ssh entre los nodos sin tener que escribir repetidamente la contrasea todo el tiempo, pero an
se tendr que escribir una contrasea para ssh en el clster.
Agregar disco
Se conect al nodo principal una unidad flash de 64GB. Esto es bastante fcil de montar,
% mkdir /mnt/usb
% sudo chown -R pi:pi /mnt/usb
% sudo mount /dev/sda1 /mnt/usb -o uid=pi, gid=pi
Sin embargo, quera ir un poco ms lejos y hacer que este disco est disponible para los cuatro
nodos. Para hacer esto, utilic NFS y autofs. En los cuatro nodos, deber continuar e instalar el
software de cliente NFS,
# /etc/exports: the access control list for filesystems which may be exported
/mnt/usb rpi1(rw,sync)
/mnt/usb rpi2(rw,sync)
/mnt/usb rpi3(rw,sync)
para agregar los tres nodos de clculo. Despus de hacerlo, deber reiniciar los servicios RPC,
Despus de reiniciar, puede verificar desde uno de los nodos de clculo para asegurarse de que
rpi0 est exportando el disco a travs de NFS correctamente. En este punto, podra simplemente
editar el archivo / etc / fstab y agregar los discos. Sin embargo, eso podra ser problemtico
segn el orden en que se inicien los nodos. En cambio, en los tres nodos de computacin debe
instalar autofs,
/mnt/nfs /etc/auto.nfs
rpi0 rpi0:/mnt/usb
si todo va bien en este punto, si cambia al directorio / mnt / nfs / rpi0 / y el disco conectado al
nodo principal debe montarse automticamente. Puedes comprobar,
% df h
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 14984668 2513228 11812356 18% /
/dev/root 14984668 2513228 11812356 18% /
devtmpfs 470416 0 470416 0% /dev
tmpfs 94944 232 94712 1% /run
tmpfs 5120 0 5120 0% /run/lock
tmpfs 189880 0 189880 0% /run/shm
/dev/mmcblk0p1 57288 19448 37840 34% /boot
rpi0:/mnt/usb 60467008 64 60466944 1% /mnt/nfs/rpi0
para ver si se ha montado automticamente.
Prximos pasos
En lugar de conectar directamente el conmutador Ethernet a la red externa, y hacer que el
enrutador local asigne direcciones IP para cada uno de los nodos, como paso siguiente, se
agregar un adaptador Ethernet USB al nodo principal. Esto le dar al nodo principal dos
conexiones Ethernet. El primero se conectar a la red externa, dando al nodo principal, y por lo
tanto al clster, una direccin IP 'externa'. El segundo se conectar al conmutador Ethernet del
clster. A continuacin, podemos configurar el nodo principal como un servidor DHCP para otros
tres nodos 'internos' conectados al conmutador, creando una segunda red visible solo para el
clster. En esta configuracin, an podr enviar ssh al nodo principal, pero solo se podr alcanzar
los tres nodos informticos desde el nodo principal. Sin embargo, hay un problema: cmo se
sabr la direccin IP externa del nodo principal?
La conexin del cableado de la tarjeta Raspberry Pi de los pines GPIO (entrada / salida de
propsito general) son solo 4 cables: + 5V, GND, SDA y SCL.
Despus de conectar el panel, se instalar las herramientas I2C y las bibliotecas asociadas de
Python.
device_tree=
dtparam=spi=on
dtparam=i2c1=on
dtoverlay=w1-gpio-pullup,gpiopin=3,pullup=3
dtoverlay=w1-gpio-pullup,gpiopin=5,pullup=5
y agregando los siguientes mdulos al archivo / etc / modules,
i2c_dev
i2c_bcm2708
Despus de reiniciar el nodo principal, debera poder ver el panel con una ID I2C de 27,
% sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Puede usar las bibliotecas ThinkBowl I2C con este panel,
Estas bibliotecas estn pensadas principalmente para Python 3, pero incluye la biblioteca
i2c_lcd_smbus (obviamente obsoleta) escrita para Python 2. El seguimiento, por ejemplo,
empujar la direccin IP actual a la lnea superior de la pantalla.
#!/usr/bin/Python
import socket
from i2clibraries import i2c_lcd_smbus
lcd = i2c_lcd_smbus.i2c_lcd(0x27,1, 2, 1, 0, 4, 5, 6, 7, 3)
lcd.command(lcd.CMD_Display_Control | lcd.OPT_Enable_Display)
lcd.backLightOn()
incluso podemos configurar cosas para llamar a este script desde /etc/rc.local en el arranque,
#!/bin/sh -e
#
# rc.local
cd /home/pi
python ip.py
exit 0
as se mostrar al arrancar en el panel LCD del clster, la direccin IP externa del nodo principal.
Con dicha IP siempre sabremos a dnde llegar a travs del ssh, sin importar donde este el clster.
% ifconfig
que se mostrar como eth1. Luego edite / etc / network / interfaces de la siguiente manera,
auto lo
iface lo inet loopback
auto eth1
allow-hotplug eth1
iface eth1 inet dhcp
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.50.1
netmask 255.255.255.0
network 192.168.50.0
broadcast 192.168.50.255
Se debe tener en cuenta que, dado que la direccin MAC del adaptador que est con el
enrutador domstico va a cambiar, nuestra direccin IP "externa" del nodo principal tambin va
a cambiar.
ddns-update-style none;
authoritative;
log-facility local7;
host rpi0 {
hardware ethernet b8:27:eb:22:60:fb;
fixed-address 192.168.50.1;
}
host rpi1 {
hardware ethernet b8:27:eb:a0:a1:7f;
fixed-address 192.168.50.11;
}
host rpi2 {
hardware ethernet b8:27:eb:68:b6:a3;
fixed-address 192.168.50.12;
}
host rpi3 {
hardware ethernet b8:27:eb:0b:4e:2c;
fixed-address 192.168.50.13;
}
}
}
Aqu definimos una red de clster interna y asignamos a cada uno de los cuatro nodos su propia
direccin IP esttica en la red interna. Luego se edita el archivo / etc / default / isc-dhcp-server
para reflejar la configuracin de nuestro servidor DHCP
DHCPD_CONF=/etc/dhcp/dhcpd.conf
DHCPD_PID=/var/run/dhcpd.pid
INTERFACES="eth0"
A continuacin, se edita el archivo / etc / hosts en los cuatro nodos para reflejar los cambios;
por ahora, todava puede comunicarse con ellos en sus direcciones IP anteriores.
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Finalmente, se actualizar la secuencia de comandos para el panel LCD en el nodo principal para
mostrar nuestras direcciones IP internas y externas,
#!/usr/bin/python
import socket
import fcntl
import struct
from i2clibraries import i2c_lcd_smbus
def get_ip_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
lcd = i2c_lcd_smbus.i2c_lcd(0x27,1, 2, 1, 0, 4, 5, 6, 7, 3)
lcd.command(lcd.CMD_Display_Control | lcd.OPT_Enable_Display)
lcd.backLightOn()
Antes de reiniciar el clster, debemos sacar nuestro cable Ethernet externo del interruptor y
conectarlo al adaptador USB a Ethernet conectado al nodo principal. Esto dejar un socket vaco
en el conmutador Ethernet.
En este punto, podremos reiniciar el clster. Por lo tanto, desconecte la clavija de alimentacin
del concentrador USB y retire todos los nodos. Al reiniciar, se deber ver algo como esto en la
pantalla LCD,
Se observa que eth0 tiene la direccin IP interna esttica que le asignamos, mientras que eth1
tiene una nueva direccin IP asignada por nuestro enrutador domstico. Ahora se debera poder
ingresar al nodo principal usando su nueva direccin IP externa, y ver algo como esto,
% ifconfig
eth0 Link encap:Ethernet HWaddr b8:27:eb:22:60:fb
inet addr:192.168.50.1 Bcast:192.168.50.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2470 errors:0 dropped:0 overruns:0 frame:0
TX packets:2267 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:215730 (210.6 KiB) TX bytes:237032 (231.4 KiB)
Y esto,
% route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth1
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.50.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
Si ha habido algn error, y no podemos alcanzar el nodo principal a travs de la red, es posible
que tengamos que utilizar un monitor con conexin HDMI ms un teclado USB y conectarlos
directamente al nodo principal. Podremos retirar temporalmente el disco USB para obtener el
puerto USB libre para el teclado, para que se pueda diagnosticar y solucionar cualquier problema
de red.
Sin embargo, si se consigue llegar al nodo principal desde la red externa. Debera poder hacer
ping a los hosts externos en la red 192.168.1. * Adems de los hosts internos en la red
192.168.50. *. Si ingresamos a uno de los nodos de cmputo, mientras pueden ver el nodo
principal y entre ellos, an no pueden ver el enlace de red con el exterior. Vamos a tener que
reenviar paquetes desde la red interna a la externa antes de que sea posible.
net.ipv4.ip_forward=1
y luego agregue en la parte inferior del archivo / etc / network / interfaces una lnea para cargar
las tablas en el arranque,
% ssh rpi1
Linux rpi2 3.18.11-v7+ #781 SMP PREEMPT Tue Apr 21 18:07:59 BST 2015 armv7l
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.