Što sam htio?
- raditi backup jednom dnevno na drugi HDD u računalu
- backup HDD ne smije biti uključen cijelo vrijeme zbog uštede energije
- 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> u #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 |