Moure partició arrel de SD a USB en la Raspberry

Després d’un temps utilitzant una raspberry amb el S.O. a la targeta SD ens podem trobar que aquest falla. Pel que he llegit ‘per ahí’ sol passar prou a sovint ja que en realitat la targeta SD no està preparada para tanta lectura/escriptura (això pareix). Però hi ha una solució per a aquest problema: Passar la partició arrel del S.O. a una unitat USB, és un canvi ben senzill però que depenent del tamany de la partició necessitarà més temps o menys (i estic parlant fins a varies hores).

El primer que es fa és identificar on està la nostra partició arrel, per a això es fa un df -h i localitzem la línia on indica que la partició és ‘/’:

Filesystem Size Used Avail Use% Mounted on
 rootfs 15G 1.9G 13G 14% /
 /dev/mmcblk0p2 15G 1.9G 13G 14% /
 devtmpfs 243M 0 243M 0% /dev
 tmpfs 49M 224K 49M 1% /run
 tmpfs 5.0M 0 5.0M 0% /run/lock
 tmpfs 98M 0 98M 0% /run/shm
 /dev/mmcblk0p1 56M 17M 40M 30% /boot

En aquest cas seria /dev/mmcblk0p2

Després identifiquem la nostra unitat USB, podem fer un ls /dev/sd* abans de connectar el nostre USB, connectar el nostre USB i tornar a fer un ls /dev/sd*, veurem que hi ha algun element nou. Imaginem que al nostre cas hem identificat el /dev/sda1 (sda és la unitat i el 1 és la partició, pot ser sda, sdb, sdc,…. i la partició 1, 2, 3,…).
Aleshores executem:

 sudo dd if=/dev/mmcblk0p2 of=/dev/sda1 bs=4M

Aquest comandament el que fa és fer una ‘foto’ de la partició arrel i plasmar-la a la partició que li hem indicat (borrant tot el que hi havia abans, per supost). Després es necessita revisar la nova partició en busca d’errors. Si no es fa no es podrà seguir al següent pas.

 sudo e2fsck /dev/sda1

Ara tenim una copia exacta de la partició de la SD en la unitat USB, però segurament la unitat USB té més espai i el estem desaprofitant. Per a ocupar tot l’espai possible executem:

 sudo resize2fs /dev/sda1

I ací podriem dir que acaba la primera part: la migració de dades. Ara comença la segona part: la configuració del S.O. per a iniciar amb la nova partició com a partició arrel.
Primer muntem la nova partició

 sudo mount /dev/sda1 /mnt

I editem el seu fitxer fstab

 sudo nano /mnt/etc/fstab

El que anem a fer és canviar el /dev/mmcblk0p2 que haviem vist al primer pas per el /dev/sda1 que és la nova partició (en aquest cas té aquest nom, recordeu al vostre cas pot tenir un altre nom)

Exemple:
Abans

 proc /proc proc defaults 0 0
 /dev/mmcblk0p1 /boot vfat defaults 0 2
 /dev/mmcblk0p2 / ext4 defaults,noatime 0 1
 # a swapfile is not a swap partition, so no using swapon|off...

Després

 proc /proc proc defaults 0 0
 /dev/mmcblk0p1 /boot vfat defaults 0 2
 /dev/sda1 / ext4 defaults,noatime 0 1
 # a swapfile is not a swap partition, so no using swapon|off...

Ara ja podem desmuntar la partició nova

 sudo umount /dev/sda1

I anem a editar un fitxer de configuració del boot

 sudo nano /boot/cmdline.txt

On modifiquem el root=/dev/mmcblk0p2 per root=/dev/sda1

Ara ja si que podem reiniciar i comprovar que estem a la nova partició. Ho podem comprovar amb un df -h per a veure les particions muntades i el tamany.

La partició vella la podem deixar ahí sense tocar, no se sap mai si algun dia es necessitarà per a alguna emergència com voler utilitzar la raspberry sense la unitat USB. Per a aquest cas sols fariem l’últim pass, tornant a posar el root=/dev/mmcblk0p2.

Aquesta informació l’he extret i mig traduït de:
http://travisred.github.io/using-a-usb-drive-as-os-root-on-a-raspberry-pi/

Servidor Redundant DRBD+HeartBeat

DRBD + HEARTBEAT

Hui explicaré com poder tenir un servidor redundant. No estic parlant d’un simple RAID de HDD’s, sino de redundacia de servidor completa, que si per el que siga el servidor es para es puga donar servei igualment. Està clar que per a això fan falta 2 servers, un que és el principal i l’altre que està ‘dormint’ i quan detecta que el primer està ‘caigut’ es ‘desperta’ i continua donant el mateix servei.
Açò s’aconseguix amb el DRBD i el HEARTBEAT. El que fa el DRBD és el mateix que un RAID1 però a nivell de xarxa i el funcionament és el següent: Es sincronitzen dues particions iguals (una a cada servidor) formant una partició virtual visible pels dos servidors, el servidor principal té accés RW i el secundari sols R. Quan el principal cau, el secundari passa a ser el principal i ja té accés RW. Tota la informació que s’escriu a aquesta partició, s’escriu tant a la partició física del propi servidor principal, com a la partició física del servidor secundari (enviant les dades per la xarxa), així quan el servidor primari torna a estar en funcionament es torna a sincronitzar les particions i torna a ser el principal.
El HEARTBEAT és l’encarregat de monitoritzar l’estat dels dos servidors i activar el servidor secundari quan el primari ha caigut, sense el HEARTBEAT aquesta feina s’hauria de fer en manual, que també l’explicaré per si ho tenim que fer alguna vegada.
Una vegada explicat més o menys els conceptes (qui no tinga qualsevol cosa clara que pregunte, jeje) passe ja a començar el tutorial:
No és requisit indispensable que les dues máquines siguen idèntiques, sols les particions a sincronitzar (encara que per a que no es veja afectat el rendiment del servidor si que deuria de ser igual)
Les particions que van a utilitzar-se en el DRBD no tindran cap format ni estaran muntades, en aquest cas anem a dir que les particions que anem a utilitzar són la /dev/sda7 per als dos servidors i que tenen el mateix tamany.
Les proves les he fet en la debian 6.0 i he utilitzat el repositori per a la instal·lació de les aplicacions, no he compilat res (facilet ehhhh), anem allà.

Instal·lació i configuració del DRBD

Instal·lem el paquet drbd8-utils:
root@pc:/# apt-get install drbd8-utils

I ara passem a configurar-ho, comentar que per a la comunicació entre els dos servidors es neccesita tenir oberts els ports 7788/TCP i 7799/TCP, com estic fent més o menys un ‘copy & paste’ del manual de la web oficial (però traduït, per supost) vaig a utilitzar les mateixes ip’s, configuracions,…. Així que les IP’s dels servidors, és a dir que el servidor1 té la IP 10.1.1.31 i el servidor 2 la 10.1.1.32 i utilitcen la tarjeta de xarxa eth1.
Mantenint la configuració que tenen per defecte sols hem de fer la següent modificació en el fitxer /etc/drbd.conf:

resource r0 {
on alice {
device    /dev/drbd1;
disk      /dev/sda7;
address   10.1.1.31:7789;
meta-disk internal;
}
on bob {
device    /dev/drbd1;
disk      /dev/sda7;
address   10.1.1.32:7789;
meta-disk internal;
}
}

Si ja tenim un resource el borrem i posem este, i ara toca explicar-lo un poc. En el tag resource es definix les particions locals a utilitzar en el servidors i la partició virtual que es crea. Podem vore que el nom que es definix en resource és el r0 i que hi ha dos servidors dins del resource el servidor ‘alice’ i el ‘bob’. En cada servidor està definit la seva IP, la seva partició que s’utilitzarà i la partició virtual a la que pertany.
Així que per a extrapolar-ho al nostre cas sols falta canviar els noms dels servidors, les IP’s i les particions locals que s’utilitzaran, la partició virtual (el ‘device’) podem mantindre el que apareix en l’exemple.
Continuem en l’activació de l’aplicació amb els següents programes (teniu en compte que on diu ‘r0’ es modificarà per el nom del resource que heu posat vosaltres):
Primer carreguem el mòdul al kernel:
root@pc:/#modprobe drbd

Es crea el metadata del resource, aqueta acció sols es farà la primera vegada que es cree el device (en aquest cas el /dev/drbd1)
root@pc:/#drbdadm create-md r0

Apareixerà un resultat paregut a aquest:
v08 Magic number not found
Writing meta data...
initialising activity log
NOT initialized bitmap
New drbd meta data block sucessfully created.
success

i continuem amb
root@pc:/#drbdadm up r0

Si falla aquest comandament es pot provar d’una altra forma:
root@pc:/#drbdadm attach r0 (asocia el device als servidors)
root@pc:/#drbdadm syncer r0 (configura els paràmetres de sincronització)
root@pc:/#drbdadm connect r0 (connecta els servidors)

Be fent la primera opcció o la segona opcio per a comprovar que està tot correcte es fa un
root@pc:/#cat /proc/drbd

I el que mostre per pantalla serà similar al que es mostra
version: 8.3.0 (api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by buildsystem@linbit, 2008-12-18 16:02:26
1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r---
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:200768

Diu Inconsistent/Inconsistent perquè encara no s’ha sincronitzat.
Si fins a ací ha funcionat tot correcte… ja toca sincronitzar les dues particions, si no ha funcionat tot correcte reviseu la configuració que algo mal hi haurà. Per a sincronitzar les particions i dir quin servidor és el node principal s’executa el següent comandament (sols en el servidor principal):
root@pc:/#drbdadm -- --overwrite-data-of-peer primary r0

i començarà una sincronització completa de les particions, que depenent del tamany de la partició, recursos dels servidors i connexió de xarxa tardarà més o menys (ja vos assegure que tardar si que tarda prou en completar). Per a monitoritzar la sincornització es pot fer un
root@pc:/#watch -n1 cat /proc/drbd

i veurem com va avançant la sincronització.

Posada en marxa i comprovació del sistema

Ara que ja ha acabat de sincronitzar-se les particions ja podem començar a utilitzar-les. Recordar que en aquest sistema el servidor primari té accés de RW a la partició /dev/drbd1 mentre que el servidor secundari sols R.
Com aquesta partició no té format ni està utilitzant-se el primer que es fa és donar-li format
root@pc:/#mkfs.ext3 /dev/drbd1

i la muntem en un directori que creem nosaltres
root@pc:/#mount /dev/drbd1 /mnt
root@pc:/#mount

Aixina que ens mostre si s’ha muntat o no i ja podem accedir a ella i crear qualsevol cosa, ara si s’intenta fer el mateix des del servidor secundari es comprovarà que no es pot fer. Si es necessitara poder accedir es tindria que configurar d’una altra forma (si que es pot) fent els dos servidors com a principals i utilitzar un altre format (GFS per exemple), i açò està explicat en la web principal i en altres blogs.
Passem a comprovar que el que es modifica en el primer servidor també ho fa al secundari. Desmuntem la partició en el primari:
root@pc:/#umount /mnt

Canviem el rol en el server primari a secundari
root@pc:/#drbdadm secondary r0

I ara fem el contrari en el server secundari
root@pc:/#drbdadm primary r0
root@pc:/#mount /dev/drbd1 /mnt
root@pc:/#mount

Així comprovem que està muntat correctament i si accedim al seu punt de muntatge trobarem que les dades són les mateixes, tornem a fer la mateixa operació per a deixar-ho com estava (el servidor principal el tornem a fer principal i el secundari el tornem a fer secundari)
I si tot ha anat be ja tenim en marxa el DRBD!

Instal·lació i configuració del HeartBeat

root@pc:/#apt-get install heartbeat

I ja tenim instal·lada l’aplicació (que senzilles són les coses!), ara passem a la configuració d’aquest. Es necessiten 3 arxius de configuració:
/etc/ha.d/authkeys <- definix el xifratge
/etc/ha.d/ha.cf <-paràmetres per a la monitorització
/etc/ha.d/haresources <- paràmetres d’IPV, servici a monitoritzar,…

Abans de fer res en el fitxer /etc/hosts es posen dues linies amb les ip’s i noms dels dos servidors per a un millor funcionament del heartbeat. Després ja podem passar a crear els arxius de configuració ja que al fer-ho jo he vist que no se me crea cap arxiu, els creem a ma i funciona igual, primer creem el authkeys amb el següent contingut

auth 1
1 crc

és l’autenticació menys forta però per a proves funciona be, per a altres métodes més forts buscar ‘per ahí’

Ara li toca al ha.cf

#       File to write debug messages to
debugfile /var/log/ha-debug
#
#
#       File to write other messages to
#
logfile /var/log/ha-log
#
#
#       Facility to use for syslog()/logger
#
logfacility     local0
#
#
#       A note on specifying "how long" times below...
#
#       The default time unit is seconds
#               10 means ten seconds
#
#       You can also specify them in milliseconds
#               1500ms means 1.5 seconds
#
#
#       keepalive: how long between heartbeats?
#
keepalive       2
#
#       deadtime: how long-to-declare-host-dead?
#
#               If you set this too low you will get the problematic
#               split-brain (or cluster partition) problem.
#               See the FAQ for how to use warntime to tune deadtime.
#
deadtime        30
#
#       warntime: how long before issuing "late heartbeat" warning?
#       See the FAQ for how to use warntime to tune deadtime.
#
warntime 10
#
#
#       Very first dead time (initdead)
#
#       On some machines/OSes, etc. the network takes a while to come up
#       and start working right after you've been rebooted.  As a result
#       we have a separate dead time for when things first come up.
#       It should be at least twice the normal dead time.
#
initdead        120
#
#
#       What UDP port to use for bcast/ucast communication?
#
udpport 694
#       Set up a unicast / udp heartbeat medium
#       ucast [dev] [peer-ip-addr]
#
#       [dev]           device to send/rcv heartbeats on
#       [peer-ip-addr]  IP address of peer to send packets to
#
ucast eth0 (ip_del_otro_servidor)
#
auto_failback   on
#       Tell what machines are in the cluster
#       node    nodename ...    -- must match uname -n
node    server1
node    server2
#
bcast   eth1

D’on es modifica el ‘ucast eth0 (ip_del_otro_servidor)‘ posant-li la IP de l’altre servidor (en el servidor primari es posa la IP del servidor secundari i en el secundari la del primari) i en node es posen els noms dels servers. Si s’utilitzara una altra interficie diferent a eth1, es modificaria el bcast.

Ja donem pas al haresources:

servidor1 drbddisk::r0 Filesystem::/dev/drbd1::/mnt::ext3 IPaddr2::192.168.1.10/24/eth1 apache2

Tot està a la mateixa línia, en primer lloc es posa el nom del servidor principal, després del drbddisk:: es posa el nom del resource que s’havia posat en el DRBD, supose que el que està en el filesystem no fa falta que ho explique, no? partició, punt de muntatge i format de la partició, jejeje
El punt de IPaddr2 és important, aquesta és la IP virtual. Gràcies a aquesta IP el sistema és redundant, ja que encara que cada servidor té una IP diferent, el servidor que estiga en actiu també respondrà a la IP virtual, tenint així sempre un servidor que responga a esta IP (a no ser que es paren els 2). Està format per la IP/màscara/interficie de xarxa.
I al final es posa els servicis a monitoritzar, en aquest cas he posat el apache2, que no ho he dit en aquest post però l’he instal·lat també per a poder ser monitoritzat.
Aquestos 3 fitxers de configuració seran iguals en els dos servidors (exeptuant l’apartat ucast del ha.cf)
Es reinicia el Heartbeat en els dos servidors, que si està tot correcte no donarà cap error
root@pc:/#/etc/init.d/heartbeat restart

I ja ho tenim funcionant!

Posada en marxa i comprovació

He posat “posada en marxa” però és mentida, ja està en marxa, dona igual és per a seguir els mateixos apartats en una aplicació que en l’altra.
El primer pas per a comprovar que el HeartBeat funciona correctament és fer un ping a la IP virtual, si respon es que està tot correcte, de vegades quan es posa en marxa per primera vegada li costa un poc respondre al ping.
I el segon pas de comprovació és simular la caiguda del servidor primar i comprovar que el secundari es ‘desperta’. Per a això deixem un ping constant a la IP virtual des d’una màquina que no siga ni el server1 ni el server2 i executem:
root@pc:/#/etc/init.d/heartbeat stop

El ping es pedrà per uns pocs segons i tornarà a fer-se. En aquest moment intentem accedir al punt de muntatge del servidor2 i es comprovarà que s’ha muntat automàticament.
Ara simulem que torna tot a la normalitat
root@pc:/#/etc/init.d/heartbeat start

I es veu que el ping es torna a perdre i torna a fer-se, també es comprova que la partició s’ha muntat en el servidor1 i que ja no està accesible des del servidor2.

Ara ja si que es pot dir que tenim el servidor redundant en marxa. Ara falta utilitzar-lo en algun servei, si puc més endavant penjaré en un nou post com muntar un servidor FTP amb usuari per MySQL sobre aquest sistema.

Webs d’interés
==============

http://www.drbd.org/users-guide/ –D’on he tret la instal·lació del DRBD
http://bytecoders.net/content/servidores-de-alta-disponibilidad-heartbeat.html –D’on he tret la instal·lació del HeartBeat
http://bytecoders.net/content/servidores-de-alta-disponibilidad-drbd.html –D’on he tret la instal·lació del HeartBeat
https://help.ubuntu.com/10.04/serverguide/C/drbd.html
http://www.howtoforge.com/drbd-on-centos-4.5