Potpuno automatski offline backup za šezdesetak kuna

Što sam htio?

  1. raditi backup jednom dnevno na drugi HDD u računalu
  2. backup HDD ne smije biti uključen cijelo vrijeme zbog uštede energije
  3. uključivanje HDD-a i cijeli backup moraju biti potpuno automatski preko shell skripte

1. Samo po sebi razumljivo.

2. Kod razrade sustava, drugi problem bio je malo teži za riješiti jer iako svi operativni sustavi podržavaju hotswap SATA diskova, to u pravilu ne funkcionira ako je ako je disk spojen cijelo vrijeme SATA kabelom i isključujemo mu napajanje. Izrada sklopa koji bi od sustava isključivao i SATA kabel i napajanje bila bi preskupa zbog broja releja koji su potrebni (samo za napajanje dovoljan je jedan).

Na kraju sam se odlučio za spajanje SATA hard diska putem SATA-to-USB adaptera, dok sklop isključuje napajanje. Kod uključenja napajanja ti adapteri prijavljuju sustavu novi disk i on ga uredno prepozna, kao što se vidi u dmesgu:

kernel: [261005.130086] usb 1-8: new high speed USB device using ehci_hcd and address 13
kernel: [261005.282437] usb 1-8: configuration #1 chosen from 1 choice
kernel: [261005.285433] scsi11 : SCSI emulation for USB Mass Storage devices
kernel: [261010.281628] scsi 11:0:0:0: Direct-Access     ST325082 4AS              L    PQ: 0 ANSI: 2 CCS
kernel: [261010.285138] sd 11:0:0:0: Attached scsi generic sg1 type 0
kernel: [261010.287471] sd 11:0:0:0: [sdb] 488397168 512-byte logical blocks: (250 GB/232 GiB)
kernel: [261010.288412] sd 11:0:0:0: [sdb] Write Protect is off
kernel: [261010.296302]  sdb: sdb1
kernel: [261010.317085] sd 11:0:0:0: [sdb] Attached SCSI disk

Kad isključimo napajanje, USB prepoznaje prazan adapter, koji će se opet refreshati kad uključimo napajanje, a to nam odgovara. USB-to-SATA adapteri mogu se za nekoliko dolara naći na eBayu.

3. Rješavanje trećeg zahtjeva bilo je relativno jednostavno uz malo znanja elektronike. Paralelni port na računalu vrlo je pogodan za upravljanje relejima jer se lako postavlja u stanje 1 ili 0 i u njemu ostaje do sljedeće naredbe (serijskom portu potrebno je neprekidno slati stanje 1 da bi u njemu ostao). Srećom, na Linuxu bez većih problema možemo pisati direktno na portove i imamo osam podatkovnih linija/bitova na raspolaganju.

Shemu porta možete naći ovdje, a tablicu konverzije iz dekadskog u binarni sustav ovdje (za slučaj da želite upravljati s više releja putem paralelnog porta) .

Shema elektroničkog sklopa koji se priključuje na paralelni port i prekida napajanje na SATA power konektoru preuzmite ovdje. Gotovi sklop priključit ćemo na bilo koji data pin paralelnog konektora i onda sve bitove postaviti u stanje 0 ili 1.

Ovime smo riješili hardverski dio sustava i možemo prijeći na softverski.

Upravljanje paralelnim portom

Za ovo ćemo iskoristiti jednostavan program pisan u C-u koji kao argument uzima dekadsku vrijednost i postavlja paralelni port u pravo stanje. Izvorni kod toga programa nalazi se ovdje. Da bi se program mogao kompilirati na novijim verzijama Ubuntua, potrebno je promijeniti zadnji include iz #include <asm/io.h>#include <sys/io.h>
Ispravljenu inačicu preuzmite sa sljedećeg linka: lptout.c
Skinite i kompajlirajte program.

wget http://sh.com.hr/wp-content/uploads/2010/07/lptout.c
gcc lptout.c

i dobit ćete izvršni program a.out.
Preimenovat ćemo ga i postaviti dozvole.

mv a.out lpt
chmod +x lpt

Ako vam je sklop priključen na računalo, možete provjeriti radi li relej slanjem sljedećih naredbi za uključenje, odnosno isključenje (u istom ste direktoriju kao i izvršni lpt).

sudo ./lpt 255 
sudo ./lpt 0

Shell skripta

Donja skripta će:
1. Uključiti napajanje diska, sve linije stavljamo u stanje 1
/home/uprava/backup/lpt 255
2. Pričekat ćemo 60 sekundi sustav prepozna priključeni disk.
3. Pokrenut ćemo fsck jer je obavezan svaki određeni broj montiranja diska ($dev je varijabla s nazivom uređaja, recimo /dev/sdb1)
/sbin/e2fsck -p $dev
4. Montirat ćemo pogon
mount /mnt/backup
5. Pripremit ćemo dodatne datoteke za backup, popis instaliranih paketa i backup svih MySQL baza.

dpkg --get-selections > /home/uprava/instalirani-paketi.txt
DBS="$(mysql -u root -h localhost -pPASSWORD -Bse 'show databases')"
for db in $DBS do
mysqldump -u root -h localhost -pPASSWORD $db | gzip -9 > /home/uprava/mysql-$db.gz
done

6. Izvršiti sam backup, u ovome slučaju rsync koji radi identičnu kopiju direktorija na drugome disku.
rsync -ahv –delete –ignore-errors –exclude-from ‘exclude’ /home /mnt/backup/
7. Ispisati u log iskorištenost prostora na backup disku, skriptu za to možete naći ovdje. U mom slučaju, glavna  backup skripta pokretala je ovu.
8. Demontirati pogon
umount /mnt/backup
9. Isključiti napajanje
/home/uprava/backup/lpt 0

cron job

Treba dodati i cron zadatak koji će tu backup skriptu pokretati svakoga dana, obavezno pod root userom. Otvorite crontab datoteku korisnika…
sudo crontab -e
I dodajte liniju sličnu ovoj, koja ima punu putanju do vaše backup skripte. Ja sam odabrao pokretanje svakoga jutra u 4:18h.
18 4 * * * /home/uprava/backup/backup.sh

 Cijela skripta

U ovoj skripti idemo s pretpostavkom da u datoteci /etc/fstab imate unaprijed ispravno definirane parametre backup diska. Trudio sam se iskomentirati sve važnije detalje. Skripta u log ili na stdout ispisuje sve što radi, pa nije problem pronaći uzroke eventualnih problema.

#!/bin/bash
# skripta za backup
# Autor: Ivan Biuklija
# v. 1.4
# Konfiguracija

mnt="/mnt/backup" # Direktorij u koji treba montirati disk
dev="/dev/sdb1" # putanja do diska/particije koju treba montirati
lptout="/home/uprava/pport/lptout" # putanja do lptout programa

# kraj konfiguracije

$lptout 255 # Uključujemo disk
echo -e "Disk uključen \n"
sleep 60 # čekamo 60 sek da sustav prepozna USB disk.

# FSCK i mount

if [ -e $dev ]; then
echo -e "FSCK it up! \n"
/sbin/e2fsck -p $dev
echo -e "Disk pronađen, montiram... \n"
mount $mnt
else
echo -e "Disk nije pronadjen! Prekidam skriptu."
exit 1
fi

# Provjeravamo je li disk montiran

if [ -d $mnt/lost+found ]; then
echo -e "Disk montiran."
else
echo -e "Pogreška: disk nije montiran. Prekidam skriptu!"
exit 1
fi

# ažuriramo popis instaliranih paketa

apt-cache pkgnames > /home/uprava/pkgnames.txt
dpkg --get-selections > /home/uprava/instalirani-paketi.txt

# dumpamo sve SQL baze
DBS="$(mysql -u root -h localhost -pPASSWORD -Bse 'show databases')"
for db in $DBS
do
mysqldump -u root -h localhost -pPASSWORD $db | gzip -9 > /home/uprava/mysql-$db.gz
done

# Backupiramo direktorije koje želimo, ovo je samo primjer.

rsync -ahv --delete --ignore-errors --exclude-from '/home/uprava/backup/exclude' /home /mnt/backup/system
rsync -avh --delete --ignore-errors --exclude-from '/home/uprava/backup/exclude' /etc /mnt/backup/system
rsync -ahv --delete --ignore-errors --exclude-from '/home/uprava/backup/exclude' /root /mnt/backup/system
rsync -avh --delete --ignore-errors '/mnt/media/music' /mnt/backup/media

# Gotov backup. Pokrenimo skriptu za provjeru prostora na disku.

echo -e "\nBackup dovršen. Iskorištenost diskova: \n"
/home/uprava/backup/space.sh

# Demontiramo disk

echo -e "\nDemontiram disk... \n"
umount $mnt

# čekamo da demontiranje završi

sleep 2

# Provjeravamo je li disk demontiran i isključujemo napajanje

if [ -d $mnt/lost+found ]; then
echo -e "\nDisk nije demontiran! Prekidam skriptu. PANIC!"
exit 1
else
echo -e "Disk je uspješno demontiran, isključujem disk.\n"
$lptout 0
fi

# čekamo da se USB port oporavi

sleep 30

# provjeravamo je li disk isključen

if [ -e $dev ]; then
echo -e "Pogreška: disk nije ugašen! \n"
exit 1
else
echo -e "\nDisk je ugašen. Hev a najs dej!"
exit 0
fi
exit 0

Cijena materijala

Cijene su okvirne.

1 x relej 12V, 5A, dva prekidača 18.00 kn
1 x optocoupler 6.00 kn
2 x otpornik 22o R 0.60 kn
1 x dioda 1N4148 0.30 kn
1 x tranzistor 2N2222 2.80 kn
tiskana pločica 10.00 kn
SATA power adapter / molex 6.00 kn
USB – SATA adapter 18.00 kn
UKUPNO 61.70 kn

Odgovori

Ova web-stranica koristi Akismet za zaštitu protiv spama. Saznajte kako se obrađuju podaci komentara.