Wednesday, March 11, 2009
Thursday, March 5, 2009
Monitorizarea retelei cu netstat
Incercati sa tastati in consola "netstat" si veti optine o lista imensa de informatii , chiar mai mult decat puteti da scrooll , si pt a lamuri lucrurile exista posibilitatea de a extrage numai informatia dorita din totalul informatiilor afishate de netstat
De exemplu, daca se doreste numai vizualizarea conexiunilor tcp se tasteaza comanda "#netstat --tcp" care afisiaza conexiunile tcp inspre si dinspre PC.
In exemplul de mai jos se poate intelege clar informatiile afishate
993 (imaps), 143 (imap), 110 (pop3), 25 (smtp), and 22 (ssh). 389 (ldap).
Nota: Pentru a acelera afishare se poate utiliza o optiune adaugatoare --numeric care va afisha numai IP-urile la care sa facut conexiunea.
% netstat --tcp --numeric
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.128.152:993 192.168.128.120:3853 ESTABLISHED
tcp 0 0 192.168.128.152:143 192.168.128.194:3076 ESTABLISHED
tcp 0 0 192.168.128.152:45771 192.168.128.34:389 TIME_WAIT
tcp 0 0 192.168.128.152:110 192.168.33.123:3521 TIME_WAIT
tcp 0 0 192.168.128.152:25 192.168.231.27:44221 TIME_WAIT
tcp 0 256 192.168.128.152:22 192.168.128.78:47258 ESTABLISHED
I cazul in care doriti sa vedeti cu ce se mai ocupa calculatorul in lipsa voastra si anume ce porturi sunt ascultate si de cine puteti utiliza comanda cu optiunea "#netstat --tcp --listening", la care se mai poate adauga si parametrul "--programs" care mai indica si ce proces este implicat in ascultarea si receptionare pe un anume port.
In exemplul de mai jos sunt implicate urmatoarele procese pe porturile 80 (www), 443 (https), 22 (ssh), si 25 (smtp);
# sudo netstat --tcp --listening --programs
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:www *:* LISTEN 28826/apache2
tcp 0 0 *:ssh *:* LISTEN 26604/sshd
tcp 0 0 *:smtp *:* LISTEN 6836/
tcp 0 0 *:https *:* LISTEN 28826/apache2
Nota: Utilizand optiunea adaugatoare "--all" afiseaza ambele, conexiunile si porturile ascultate.
Nota: Pentru a putea utiliza comanda sudo, acest pachet trebuie sa fie instalat in systemul Dumneavoastra.
Urmatorul exemplu "#netstat --route" ne va afisha tabela de route-are. Pentru un simplu utilizator aceasta comanda nu poate fi de mare folos dar pentru un administrator de retea poate fi foarte utila daca are pe sistem mai multe placi de retea sau pe o placa de retea sa fie atribuite mai multe adrese IP.
% netstat --route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.1.1 0.0.0.0 UG 1 0 0 eth0
Ultimul exemplu netstat utilizeaza optiunea "--statistics" care afishaza statisticele de retea, folosind aceasta optiune de una singura va afisa toate statisticile IP, TCP, UDP, si ICMP, iar pt a sistematiza si organiza fluxul de informatii provenit de la aceasta optiune se pot utiliza sub otiuni ajutatoare care pot delimita anumite informatii necesari. De exemplu pentru a vizualiza statisticile output din " --row " combinate cu uptime se poate vizualiza genereaza masina voastra zilnic.
% netstat --statistics --raw
Ip:
620516640 total packets received
0 forwarded
0 incoming packets discarded
615716262 incoming packets delivered
699594782 requests sent out
5 fragments dropped after timeout
3463529 reassemblies required
636730 packets reassembled ok
5 packet reassembles failed
310797 fragments created
// ICMP statistics truncated
Nota: Pt cei care nu se impaca foarte bine cu consola se pot folosi abrevieri ale optiunilor prezentate mai sus. (e.g. netstat -tn, netstat -tlp, netstat -r, si netstat -sw).
Pentru a putea aprecia adevarata putere a acestui mic utilitar incercati #man 8 netstat।
SURSA
De exemplu, daca se doreste numai vizualizarea conexiunilor tcp se tasteaza comanda "#netstat --tcp" care afisiaza conexiunile tcp inspre si dinspre PC.
In exemplul de mai jos se poate intelege clar informatiile afishate
993 (imaps), 143 (imap), 110 (pop3), 25 (smtp), and 22 (ssh). 389 (ldap).
Nota: Pentru a acelera afishare se poate utiliza o optiune adaugatoare --numeric care va afisha numai IP-urile la care sa facut conexiunea.
% netstat --tcp --numeric
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.128.152:993 192.168.128.120:3853 ESTABLISHED
tcp 0 0 192.168.128.152:143 192.168.128.194:3076 ESTABLISHED
tcp 0 0 192.168.128.152:45771 192.168.128.34:389 TIME_WAIT
tcp 0 0 192.168.128.152:110 192.168.33.123:3521 TIME_WAIT
tcp 0 0 192.168.128.152:25 192.168.231.27:44221 TIME_WAIT
tcp 0 256 192.168.128.152:22 192.168.128.78:47258 ESTABLISHED
I cazul in care doriti sa vedeti cu ce se mai ocupa calculatorul in lipsa voastra si anume ce porturi sunt ascultate si de cine puteti utiliza comanda cu optiunea "#netstat --tcp --listening", la care se mai poate adauga si parametrul "--programs" care mai indica si ce proces este implicat in ascultarea si receptionare pe un anume port.
In exemplul de mai jos sunt implicate urmatoarele procese pe porturile 80 (www), 443 (https), 22 (ssh), si 25 (smtp);
# sudo netstat --tcp --listening --programs
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:www *:* LISTEN 28826/apache2
tcp 0 0 *:ssh *:* LISTEN 26604/sshd
tcp 0 0 *:smtp *:* LISTEN 6836/
tcp 0 0 *:https *:* LISTEN 28826/apache2
Nota: Utilizand optiunea adaugatoare "--all" afiseaza ambele, conexiunile si porturile ascultate.
Nota: Pentru a putea utiliza comanda sudo, acest pachet trebuie sa fie instalat in systemul Dumneavoastra.
Urmatorul exemplu "#netstat --route" ne va afisha tabela de route-are. Pentru un simplu utilizator aceasta comanda nu poate fi de mare folos dar pentru un administrator de retea poate fi foarte utila daca are pe sistem mai multe placi de retea sau pe o placa de retea sa fie atribuite mai multe adrese IP.
% netstat --route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.1.1 0.0.0.0 UG 1 0 0 eth0
Ultimul exemplu netstat utilizeaza optiunea "--statistics" care afishaza statisticele de retea, folosind aceasta optiune de una singura va afisa toate statisticile IP, TCP, UDP, si ICMP, iar pt a sistematiza si organiza fluxul de informatii provenit de la aceasta optiune se pot utiliza sub otiuni ajutatoare care pot delimita anumite informatii necesari. De exemplu pentru a vizualiza statisticile output din " --row " combinate cu uptime se poate vizualiza genereaza masina voastra zilnic.
% netstat --statistics --raw
Ip:
620516640 total packets received
0 forwarded
0 incoming packets discarded
615716262 incoming packets delivered
699594782 requests sent out
5 fragments dropped after timeout
3463529 reassemblies required
636730 packets reassembled ok
5 packet reassembles failed
310797 fragments created
// ICMP statistics truncated
Nota: Pt cei care nu se impaca foarte bine cu consola se pot folosi abrevieri ale optiunilor prezentate mai sus. (e.g. netstat -tn, netstat -tlp, netstat -r, si netstat -sw).
Pentru a putea aprecia adevarata putere a acestui mic utilitar incercati #man 8 netstat।
SURSA
Desktop Firewall
1. Instalare
Presupunem un calculator Linux cu un kernel din seria 2.4 sau 2.6. Kernelul se configurează în prealabil setând opţiunea "netfilter" în "Network Options":
A 2.6.11 kernel:
< > The IPv6 protocol (EXPERIMENTAL)
[*] Network packet filtering (replaces ipchains) --->
SCTP Configuration (EXPERIMENTAL) --->
iar apoi în "Network packet filtering/Netfilter Configuration" setăm toate opţiunile pentru a fi compilate în kernel.
Trebuie apoi să instalăm pachetul iptables. În Gentoo comanda arată în felul următor:
# emerge iptables
2. O scurtă introducere în iptables
Primul lucru pe care îl facem este să vedem dacă este ceva deja activ - unele distribuţii setează reguli în iptables la startup:
iptable ne informează că există trei lanţuri active: INPUT pentru pachete care intră în calculator, OUTPUT pentru pachete care ies din calculator şi FORWARD pentru pachetele care sunt routate în cazul în care calculatorul funcţionează ca un router. Pentru fiecare lanţ, putem avea un număr de reguli active.
Regulile sunt relativ uşor de citit. Cea pe care o avem mai sus se referă la toate pachetele care vin de la un server doublecklick.net. Nu este o surpriză că aceste pachete sunt rejectate; acelaşi lucru poate fi obţinut mult mai uşor instalând extensia Adblock în Firefox.
Fiecare lanţ poate fi utilizat având ca default fie să accepte orice pachet cu excepţia celor specificate în regulile aferente, fie să rejecteze orice pachet cu excepţia celor specificate. Există astfel două tipuri mari de firewall-uri: default drop şidefault accept. Trecere de la un tip la altul se face uşor folosind opţiunea -P:
3. Comenzi iptables
Parametrii comenzii iptables se împart în trei categorii:
# iptable [lanþ] [pachet] [acþiune]
În categoria lanţ avem următoarele opţiuni:
În categoria care descrie pachetele avem:
O serie de extensii sunt definite pentru unele din opţiunile pachet de mai sus:
Mai multe extensii pot fi încărcate ca module folosind opţiunea -m:
A treia categorie descrie acţiunea care trebuie îndeplinită când un pachet este recunoscut:
În continuare descriem un firewall default drop.
4. Un firewall simplu
Presupunem că suntem conectaţi la o reţea de Ethernet pe interfaţa eth0. Începem prin a curăţa toate regulile existente (comanda -F), şi setăm firewall-ul pentru default drop:
Avem în acest moment un firewall perfect şi total nefolositor. Toate pachetele care ajung la noi vor fi făcute pierdute de către kernel. Adăugăm o regulă simplă care să ne permită să accesăm pachetele aparţinând acelor conexiuni care au fost iniţiate de către calculatorul nostru:
Kernelul Linux are un modul numit conntrack care urmăreşte toate conexiunile care au loc la un moment dat. Fiecărei conexiuni îi sunt asociate una din cele patru stări posibile: NEW (o conexiune nouă), ESTABLISHED (o conexiune activă), RELEATED (conexiuni noi care sunt un rezultat al unei conexiuni existente) şi INVALID (conexiuni care au ajuns într-o stare defectă).
Revenind la comanda de mai sus, -A adaugă o nouă regulă pe lanţul INPUT. Această regulă se referă la toate pachetele care aparţin unei conexiuni în stare RELATED sau ESTABLISHED, iar aceste pachete sunt acceptate (-j). Observaţi aici lipsa stării NEW, adică toate conexiunile pornite din exterior sunt refuzate.
Apare însă o mică problemă: cineva din exterior încercând să se conecteze la calculatorul nostru poate în acest moment detecta că rulăm un firewall deoarece calculatorul nu răspunde cu pachetele standard TCP reset sau ICMP unreachable. Aceasta poate fi reparată foarte uşor adăugând următoarele două reguli:
O altă mică scăpare este următoarea: dorim uneori să rulăm pe calculator un server de HTTP numai pentru uzul nostru, invizibil în exterior. Cum regulile de mai sus vor rejecta pachetele pentru conexiunile în starea NEW trebuie să adăugăm o nouă regulă ACCEPT din care să excludem interfaţa publică de Ethernet eth0:
Punem totul la un loc şi construim un script simplu:
Nu avem decât să rulăm scriptul şi să-l testăm:
O listă a conexiunilor existente poate fi găsită astfel:
Dacă dorim să pornim acest firewall la startup, copiem fwall.sh în directorul /sbin iar apoi adăugăm linia "/sbin/fwall.sh start &" la sfârşitul fişierului /etc/conf.d/local.start. În mod asemănător, adăugăm "/sbin/fwall.sh stop &" la sfârşitul fişierului /etc/conf.d/local.stop.
scriptul original al lui Daniel Robbins este prezentat în Anexa 1, şi include o serie de îmbunătăţiri cum ar fi: disable ECN (explicit congestion notification), spoof protection, suport pentru routing (nu este necesar în cazul nostru simplu de desktop), suport pentru o serie de servicii precum ssh şi http.
5. Firewall dinamic - dynfw
Sub acest nume, gentoo.org publică un mic proiect care nu face parte oficial din distribuţia Gentoo. Constă într-o serie de scripturi original scrise de Daniel Robbins. Scopul acestor scripturi este acela de a adăuga/elimina reguli iptables fără a modifica scriptul iniţial de firewall care rulează pe calculator.
Pachetul se găseşte la http://tirpitz.iat.sfu.ca/~robbat2/dynfw-1.0.1.tar.gz. Download, dezarhivăm şi-l instalăm:
Sunt incluse următoarele scripturi:
Să zicem că rulăm pe calculator un un server ftp (scriptul din Anexa 1 este activ cu SERVICES="ftp"), iar un utilizator de la adresa IP 1.2.3.4 insistă prea tare să încarce fişiere peste limitele acceptate, consumând o grămadă de bandwidth. Comanda arată în felul următor:
Observăm cum o regulă DROP este adăugată pe toate cele trei lanţuri. Aceasta împedică efectiv orice fel de comunicaţie cu acest user. Pentru a curăţa aceste reguli şi a restaura firewall-ul iniţial dăm comanda:
În mod similar se folosesc şi celelalte scripturi. Rulaţi comanda respectivă fără nici un parametru pentru o scurtă descriere.
6. Resurse
Articolul original al lui Daniel Robbins: http://www6.software.ibm.com/developerworks/education/l-fw/index.html(registration).
dynfw homepage: http://www.gentoo.org/proj/en/dynfw.xml
netfilter/iptable homepage: http://www.netfilter.org.
Tutorialul iptables al lui Oskar Andreasson: http://iptables-tutorial.frozentux.net/iptables-tutorial.html
HOWTO Iptables for newbies: http://gentoo-wiki.com/HOWTO_Iptables_for_newbies
Anexa 1
Presupunem un calculator Linux cu un kernel din seria 2.4 sau 2.6. Kernelul se configurează în prealabil setând opţiunea "netfilter" în "Network Options":
A 2.6.11 kernel:
< > The IPv6 protocol (EXPERIMENTAL)
[*] Network packet filtering (replaces ipchains) --->
SCTP Configuration (EXPERIMENTAL) --->
iar apoi în "Network packet filtering/Netfilter Configuration" setăm toate opţiunile pentru a fi compilate în kernel.
Trebuie apoi să instalăm pachetul iptables. În Gentoo comanda arată în felul următor:
# emerge iptables
2. O scurtă introducere în iptables
Primul lucru pe care îl facem este să vedem dacă este ceva deja activ - unele distribuţii setează reguli în iptables la startup:
# iptable -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- eqnjadvip3.doubleclick.net anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- eqnjadvip3.doubleclick.net anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
iptable ne informează că există trei lanţuri active: INPUT pentru pachete care intră în calculator, OUTPUT pentru pachete care ies din calculator şi FORWARD pentru pachetele care sunt routate în cazul în care calculatorul funcţionează ca un router. Pentru fiecare lanţ, putem avea un număr de reguli active.
Regulile sunt relativ uşor de citit. Cea pe care o avem mai sus se referă la toate pachetele care vin de la un server doublecklick.net. Nu este o surpriză că aceste pachete sunt rejectate; acelaşi lucru poate fi obţinut mult mai uşor instalând extensia Adblock în Firefox.
Fiecare lanţ poate fi utilizat având ca default fie să accepte orice pachet cu excepţia celor specificate în regulile aferente, fie să rejecteze orice pachet cu excepţia celor specificate. Există astfel două tipuri mari de firewall-uri: default drop şidefault accept. Trecere de la un tip la altul se face uşor folosind opţiunea -P:
# iptables -P INPUT DROP
# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
3. Comenzi iptables
Parametrii comenzii iptables se împart în trei categorii:
# iptable [lanþ] [pachet] [acþiune]
În categoria lanţ avem următoarele opţiuni:
-N: (new)un nou lanþ este creat
-X: un lanþ fãrã reguli este ºters
-P: (policy) trecere de la default drop la default accept ºi invers
-F: (flush) ºterge toate regulile în lanþul respectiv
-Z: (zero) reseteazã contoarele pentru toate regulile din lanþ
-A: (add) adaugã o nouã regulã în lanþ
-I: (insert) insereazã o nouã regulã în lanþ
-R: (replace) schimbã o regulã existentã în lanþ
-D: (delete) ºterge o regulã existentã
-X: un lanþ fãrã reguli este ºters
-P: (policy) trecere de la default drop la default accept ºi invers
-F: (flush) ºterge toate regulile în lanþul respectiv
-Z: (zero) reseteazã contoarele pentru toate regulile din lanþ
-A: (add) adaugã o nouã regulã în lanþ
-I: (insert) insereazã o nouã regulã în lanþ
-R: (replace) schimbã o regulã existentã în lanþ
-D: (delete) ºterge o regulã existentã
În categoria care descrie pachetele avem:
-s, -d: adresã sursã/destinaþie IP
-p: protocol (tcp, udp, icmp)
-i: interfaþã (lo, eth0, eth1, ppp0, etc.)
-f: fragmentare
-p: protocol (tcp, udp, icmp)
-i: interfaþã (lo, eth0, eth1, ppp0, etc.)
-f: fragmentare
O serie de extensii sunt definite pentru unele din opţiunile pachet de mai sus:
Dacã '-p tcp' este specificat:
--sport, --dport: porturi sursã/destinaþie
--tcp-flags: flaguri tcp
--syn: echivalent cu '--tcp_flags SYN,RST,ACK SYN'
--tcp-option
Dacã '-p udp' este specificat:
--sport, --dport: porturi sursã/destinaþie
Dacã '-p icmp' este specificat:
--icmp-type: rulaþi '-p icmp --help' pentru o listã completã
--sport, --dport: porturi sursã/destinaþie
--tcp-flags: flaguri tcp
--syn: echivalent cu '--tcp_flags SYN,RST,ACK SYN'
--tcp-option
Dacã '-p udp' este specificat:
--sport, --dport: porturi sursã/destinaþie
Dacã '-p icmp' este specificat:
--icmp-type: rulaþi '-p icmp --help' pentru o listã completã
Mai multe extensii pot fi încărcate ca module folosind opţiunea -m:
Dacã '-m mac' este specificat:
--mac_source: adresã sursã mac
Dacã '-m limit' este specificat:
--limit: limiteazã numãrul de pachete acceptate pe secundã/minut/orã/ziuã
--limit-burst
Dacã '-m owner' este specificat, pentru pachete generate local:
--uid-owner
--gid-owner
--pid-owner
--sid-owner
Dacã '-m state' este specificat:
--state: starea conexiunii (NEW, ESTABLISHED, RELATED, INVALID)
--mac_source: adresã sursã mac
Dacã '-m limit' este specificat:
--limit: limiteazã numãrul de pachete acceptate pe secundã/minut/orã/ziuã
--limit-burst
Dacã '-m owner' este specificat, pentru pachete generate local:
--uid-owner
--gid-owner
--pid-owner
--sid-owner
Dacã '-m state' este specificat:
--state: starea conexiunii (NEW, ESTABLISHED, RELATED, INVALID)
A treia categorie descrie acţiunea care trebuie îndeplinită când un pachet este recunoscut:
-j: DROP, ACCEPT, LOG
În continuare descriem un firewall default drop.
4. Un firewall simplu
Presupunem că suntem conectaţi la o reţea de Ethernet pe interfaţa eth0. Începem prin a curăţa toate regulile existente (comanda -F), şi setăm firewall-ul pentru default drop:
# iptables -F
# iptables -P INPUT DROP
# iptables -P INPUT DROP
Avem în acest moment un firewall perfect şi total nefolositor. Toate pachetele care ajung la noi vor fi făcute pierdute de către kernel. Adăugăm o regulă simplă care să ne permită să accesăm pachetele aparţinând acelor conexiuni care au fost iniţiate de către calculatorul nostru:
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Kernelul Linux are un modul numit conntrack care urmăreşte toate conexiunile care au loc la un moment dat. Fiecărei conexiuni îi sunt asociate una din cele patru stări posibile: NEW (o conexiune nouă), ESTABLISHED (o conexiune activă), RELEATED (conexiuni noi care sunt un rezultat al unei conexiuni existente) şi INVALID (conexiuni care au ajuns într-o stare defectă).
Revenind la comanda de mai sus, -A adaugă o nouă regulă pe lanţul INPUT. Această regulă se referă la toate pachetele care aparţin unei conexiuni în stare RELATED sau ESTABLISHED, iar aceste pachete sunt acceptate (-j). Observaţi aici lipsa stării NEW, adică toate conexiunile pornite din exterior sunt refuzate.
Apare însă o mică problemă: cineva din exterior încercând să se conecteze la calculatorul nostru poate în acest moment detecta că rulăm un firewall deoarece calculatorul nu răspunde cu pachetele standard TCP reset sau ICMP unreachable. Aceasta poate fi reparată foarte uşor adăugând următoarele două reguli:
# iptables -A INPUT -p tcp -i eth0 -j REJECT --reject-with tcp-reset
# iptables -A INPUT -p udp -i eth0 -j REJECT --teject-with icmp-port-unreachable
# iptables -A INPUT -p udp -i eth0 -j REJECT --teject-with icmp-port-unreachable
O altă mică scăpare este următoarea: dorim uneori să rulăm pe calculator un server de HTTP numai pentru uzul nostru, invizibil în exterior. Cum regulile de mai sus vor rejecta pachetele pentru conexiunile în starea NEW trebuie să adăugăm o nouă regulă ACCEPT din care să excludem interfaţa publică de Ethernet eth0:
# iptables -A input -i ! eth0 -j ACCEPT
Punem totul la un loc şi construim un script simplu:
#!/bin/bash
# fwall.sh - un firewall simplu
# dupã un exemplu de Daniel Robbins
if [ "$1" = "start" ]
then
echo "Starting firewall"
iptables -P INPUT DROP
iptables -A INPUT -i ! eth0 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -i eth0 -j REJECT --reject-with tcp-reset
iptables -A INPUT -p udp -i eth0 -j REJECT --reject-with icmp-port-unreachable
elif [ "$1" == "stop" ]
then
echo "Stopping firewall"
iptables -F INPUT
iptables -P INPUT ACCEPT
fi
# fwall.sh - un firewall simplu
# dupã un exemplu de Daniel Robbins
if [ "$1" = "start" ]
then
echo "Starting firewall"
iptables -P INPUT DROP
iptables -A INPUT -i ! eth0 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -i eth0 -j REJECT --reject-with tcp-reset
iptables -A INPUT -p udp -i eth0 -j REJECT --reject-with icmp-port-unreachable
elif [ "$1" == "stop" ]
then
echo "Stopping firewall"
iptables -F INPUT
iptables -P INPUT ACCEPT
fi
Nu avem decât să rulăm scriptul şi să-l testăm:
# ./fwall.sh start
# iptables -v -L
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- !eth0 any anywhere anywhere
82 40719 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
1 60 REJECT tcp -- eth0 any anywhere anywhere reject-with tcp-reset
369 59386 REJECT udp -- eth0 any anywhere anywhere reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 31329 packets, 2004K bytes)
pkts bytes target prot opt in out source destination
# iptables -v -L
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- !eth0 any anywhere anywhere
82 40719 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
1 60 REJECT tcp -- eth0 any anywhere anywhere reject-with tcp-reset
369 59386 REJECT udp -- eth0 any anywhere anywhere reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 31329 packets, 2004K bytes)
pkts bytes target prot opt in out source destination
O listă a conexiunilor existente poate fi găsită astfel:
# cat /proc/net/ip_conntrack
Dacă dorim să pornim acest firewall la startup, copiem fwall.sh în directorul /sbin iar apoi adăugăm linia "/sbin/fwall.sh start &" la sfârşitul fişierului /etc/conf.d/local.start. În mod asemănător, adăugăm "/sbin/fwall.sh stop &" la sfârşitul fişierului /etc/conf.d/local.stop.
scriptul original al lui Daniel Robbins este prezentat în Anexa 1, şi include o serie de îmbunătăţiri cum ar fi: disable ECN (explicit congestion notification), spoof protection, suport pentru routing (nu este necesar în cazul nostru simplu de desktop), suport pentru o serie de servicii precum ssh şi http.
5. Firewall dinamic - dynfw
Sub acest nume, gentoo.org publică un mic proiect care nu face parte oficial din distribuţia Gentoo. Constă într-o serie de scripturi original scrise de Daniel Robbins. Scopul acestor scripturi este acela de a adăuga/elimina reguli iptables fără a modifica scriptul iniţial de firewall care rulează pe calculator.
Pachetul se găseşte la http://tirpitz.iat.sfu.ca/~robbat2/dynfw-1.0.1.tar.gz. Download, dezarhivăm şi-l instalăm:
wget http://tirpitz.iat.sfu.ca/~robbat2/dynfw-1.0.1.tar.gz
tar -xzvf dynfw-1.0.1.tar.gz
cd dynfw-1.0.1
./install.sh
tar -xzvf dynfw-1.0.1.tar.gz
cd dynfw-1.0.1
./install.sh
Sunt incluse următoarele scripturi:
ipdrop - rejecteazã toate pachetele care vin de la o adresã IP specificatã
ipblock - similar cu ipdrop, rãspunde însã cu TCP reset
tcplimt - limiteazã rata noilor conexiuni pentru un port local TCP specificat
host-tcplimit - limiteazã rata noilor conexiuni de la un host extern specificat
user-outblock - un user specificat nu este lãsat sã deschidã conexiuni în exterior
ipblock - similar cu ipdrop, rãspunde însã cu TCP reset
tcplimt - limiteazã rata noilor conexiuni pentru un port local TCP specificat
host-tcplimit - limiteazã rata noilor conexiuni de la un host extern specificat
user-outblock - un user specificat nu este lãsat sã deschidã conexiuni în exterior
Să zicem că rulăm pe calculator un un server ftp (scriptul din Anexa 1 este activ cu SERVICES="ftp"), iar un utilizator de la adresa IP 1.2.3.4 insistă prea tare să încarce fişiere peste limitele acceptate, consumând o grămadă de bandwidth. Comanda arată în felul următor:
# /usr/local/sbin/ipdrop 1.2.3.4 on
# iptables -vL
Chain INPUT (policy DROP 1 packets, 60 bytes)
pkts bytes target prot opt in out source destination
2 96 DROP all -- any any 1.2.3.4 anywhere
0 0 ACCEPT all -- !eth0 any anywhere anywhere
324 182K ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
3 144 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ftp state NEW
0 0 REJECT tcp -- eth0 any anywhere anywhere reject-with tcp-reset
1261 208K REJECT udp -- eth0 any anywhere anywhere reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- any any anywhere 1.2.3.4
Chain OUTPUT (policy ACCEPT 1652 packets, 129K bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- any any anywhere 1.2.3.4
# iptables -vL
Chain INPUT (policy DROP 1 packets, 60 bytes)
pkts bytes target prot opt in out source destination
2 96 DROP all -- any any 1.2.3.4 anywhere
0 0 ACCEPT all -- !eth0 any anywhere anywhere
324 182K ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
3 144 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ftp state NEW
0 0 REJECT tcp -- eth0 any anywhere anywhere reject-with tcp-reset
1261 208K REJECT udp -- eth0 any anywhere anywhere reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- any any anywhere 1.2.3.4
Chain OUTPUT (policy ACCEPT 1652 packets, 129K bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- any any anywhere 1.2.3.4
Observăm cum o regulă DROP este adăugată pe toate cele trei lanţuri. Aceasta împedică efectiv orice fel de comunicaţie cu acest user. Pentru a curăţa aceste reguli şi a restaura firewall-ul iniţial dăm comanda:
# /usr/local/sbin/ipdrop 1.2.3.4 off
În mod similar se folosesc şi celelalte scripturi. Rulaţi comanda respectivă fără nici un parametru pentru o scurtă descriere.
6. Resurse
Articolul original al lui Daniel Robbins: http://www6.software.ibm.com/developerworks/education/l-fw/index.html(registration).
dynfw homepage: http://www.gentoo.org/proj/en/dynfw.xml
netfilter/iptable homepage: http://www.netfilter.org.
Tutorialul iptables al lui Oskar Andreasson: http://iptables-tutorial.frozentux.net/iptables-tutorial.html
HOWTO Iptables for newbies: http://gentoo-wiki.com/HOWTO_Iptables_for_newbies
Anexa 1
#!/bin/bash
#Our complete stateful firewall script. This firewall can be customized for
#a laptop, workstation, router or even a server. :)
#change this to the name of the interface that provides your "uplink"
#(connection to the Internet)
UPLINK="eth0"
#if you're a router (and thus should forward IP packets between interfaces),
#you want ROUTER="yes"; otherwise, ROUTER="no"
ROUTER="no"
#change this next line to the static IP of your uplink interface for static SNAT, or
#"dynamic" if you have a dynamic IP. If you don't need any NAT, set NAT to "" to
#disable it.
#NAT="1.2.3.4"
NAT=""
#change this next line so it lists all your network interfaces, including lo
#INTERFACES="lo eth0 eth1"
INTERFACES="lo eth0"
#change this line so that it lists the assigned numbers or symbolic names (from
#/etc/services) of all the services that you'd like to provide to the general
#public. If you don't want any services enabled, set it to ""
#SERVICES="http ftp smtp ssh rsync"
SERVICES=""
if [ "$1" = "start" ]
then
echo "Starting firewall..."
iptables -P INPUT DROP
iptables -A INPUT -i ! ${UPLINK} -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#enable public access to certain services
for x in ${SERVICES}
do
iptables -A INPUT -p tcp --dport ${x} -m state --state NEW -j ACCEPT
done
iptables -A INPUT -p tcp -i ${UPLINK} -j REJECT --reject-with tcp-reset
iptables -A INPUT -p udp -i ${UPLINK} -j REJECT --reject-with icmp-port-unreachable
#explicitly disable ECN
if [ -e /proc/sys/net/ipv4/tcp_ecn ]
then
echo 0 > /proc/sys/net/ipv4/tcp_ecn
fi
#disable spoofing on all interfaces
for x in ${INTERFACES}
do
echo 1 > /proc/sys/net/ipv4/conf/${x}/rp_filter
done
if [ "$ROUTER" = "yes" ]
then
#we're a router of some kind, enable IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
if [ "$NAT" = "dynamic" ]
then
#dynamic IP address, use masquerading
echo "Enabling masquerading (dynamic ip)..."
iptables -t nat -A POSTROUTING -o ${UPLINK} -j MASQUERADE
elif [ "$NAT" != "" ]
then
#static IP, use SNAT
echo "Enabling SNAT (static ip)..."
iptables -t nat -A POSTROUTING -o ${UPLINK} -j SNAT --to ${UPIP}
fi
fi
elif [ "$1" = "stop" ]
then
echo "Stopping firewall..."
iptables -F INPUT
iptables -P INPUT ACCEPT
#turn off NAT/masquerading, if any
iptables -t nat -F POSTROUTING
fi
#Our complete stateful firewall script. This firewall can be customized for
#a laptop, workstation, router or even a server. :)
#change this to the name of the interface that provides your "uplink"
#(connection to the Internet)
UPLINK="eth0"
#if you're a router (and thus should forward IP packets between interfaces),
#you want ROUTER="yes"; otherwise, ROUTER="no"
ROUTER="no"
#change this next line to the static IP of your uplink interface for static SNAT, or
#"dynamic" if you have a dynamic IP. If you don't need any NAT, set NAT to "" to
#disable it.
#NAT="1.2.3.4"
NAT=""
#change this next line so it lists all your network interfaces, including lo
#INTERFACES="lo eth0 eth1"
INTERFACES="lo eth0"
#change this line so that it lists the assigned numbers or symbolic names (from
#/etc/services) of all the services that you'd like to provide to the general
#public. If you don't want any services enabled, set it to ""
#SERVICES="http ftp smtp ssh rsync"
SERVICES=""
if [ "$1" = "start" ]
then
echo "Starting firewall..."
iptables -P INPUT DROP
iptables -A INPUT -i ! ${UPLINK} -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#enable public access to certain services
for x in ${SERVICES}
do
iptables -A INPUT -p tcp --dport ${x} -m state --state NEW -j ACCEPT
done
iptables -A INPUT -p tcp -i ${UPLINK} -j REJECT --reject-with tcp-reset
iptables -A INPUT -p udp -i ${UPLINK} -j REJECT --reject-with icmp-port-unreachable
#explicitly disable ECN
if [ -e /proc/sys/net/ipv4/tcp_ecn ]
then
echo 0 > /proc/sys/net/ipv4/tcp_ecn
fi
#disable spoofing on all interfaces
for x in ${INTERFACES}
do
echo 1 > /proc/sys/net/ipv4/conf/${x}/rp_filter
done
if [ "$ROUTER" = "yes" ]
then
#we're a router of some kind, enable IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
if [ "$NAT" = "dynamic" ]
then
#dynamic IP address, use masquerading
echo "Enabling masquerading (dynamic ip)..."
iptables -t nat -A POSTROUTING -o ${UPLINK} -j MASQUERADE
elif [ "$NAT" != "" ]
then
#static IP, use SNAT
echo "Enabling SNAT (static ip)..."
iptables -t nat -A POSTROUTING -o ${UPLINK} -j SNAT --to ${UPIP}
fi
fi
elif [ "$1" = "stop" ]
then
echo "Stopping firewall..."
iptables -F INPUT
iptables -P INPUT ACCEPT
#turn off NAT/masquerading, if any
iptables -t nat -F POSTROUTING
fi
O scurtă introducere în UTF8
1. Introducere
Acest articol este o scurtă introducere în UTF8 din perspectiva sistemului de operare Linux. Articolul este dedicat tuturor celor ce întâmpină în mod regulat dificultăţi în setarea caracterelor diacritice româneşti în diferite programe sub Linux. Toate exemplele de mai jos au fost încercate pe o distribuţie Gentoo, şi se presupune că pot fi replicate cu uşurinţă şi pe alte tipuri de distribuţii.
Scopul declarat al acestui articol este de a vă lăsa cu impresia că orice este posibil, inclusiv să folosiţi litere precum ş şi ţ pe un calculator pe care tocmai aţi cheltuit o sumă indecentă de bani, şi care "by default" nu ştie decât engleză.
2. Ce este UTF-8
Standardul ASCII (American Standard Code for Information Interchange) stă la baza seturilor de caractere folosite în toate sistemele de operare moderne. A fost adoptat în anul 1968 sub numele ANSIX3.4. Conform ASCII, caracterele limbii engleze sunt mapate în numere întregi pe 8 biţi. Această mapare acoperă 256 de caractere literare şi de control diferite. Bineînţeles, 256 de caractere nu acoperă toate limbile globului, aşadar în decursul timpului alte forme de mapare au fost definite. După o serie de iteraţii s-a ajuns la Unicode.
Originile standardului Unicode pot fi trasate către Bell Laboratories care ne-au adus în decursul timpului limbajul de programare C, sistemul de operare Unix iar mai târziu C++. Mecanismul a fost descris mai întâi de Ken Thompson şi Robert Pike în anul 1993, ca stând la baza sistemului de procesare de text în noul lor sistem de operare Plan9. A fost preluat apoi de X/Open Group şi inclus în ghidul de portabilitate intitulat XPG4 care stă la baza specificaţie Unix98.
Adoptat de către ISO în 1996 devine astfel standard internaţional sub numele de ISO-10646. Acest standard este suportat sub Linux, iar unele distribuţii (spre exemplu Fedora) sunt setate default pentru UTF8.
După cum se menţionează la http://www.unicode.org/, standardul Unicode prevede un cod numeric unic pentru fiecare caracter, pe orice platformă hardware, în orice program software, şi în orice limbă. Unicode este compatibil cu standardul ASCII astfel încât un document tipărit în ASCII poate fi interpretat corect în Unicode, dar nu şi invers.
Caracterele româneşti sunt reprezentate de următoarele coduri Unicode:
â - U00e2; Â - U00C2;
ă - U0103; Ă - U0102;
î - U00ee; Î - U00ce;
ş - U015f; Ş - U015e;
ţ - U0163; Ţ - U0162;
UTF8 este în esenţă o metodă de serializare a codurilor de caractere Unicode pe mai mulţi octeţi.
0x00000000 - 0x0000007F: 0xxxxxxx
0x00000080 - 0x000007FF: 110xxxxx 10xxxxxx
0x00000800 - 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 - 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0x00200000 - 0x03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0x04000000 - 0x7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
Caracterele româneşti sunt serializate pe doi octeţi în UTF8 după cum urmează:
ă - 0xc3, 0xa2; Â - 0xc3, 0x82;
ă - 0xc4, 0x83; Ă - 0xc4, 0x82;
î - 0xc3, 0xae; Î - 0xc3, 0x8e;
ş - 0xc5, 0x9f; Ş - 0xc5, 0x9e;
ţ - 0xc5, 0xa3; Ţ - 0xc5, 0xa2;
Exista trei lucruri despre care trebuie să discutăm în ceea ce priveşte o setare de caractere diacritice româneşti sub Linux: setarea tastaturii, setarea fonturilor şi setarea variabilei "locale".
3. Setare tastatură
Majoritatea tastaturilor comercializate în România sunt tastaturi de tip US. Aceasta se datoreşte preţului dar şi modului în care ne-am obişnuit să avem literele aşezate. Pe o asemenea tastatură putem mapa caracterele diacritice după cum urmează: cu tasta Alt din partea dreaptă a barei de spaţiu apăsată, tastele a, s, t, i devin diacritice, iar tasta q devine â.
Pentru a obţine acest efect începem prin a copia fişierul .Xmodmap în directorul home/user curent:
#cp /usr/lib/X11/etc/xmodmap.std .Xmodmap
Apoi, într-un program de editare modificăm .Xmodmap (sau cut&paste de aici). Rezultatul este următorul:
!
! $XFree86: xc/programs/Xserver/hw/xfree86/etc/xmodmap.std,v 3.4 1996/02/04 09:09:12 dawes Exp $
!
! Standard key mapping for XFree86 (for US keyboards).
!
! This file can be fed to xmodmap to restore the default mapping.
!
! $XConsortium: xmodmap.std /main/7 1996/02/21 17:48:55 kaleb $
!
! First, clear the modifiers
!
clear shift
clear lock
clear control
clear mod1
clear mod2
clear mod3
clear mod4
clear mod5
!
! Set the mapping for each key
!
keycode 8 =
keycode 9 = Escape
keycode 10 = 1 exclam
keycode 11 = 2 at
keycode 12 = 3 numbersign
keycode 13 = 4 dollar
keycode 14 = 5 percent
keycode 15 = 6 asciicircum
keycode 16 = 7 ampersand
keycode 17 = 8 asterisk
keycode 18 = 9 parenleft
keycode 19 = 0 parenright
keycode 20 = minus underscore
keycode 21 = equal plus
keycode 22 = BackSpace
keycode 23 = Tab
keycode 24 = q Q 0x000e2 0x000c2
keycode 25 = w W
keycode 26 = e E
keycode 27 = r R
keycode 28 = t T U00163 U00162
keycode 29 = y Y
keycode 30 = u U
keycode 31 = i I 0x000ee 0x000ce
keycode 32 = o O
keycode 33 = p P
keycode 34 = bracketleft braceleft
keycode 35 = bracketright braceright
keycode 36 = Return
keycode 37 = Control_L
keycode 38 = a A U00103 U00102
keycode 39 = s S U0015f U0015e
keycode 40 = d D
keycode 41 = f F
keycode 42 = g G
keycode 43 = h H
keycode 44 = j J
keycode 45 = k K
keycode 46 = l L
keycode 47 = semicolon colon
keycode 48 = apostrophe quotedbl
keycode 49 = grave asciitilde
keycode 50 = Shift_L
keycode 51 = backslash bar
keycode 52 = z Z
keycode 53 = x X
keycode 54 = c C
keycode 55 = v V
keycode 56 = b B
keycode 57 = n N
keycode 58 = m M
keycode 59 = comma less
keycode 60 = period greater
keycode 61 = slash question
keycode 62 = Shift_R
keycode 63 = KP_Multiply
keycode 64 = Alt_L Meta_L
keycode 65 = space
keycode 66 = Caps_Lock
keycode 67 = F1
keycode 68 = F2
keycode 69 = F3
keycode 70 = F4
keycode 71 = F5
keycode 72 = F6
keycode 73 = F7
keycode 74 = F8
keycode 75 = F9
keycode 76 = F10
keycode 77 = Num_Lock
keycode 78 = Multi_key
keycode 79 = KP_Home KP_7
keycode 80 = KP_Up KP_8
keycode 81 = KP_Prior KP_9
keycode 82 = KP_Subtract
keycode 83 = KP_Left KP_4
keycode 84 = NoSymbol KP_5
keycode 85 = KP_Right KP_6
keycode 86 = KP_Add
keycode 87 = KP_End KP_1
keycode 88 = KP_Down KP_2
keycode 89 = KP_Next KP_3
keycode 90 = KP_Insert KP_0
keycode 91 = KP_Delete KP_Decimal
!keycode 92 = X386Sys_Req
keycode 93 =
keycode 94 =
keycode 95 = F11
keycode 96 = F12
! keycodes 97-107 are not available on 84-key keyboards
keycode 97 = Home
keycode 98 = Up
keycode 99 = Prior
keycode 100 = Left
keycode 101 = Begin
keycode 102 = Right
keycode 103 = End
keycode 104 = Down
keycode 105 = Next
keycode 106 = Insert
keycode 107 = Delete
keycode 108 = KP_Enter
keycode 109 = Control_R
keycode 110 = Pause
keycode 111 = Print
keycode 112 = KP_Divide
!keycode 113 = Alt_R Meta_R
keycode 114 = Break
! keycodes 115-117 are only available on some extended keyboards
! (e.g., Microsoft's ergonomic keyboard).
keycode 115 = Meta_L
keycode 116 = Meta_R
keycode 117 = Menu
!
! Set the modifiers
!
add shift = Shift_L Shift_R
add lock = Caps_Lock
add control = Control_L Control_R
add mod1 = Alt_L
! If you have ServerNumlock set in your XF86Config, you can comment out
keysym Alt_R = Mode_switch
add mod2 = Mode_switch
!
!
!
! If you use any of the special default key mappings in Xconfig, they should be
! duplicated in this file. Mappings should be added before the section above
! which sets the modifiers.
!
! For the key specs:
! LeftAlt => keycode 64
! RightAlt => keycode 113
! AltGr => keycode 113
! ScrollLock => keycode 78
! RightCtl => keycode 109
!
! For the mappings:
! Meta => Alt_L Meta_L
! Alt_R Meta_R
! Compose => Multi_key
! ModeShift => Mode_switch
! ModeLock => Mode_switch X386Mode_Lock
! ScrollLock => Scroll_Lock
! Control => Control_R
!
! If you use ModeShift or ModeLock, the following modifier must be set:
!
!add mod5 = Mode_switch
!
! For example, to get the equivalent of:
!
! ScrollLock ModeLock
! RightAlt ModeShift
! LeftAlt Meta
! RightCtl Compose
!
! use the following:
!
!keycode 78 = Mode_switch X386Mode_Lock
!keycode 113 = Mode_switch
!keycode 64 = Alt_L Meta_L
!keycode 109 = Multi_key
!
!add mod5 = Mode_switch
! When using ServerNumLock in your XF86Config, the following codes/symbols
! are available in place of 79-81, 83-85, 87-91
!keycode 136 = KP_7
!keycode 137 = KP_8
!keycode 138 = KP_9
!keycode 139 = KP_4
!keycode 140 = KP_5
!keycode 141 = KP_6
!keycode 142 = KP_1
!keycode 143 = KP_2
!keycode 144 = KP_3
!keycode 145 = KP_0
!keycode 146 = KP_Decimal
!keycode 147 = Home
!keycode 148 = Up
!keycode 149 = Prior
!keycode 150 = Left
!keycode 151 = Begin
!keycode 152 = Right
!keycode 153 = End
!keycode 154 = Down
!keycode 155 = Next
!keycode 156 = Insert
!keycode 157 = Delete
4. Setare fonturi
În marea lor majoritate, fonturile instalate de xorg suportă UTF-8. Este totuşi recomandat să încărcăm o serie de alte fonturi:
emerge freetype corefonts freefonts
artwiz-fonts sharefonts terminus-font
ttf-bitstream-vera unifont
Apoi modificăm /etc/X11/xorg.conf după cum urmează:
FontPath "/usr/share/fonts/misc:unscaled"
FontPath "/usr/share/fonts/100dpi:unscaled"
FontPath "/usr/share/fonts/75dpi:unscaled"
FontPath "/usr/share/fonts/ttf-bitstream-vera"
FontPath "/usr/share/fonts/corefonts"
FontPath "/usr/share/fonts/Type1"
FontPath "/usr/share/fonts/TTF"
FontPath "/usr/share/fonts/freefont"
FontPath "/usr/share/fonts/artwiz"
FontPath "/usr/share/fonts/sharefonts"
FontPath "/usr/share/fonts/terminus"
FontPath "/usr/share/fonts/unifont"
Din anumite motive, programele de genul xterm au nevoie să fie informate în mod exact care din fonturile din xorg să le folosească. Adăugăm/modificăm următoarea linie în fişierul .Xresources în directorul home curent (dacă este nevoie, creem un fişier nou cu acest nume):
xterm*font: -Misc-Fixed-Medium-R-Normal--20-200-75-75-C-100-ISO10646-1
Trebuie apoi să adăugăm la începutul fişierului .xinitrc următoarele două linii:
xrdb -merge .Xresources
xmodmap .Xmodmap
Cu aceste modificări este timpul să pornim xorg pentru ca setarea de tastatură şi setarea de fonturi să aibă efect. Presupunând că totul a mers bine, deschidem o fereastră xterm iar în această ferestră introducem:
# xterm -u8&
(xterm rulează default fără suport UTF8). O nouă ferestră xterm se deschide, iar aceasta are suportul dorit:
# ãâºþîêÞÎ
O serie de alte emulatore de terminal sub X au suport pentru UTF8, de exemplu rxvt-unicode şi gnome-terminal. Majoritatea comenzilor de tip UNIX suportă utf8, iar ca editoare de text aş menţiona abiword şi gedit.
5. Setare "locale"
Pentru a facilita procesul de internaţionalizare a programelor de calculator, în standardul limbajului C au fost introduse aşa numitele "locales". Implementate ca environment variables, fiecare dintre ele specifică o convenţie privind modul în care un program trebuie să prelucreze un anumit tip de informaţie. Spre exemplu, LC_TIME este folosit pentru a formata timpul potrivit regulilor limbii respective, iar LC_MESSAGES este folosit pentru afişare textelor generate de program (cum ar fi meniurile, help, etc) în limba respectivă.
De menţionat că acestă setare pentru locale este opţională. În cazul în care nu o facem, programele respective vor continua să prelucreze mai departe text românesc fără probleme, dacă au suport iniţial pentru UTF8. Deci, dacă nu ne deranjează meniurile de genul Open/Save/Find, putem sării liniştiţi la capitolul următor.
Începem cu un mic experiment. Într-o fereastră de terminal introducem comanda locale:
# locale
LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
Dacă arată ca mai sus, înseamnă că variabila locale nu a fost setată încă. Setarea se face în felul următor:
# export LANG=ro_RO.UTF-8
# locale
LANG=ro_RO.UTF-8
LC_CTYPE="ro_RO.UTF-8"
LC_NUMERIC="ro_RO.UTF-8"
LC_TIME="ro_RO.UTF-8"
LC_COLLATE="ro_RO.UTF-8"
LC_MONETARY="ro_RO.UTF-8"
LC_MESSAGES="ro_RO.UTF-8"
LC_PAPER="ro_RO.UTF-8"
LC_NAME="ro_RO.UTF-8"
LC_ADDRESS="ro_RO.UTF-8"
LC_TELEPHONE="ro_RO.UTF-8"
LC_MEASUREMENT="ro_RO.UTF-8"
LC_IDENTIFICATION="ro_RO.UTF-8"
LC_ALL=
O serie întreagă de programe au fost deja traduse în limba română (AbiWord, xmms, gedit, gnome-terminal, etc). Pornite din această fereastră xterm, textul românesc din meniurile programului va fi afişat corect.
6. Pentru programatori
Mesajul de la Bell Labs este deosebit de clar: îl lăsăm pe utilizator să-şi bată capul cu setarea de tastatură şi setarea de fonturi, iar instantaneu o serie întreagă de programe scrise cu mult timp în urmă vor funcţiona corect.
# cat test
Scopul declarat al acestui articol este de a vã lãsa cu impresia cã orice este
posibil, inclusiv sã folosiþi litere precum º ºi þ pe un calculator pe care
tocmai aþi cheltuit o sumã indecentã de bani, ºi care "by default" nu ºtie
decât englezã.
# grep ºtie test
tocmai aþi cheltuit o sumã indecentã de bani, ºi care "by default" nu ºtie
# sed s/ºtie/vrea/ test
Scopul declarat al acestui articol este de a vã lãsa cu impresia cã orice este
posibil, inclusiv sã folosiþi litere precum º ºi þ pe un calculator pe care
tocmai aþi cheltuit o sumã indecentã de bani, ºi care "by default" nu vrea
decât englezã.
Singurul lucru de care trebuie să ţinem cont este ca editorul pe care-l folosim să suporte UTF8:
// file test.c
#include
int main() {
printf("Salut, ºarpe!n");
return 0;
}
gcc este alt program căruia nu-i pasă dacă textul este unicode sau nu:
# gcc test.c
# ./a.out
Salut, ºarpe!
#
Acest articol este o scurtă introducere în UTF8 din perspectiva sistemului de operare Linux. Articolul este dedicat tuturor celor ce întâmpină în mod regulat dificultăţi în setarea caracterelor diacritice româneşti în diferite programe sub Linux. Toate exemplele de mai jos au fost încercate pe o distribuţie Gentoo, şi se presupune că pot fi replicate cu uşurinţă şi pe alte tipuri de distribuţii.
Scopul declarat al acestui articol este de a vă lăsa cu impresia că orice este posibil, inclusiv să folosiţi litere precum ş şi ţ pe un calculator pe care tocmai aţi cheltuit o sumă indecentă de bani, şi care "by default" nu ştie decât engleză.
2. Ce este UTF-8
Standardul ASCII (American Standard Code for Information Interchange) stă la baza seturilor de caractere folosite în toate sistemele de operare moderne. A fost adoptat în anul 1968 sub numele ANSIX3.4. Conform ASCII, caracterele limbii engleze sunt mapate în numere întregi pe 8 biţi. Această mapare acoperă 256 de caractere literare şi de control diferite. Bineînţeles, 256 de caractere nu acoperă toate limbile globului, aşadar în decursul timpului alte forme de mapare au fost definite. După o serie de iteraţii s-a ajuns la Unicode.
Originile standardului Unicode pot fi trasate către Bell Laboratories care ne-au adus în decursul timpului limbajul de programare C, sistemul de operare Unix iar mai târziu C++. Mecanismul a fost descris mai întâi de Ken Thompson şi Robert Pike în anul 1993, ca stând la baza sistemului de procesare de text în noul lor sistem de operare Plan9. A fost preluat apoi de X/Open Group şi inclus în ghidul de portabilitate intitulat XPG4 care stă la baza specificaţie Unix98.
Adoptat de către ISO în 1996 devine astfel standard internaţional sub numele de ISO-10646. Acest standard este suportat sub Linux, iar unele distribuţii (spre exemplu Fedora) sunt setate default pentru UTF8.
După cum se menţionează la http://www.unicode.org/, standardul Unicode prevede un cod numeric unic pentru fiecare caracter, pe orice platformă hardware, în orice program software, şi în orice limbă. Unicode este compatibil cu standardul ASCII astfel încât un document tipărit în ASCII poate fi interpretat corect în Unicode, dar nu şi invers.
Caracterele româneşti sunt reprezentate de următoarele coduri Unicode:
â - U00e2; Â - U00C2;
ă - U0103; Ă - U0102;
î - U00ee; Î - U00ce;
ş - U015f; Ş - U015e;
ţ - U0163; Ţ - U0162;
UTF8 este în esenţă o metodă de serializare a codurilor de caractere Unicode pe mai mulţi octeţi.
0x00000000 - 0x0000007F: 0xxxxxxx
0x00000080 - 0x000007FF: 110xxxxx 10xxxxxx
0x00000800 - 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 - 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0x00200000 - 0x03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0x04000000 - 0x7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
Caracterele româneşti sunt serializate pe doi octeţi în UTF8 după cum urmează:
ă - 0xc3, 0xa2; Â - 0xc3, 0x82;
ă - 0xc4, 0x83; Ă - 0xc4, 0x82;
î - 0xc3, 0xae; Î - 0xc3, 0x8e;
ş - 0xc5, 0x9f; Ş - 0xc5, 0x9e;
ţ - 0xc5, 0xa3; Ţ - 0xc5, 0xa2;
Exista trei lucruri despre care trebuie să discutăm în ceea ce priveşte o setare de caractere diacritice româneşti sub Linux: setarea tastaturii, setarea fonturilor şi setarea variabilei "locale".
3. Setare tastatură
Majoritatea tastaturilor comercializate în România sunt tastaturi de tip US. Aceasta se datoreşte preţului dar şi modului în care ne-am obişnuit să avem literele aşezate. Pe o asemenea tastatură putem mapa caracterele diacritice după cum urmează: cu tasta Alt din partea dreaptă a barei de spaţiu apăsată, tastele a, s, t, i devin diacritice, iar tasta q devine â.
Pentru a obţine acest efect începem prin a copia fişierul .Xmodmap în directorul home/user curent:
#cp /usr/lib/X11/etc/xmodmap.std .Xmodmap
Apoi, într-un program de editare modificăm .Xmodmap (sau cut&paste de aici). Rezultatul este următorul:
!
! $XFree86: xc/programs/Xserver/hw/xfree86/etc/xmodmap.std,v 3.4 1996/02/04 09:09:12 dawes Exp $
!
! Standard key mapping for XFree86 (for US keyboards).
!
! This file can be fed to xmodmap to restore the default mapping.
!
! $XConsortium: xmodmap.std /main/7 1996/02/21 17:48:55 kaleb $
!
! First, clear the modifiers
!
clear shift
clear lock
clear control
clear mod1
clear mod2
clear mod3
clear mod4
clear mod5
!
! Set the mapping for each key
!
keycode 8 =
keycode 9 = Escape
keycode 10 = 1 exclam
keycode 11 = 2 at
keycode 12 = 3 numbersign
keycode 13 = 4 dollar
keycode 14 = 5 percent
keycode 15 = 6 asciicircum
keycode 16 = 7 ampersand
keycode 17 = 8 asterisk
keycode 18 = 9 parenleft
keycode 19 = 0 parenright
keycode 20 = minus underscore
keycode 21 = equal plus
keycode 22 = BackSpace
keycode 23 = Tab
keycode 24 = q Q 0x000e2 0x000c2
keycode 25 = w W
keycode 26 = e E
keycode 27 = r R
keycode 28 = t T U00163 U00162
keycode 29 = y Y
keycode 30 = u U
keycode 31 = i I 0x000ee 0x000ce
keycode 32 = o O
keycode 33 = p P
keycode 34 = bracketleft braceleft
keycode 35 = bracketright braceright
keycode 36 = Return
keycode 37 = Control_L
keycode 38 = a A U00103 U00102
keycode 39 = s S U0015f U0015e
keycode 40 = d D
keycode 41 = f F
keycode 42 = g G
keycode 43 = h H
keycode 44 = j J
keycode 45 = k K
keycode 46 = l L
keycode 47 = semicolon colon
keycode 48 = apostrophe quotedbl
keycode 49 = grave asciitilde
keycode 50 = Shift_L
keycode 51 = backslash bar
keycode 52 = z Z
keycode 53 = x X
keycode 54 = c C
keycode 55 = v V
keycode 56 = b B
keycode 57 = n N
keycode 58 = m M
keycode 59 = comma less
keycode 60 = period greater
keycode 61 = slash question
keycode 62 = Shift_R
keycode 63 = KP_Multiply
keycode 64 = Alt_L Meta_L
keycode 65 = space
keycode 66 = Caps_Lock
keycode 67 = F1
keycode 68 = F2
keycode 69 = F3
keycode 70 = F4
keycode 71 = F5
keycode 72 = F6
keycode 73 = F7
keycode 74 = F8
keycode 75 = F9
keycode 76 = F10
keycode 77 = Num_Lock
keycode 78 = Multi_key
keycode 79 = KP_Home KP_7
keycode 80 = KP_Up KP_8
keycode 81 = KP_Prior KP_9
keycode 82 = KP_Subtract
keycode 83 = KP_Left KP_4
keycode 84 = NoSymbol KP_5
keycode 85 = KP_Right KP_6
keycode 86 = KP_Add
keycode 87 = KP_End KP_1
keycode 88 = KP_Down KP_2
keycode 89 = KP_Next KP_3
keycode 90 = KP_Insert KP_0
keycode 91 = KP_Delete KP_Decimal
!keycode 92 = X386Sys_Req
keycode 93 =
keycode 94 =
keycode 95 = F11
keycode 96 = F12
! keycodes 97-107 are not available on 84-key keyboards
keycode 97 = Home
keycode 98 = Up
keycode 99 = Prior
keycode 100 = Left
keycode 101 = Begin
keycode 102 = Right
keycode 103 = End
keycode 104 = Down
keycode 105 = Next
keycode 106 = Insert
keycode 107 = Delete
keycode 108 = KP_Enter
keycode 109 = Control_R
keycode 110 = Pause
keycode 111 = Print
keycode 112 = KP_Divide
!keycode 113 = Alt_R Meta_R
keycode 114 = Break
! keycodes 115-117 are only available on some extended keyboards
! (e.g., Microsoft's ergonomic keyboard).
keycode 115 = Meta_L
keycode 116 = Meta_R
keycode 117 = Menu
!
! Set the modifiers
!
add shift = Shift_L Shift_R
add lock = Caps_Lock
add control = Control_L Control_R
add mod1 = Alt_L
! If you have ServerNumlock set in your XF86Config, you can comment out
keysym Alt_R = Mode_switch
add mod2 = Mode_switch
!
!
!
! If you use any of the special default key mappings in Xconfig, they should be
! duplicated in this file. Mappings should be added before the section above
! which sets the modifiers.
!
! For the key specs:
! LeftAlt => keycode 64
! RightAlt => keycode 113
! AltGr => keycode 113
! ScrollLock => keycode 78
! RightCtl => keycode 109
!
! For the mappings:
! Meta => Alt_L Meta_L
! Alt_R Meta_R
! Compose => Multi_key
! ModeShift => Mode_switch
! ModeLock => Mode_switch X386Mode_Lock
! ScrollLock => Scroll_Lock
! Control => Control_R
!
! If you use ModeShift or ModeLock, the following modifier must be set:
!
!add mod5 = Mode_switch
!
! For example, to get the equivalent of:
!
! ScrollLock ModeLock
! RightAlt ModeShift
! LeftAlt Meta
! RightCtl Compose
!
! use the following:
!
!keycode 78 = Mode_switch X386Mode_Lock
!keycode 113 = Mode_switch
!keycode 64 = Alt_L Meta_L
!keycode 109 = Multi_key
!
!add mod5 = Mode_switch
! When using ServerNumLock in your XF86Config, the following codes/symbols
! are available in place of 79-81, 83-85, 87-91
!keycode 136 = KP_7
!keycode 137 = KP_8
!keycode 138 = KP_9
!keycode 139 = KP_4
!keycode 140 = KP_5
!keycode 141 = KP_6
!keycode 142 = KP_1
!keycode 143 = KP_2
!keycode 144 = KP_3
!keycode 145 = KP_0
!keycode 146 = KP_Decimal
!keycode 147 = Home
!keycode 148 = Up
!keycode 149 = Prior
!keycode 150 = Left
!keycode 151 = Begin
!keycode 152 = Right
!keycode 153 = End
!keycode 154 = Down
!keycode 155 = Next
!keycode 156 = Insert
!keycode 157 = Delete
4. Setare fonturi
În marea lor majoritate, fonturile instalate de xorg suportă UTF-8. Este totuşi recomandat să încărcăm o serie de alte fonturi:
emerge freetype corefonts freefonts
artwiz-fonts sharefonts terminus-font
ttf-bitstream-vera unifont
Apoi modificăm /etc/X11/xorg.conf după cum urmează:
FontPath "/usr/share/fonts/misc:unscaled"
FontPath "/usr/share/fonts/100dpi:unscaled"
FontPath "/usr/share/fonts/75dpi:unscaled"
FontPath "/usr/share/fonts/ttf-bitstream-vera"
FontPath "/usr/share/fonts/corefonts"
FontPath "/usr/share/fonts/Type1"
FontPath "/usr/share/fonts/TTF"
FontPath "/usr/share/fonts/freefont"
FontPath "/usr/share/fonts/artwiz"
FontPath "/usr/share/fonts/sharefonts"
FontPath "/usr/share/fonts/terminus"
FontPath "/usr/share/fonts/unifont"
Din anumite motive, programele de genul xterm au nevoie să fie informate în mod exact care din fonturile din xorg să le folosească. Adăugăm/modificăm următoarea linie în fişierul .Xresources în directorul home curent (dacă este nevoie, creem un fişier nou cu acest nume):
xterm*font: -Misc-Fixed-Medium-R-Normal--20-200-75-75-C-100-ISO10646-1
Trebuie apoi să adăugăm la începutul fişierului .xinitrc următoarele două linii:
xrdb -merge .Xresources
xmodmap .Xmodmap
Cu aceste modificări este timpul să pornim xorg pentru ca setarea de tastatură şi setarea de fonturi să aibă efect. Presupunând că totul a mers bine, deschidem o fereastră xterm iar în această ferestră introducem:
# xterm -u8&
(xterm rulează default fără suport UTF8). O nouă ferestră xterm se deschide, iar aceasta are suportul dorit:
# ãâºþîêÞÎ
O serie de alte emulatore de terminal sub X au suport pentru UTF8, de exemplu rxvt-unicode şi gnome-terminal. Majoritatea comenzilor de tip UNIX suportă utf8, iar ca editoare de text aş menţiona abiword şi gedit.
5. Setare "locale"
Pentru a facilita procesul de internaţionalizare a programelor de calculator, în standardul limbajului C au fost introduse aşa numitele "locales". Implementate ca environment variables, fiecare dintre ele specifică o convenţie privind modul în care un program trebuie să prelucreze un anumit tip de informaţie. Spre exemplu, LC_TIME este folosit pentru a formata timpul potrivit regulilor limbii respective, iar LC_MESSAGES este folosit pentru afişare textelor generate de program (cum ar fi meniurile, help, etc) în limba respectivă.
De menţionat că acestă setare pentru locale este opţională. În cazul în care nu o facem, programele respective vor continua să prelucreze mai departe text românesc fără probleme, dacă au suport iniţial pentru UTF8. Deci, dacă nu ne deranjează meniurile de genul Open/Save/Find, putem sării liniştiţi la capitolul următor.
Începem cu un mic experiment. Într-o fereastră de terminal introducem comanda locale:
# locale
LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
Dacă arată ca mai sus, înseamnă că variabila locale nu a fost setată încă. Setarea se face în felul următor:
# export LANG=ro_RO.UTF-8
# locale
LANG=ro_RO.UTF-8
LC_CTYPE="ro_RO.UTF-8"
LC_NUMERIC="ro_RO.UTF-8"
LC_TIME="ro_RO.UTF-8"
LC_COLLATE="ro_RO.UTF-8"
LC_MONETARY="ro_RO.UTF-8"
LC_MESSAGES="ro_RO.UTF-8"
LC_PAPER="ro_RO.UTF-8"
LC_NAME="ro_RO.UTF-8"
LC_ADDRESS="ro_RO.UTF-8"
LC_TELEPHONE="ro_RO.UTF-8"
LC_MEASUREMENT="ro_RO.UTF-8"
LC_IDENTIFICATION="ro_RO.UTF-8"
LC_ALL=
O serie întreagă de programe au fost deja traduse în limba română (AbiWord, xmms, gedit, gnome-terminal, etc). Pornite din această fereastră xterm, textul românesc din meniurile programului va fi afişat corect.
6. Pentru programatori
Mesajul de la Bell Labs este deosebit de clar: îl lăsăm pe utilizator să-şi bată capul cu setarea de tastatură şi setarea de fonturi, iar instantaneu o serie întreagă de programe scrise cu mult timp în urmă vor funcţiona corect.
# cat test
Scopul declarat al acestui articol este de a vã lãsa cu impresia cã orice este
posibil, inclusiv sã folosiþi litere precum º ºi þ pe un calculator pe care
tocmai aþi cheltuit o sumã indecentã de bani, ºi care "by default" nu ºtie
decât englezã.
# grep ºtie test
tocmai aþi cheltuit o sumã indecentã de bani, ºi care "by default" nu ºtie
# sed s/ºtie/vrea/ test
Scopul declarat al acestui articol este de a vã lãsa cu impresia cã orice este
posibil, inclusiv sã folosiþi litere precum º ºi þ pe un calculator pe care
tocmai aþi cheltuit o sumã indecentã de bani, ºi care "by default" nu vrea
decât englezã.
Singurul lucru de care trebuie să ţinem cont este ca editorul pe care-l folosim să suporte UTF8:
// file test.c
#include
int main() {
printf("Salut, ºarpe!n");
return 0;
}
gcc este alt program căruia nu-i pasă dacă textul este unicode sau nu:
# gcc test.c
# ./a.out
Salut, ºarpe!
#
Aproape totul despre Backup
Continut
1 Backup la partitie in retea
2 Backup recursiv la directoare specifice utelizand tar & bash
3 Backup recursiv la directoare specifice utelizand flexbackup
4 Backup incremental cu Rsync
5 Backup Incremental in retea cu rdiff-backup
6 Pregatirea pentru Backup
1 Backup la partitie in retea
Pentru a face un backup la o partitie intreaga pe o masina remote ce se poate afla atat in reteaua interna cat si in Internet vom utiliza netcat si dd
Netcat il avem in doua variante :
Pentru un backup a partitiei de pe hda "exemplu /dev/hda1" vom porni netcat in modul "ascultare" listen pe PC pe care vom copia backup-ul.
Pe PC care are nevoie de backup vom rula dd pt a citi partitia a a o comprima cu gzip si transfera cu netcat pe PC-ul ce asculta.
Pentru informatii suplimentare cum a clona un Linux utelizand netcat consultati clone_linux
2 Backup recursiv la directoare specifice utelizand tar & bash
Voi prezenta un bash script foarte simplu de care am dat pe forums.gentoo.org ce face un backup "ne incrimental". La baza acestui script stau (bash, tar, xargs, etc.)
Acest script pote fi inclus in cron sa faca backup saptamanal sau lunar sau se poate rulat manul cand e nevoie.
download script
3 Backup recursiv la directoare specifice utelizand flexbackup
Flexbackup este un script scris in perl ce poate face usor si rapid backup la directoarele importante.
Cam asa trebuie sa arate /etc/flexbackup.conf fisierul de configurare a lui flexbackup:
Puteti modifica fisierul de configurare in functie de ce directoare vreti sa fie salvate ca copie de rezerva
Fiecare director in "research" va fi salvat cu propriul tarball, cum ar fi "home-david-research.0.tar.gz", "var-cvsroot-python.0.tar.gz", si "var-cvsroot-latex.0.tar.gz".
$prune$ este o optiune foarte utila ce permite mask-area anumitor directoare pe care nu doriti sa le includeti in tarballs.
A fost setat $compress pe 'gzip' dar puteti uteliza de exemplu bzip2 daca vreti un tarball de dimensiuni mai mici . bzip2 este mai lent la arhivare si dezarhivare decat gzip. $compr_level=6 va executa compresi mai rapid ra se poate schimba intro alta valoare pt a creste nivelul de compresie.
Pentru a crea un Backup sistematic vom utiliza crontab
Aceasta inregistrare va efectua un backup complet la fiecare sambata a fiecarei luni si un backup incremental in fiecare zi a saptamanii la oara 3am
Pentru detalii vizitati Flexbackup home page
4 Backup incremental cu Rsync
In Internet este un tutorial foarte detaliat Easy Automated Snapshot-Style Backups with Linux and Rsync despre crearea si efectuare de backup utelizand rsync unde veti gasi si un script complet pentru crearea scripturilor.
Utelizand backup incremental, puteti crea multiple snapshot-uri a discului si tot odata eficientiza utelizarea spatiului pe disc si a consumului de resurse necesar crearii si mentenantei backup-urilor. Rsync ne ofera o modalitatea foarte comoda pentru a crea creating backup de tip snapshot.
Voi prezenta cateva scripturi simple pe care le puteti modifica pentru a va satisface nevoile proprii de backup
Backup la fiecare 7 zile ca va utiliza pe un server dedicat pentru stocare backup-urilor.
Backup pe un Ald HDD
Backup automat la /home/utelizator pe acelshi hdd
Daca va simtiti incomod de a uteliza sau modifica scripturile bash vizitati rsnapshot unde veti gasi rsnapshot ce a ajuns la versiunea 1.2.1 si pe care puteti sa-l folositi cu incredere in prealabil citind documentatia de pe site.
Vom incerca cateva exepmle manuale pentru rsync
Sa presupunem ca vreiti sa
* creati o imagine exacta a discului sau partitie .
* Aveti deja un hdd separat pregatit pet backup ce poate fi IDE, USB in retea etc.(in examplu avem /mnt/usbharddrive):
Backup la intreaba partitie:
Dublicam partitia si stergem _update la fisierele ce au fost rescriese de la primul backup:
Backup la partitia de boot:
Pentru restaurarea backup-ului putem utiliza Gentoo Live CD. Restaurarea se va efectia de pe exemplu /mnt/usbharddrive pe /mnt/driveRestore.
5 Backup Incremental in retea cu rdiff-backup
rdiff-backup este un utelitar foarte flexibil ce permite un backup total si/sau incrimental.rdiff-backup permite un control extins al backup-urilor prin pastrarea atat fisierelor vechi cat si integrarea celor noi care au fost modificate. rdiff-backupne permite crearea backup remote prin ssh. Pentru mai multe detalii rdiff-backup Main page.
Isntalam rdiff-backup
Pentru a crea backup in retea pe ambele masini este necesara instalarea rdiff-backup. NU va fi necesar drepturile de root pe cand rdiff-backup poate fi utelizat si de utelizatori obisnuiti.
Dupa instalare ptem trece direct la utelizarea rdiff-backup
In cazul de mai sus subdirectorul mydir-backup este creat in HOME pe masina utelizatorului remoteuser la remotehost.remotedomain. Daca acest director este deja prezent in Home atunci directorul va fi update-at pentru a reflecta modificarile de pe masina sursa iar diferentele nu vor disparea ci vor fi salvate la randul sau. Pentru mai multe detalii si exemple concrete vizitat http://www.nongnu.org/rdiff-backup/examples.html.
In functie de configurarea serviciului sshd si schema de autentificare puteti fi intrebat de parola de acces a utelizatorului pe mashina pe care se va salva backup-ul.
Acest proces de autentificare poate fi evitat utelizand (ssh-agent) si este in special util cand utelizam backup ca proces automat in cron. In cazul in care nu aveti configurat (ssh-agent) vom proceda:
Primul lucru pe care il facem ne m,utam pe masina ce va stoca backup-urile si avem nevoie de passphrase-less key pair ce va fi folosita de rdiff-backup.
Creem passphrase-less key pair
Vom salva cheia .ssh/backup_dsa si enter pentru passphrase.
Acum copiem cheia creata in mashina la care se va face backup
Pe mashine care va crea backup vom adauga cheia copiat in lista authorized keys
Acum a venit timpul sa-i specificm mashii ca cheia respectiva va fi utelizata numai pentru anumite actiuni care ne intereseaza. Editam .ssh/authorized_keys si specificam comanda inaintea fiecarei chei.
Exemplu
Acum putem trece la mashina la care trebuie facut backup-ul si ne asuguram ca rdiff-backup sa fie pornit, si vom configura mashina pentru utelizarea passphrase-less, key pair prin crearea ssh aliasing prin editarea .ssh/config si adaugam;
In acest fel cand vom uteliza remote-backup host identifier in ssh sau scp PC-ul ca contacta remotehost.remodomain si in loc sa utelizeze cheia defaul va fi fortat sa utelizeze /.ssh/backup_dsa.
Configurarile de mai susu ne permit crearea de remote backup prin conectarea ssh la o alta mashina specificata fara a mai fi nevoie de a introduce parolla utelizatorului la cere ne conectam.
Acum a venit timpul sa configuram rdiff-backup ca un cron job pentru un backup automat editam local cron table ce este separat la fiecare utelizator in parte.
Acum a venit timpul sa inregistram in cron job flexbackup:
Astep critici, aprecieri, completari daca sunt necesare.
Acet tutorial a fost tradus si adaptat dupa WiKi HOWTO_Backup
1 Backup la partitie in retea
2 Backup recursiv la directoare specifice utelizand tar & bash
3 Backup recursiv la directoare specifice utelizand flexbackup
4 Backup incremental cu Rsync
5 Backup Incremental in retea cu rdiff-backup
6 Pregatirea pentru Backup
1 Backup la partitie in retea
Pentru a face un backup la o partitie intreaga pe o masina remote ce se poate afla atat in reteaua interna cat si in Internet vom utiliza netcat si dd
Netcat il avem in doua variante :
# emerge gnu-netcat
sau
# emerge netcat
sau
# emerge netcat
Pentru un backup a partitiei de pe hda "exemplu /dev/hda1" vom porni netcat in modul "ascultare" listen pe PC pe care vom copia backup-ul.
# netcat -l -p 10000 > image.gz
Pe PC care are nevoie de backup vom rula dd pt a citi partitia a a o comprima cu gzip si transfera cu netcat pe PC-ul ce asculta.
# dd if=/dev/hda1 | gzip | netcat -w 5 remote_ip 10000
Pentru informatii suplimentare cum a clona un Linux utelizand netcat consultati clone_linux
2 Backup recursiv la directoare specifice utelizand tar & bash
Voi prezenta un bash script foarte simplu de care am dat pe forums.gentoo.org ce face un backup "ne incrimental". La baza acestui script stau (bash, tar, xargs, etc.)
Acest script pote fi inclus in cron sa faca backup saptamanal sau lunar sau se poate rulat manul cand e nevoie.
#!/bin/sh
# for FULL backups
# this backs up the important stuffs listed in ${lists} to ${BKPDIR}
# the lists *should* be in ${BKPDIR} and named.lst
# the resulting backups will be..tgz
# notes:
# - assumes ${BKPDIR} is unmounted and has an /etc/fstab entry
# - assumes /boot is unmounted and has an /etc/fstab entry
# - variables in CAPS are ok for you to set... change the other
# vars if you know what you're doing
# - you can get fancy in the lists... think xargs *wink*, but
# you can't use thes spanning feature to break up an
# archive to smaller pieces of arbitrary size
# - follow your security policy when setting perms on ${BKPDIR}
# written by razamatan
# DISCLAIMER: razamatan didn't write this if something goes wrong
BKPDIR=/mnt/.backup # where the backups go
BOOT=sys # list that has /boot
NUMBKPS=4 # how many backups to keep
if [ ! -d ${BKPDIR} ] ; then
echo ${BKPDIR} is not a valid directory or does not exist
fi
mount ${BKPDIR} # i have my backup directory on a seperate partition
lists=${BKPDIR}/*.lst
ext=tgz
for list in `ls ${lists}`; do
type=`basename ${list} .lst`
if [ ${type} = ${BOOT} ] ; then mount /boot ; fi
cat ${list} | xargs tar zlcf
${BKPDIR}/${type}.`date +%Y-%m-%d-%H%M`.${ext} > /dev/null 2>&1
if [ ${type} = ${BOOT} ] ; then umount /boot ; fi
num=${NUMBKPS}
for evict in `ls -t ${BKPDIR}/${type}.*.${ext}`; do
if [ ${num} -le 0 ] ; then rm -f ${evict}
else num=$((${num}-1)) ; fi
done
done
umount ${BKPDIR} # and i like to keep it unmounted
# for FULL backups
# this backs up the important stuffs listed in ${lists} to ${BKPDIR}
# the lists *should* be in ${BKPDIR} and named
# the resulting backups will be
# notes:
# - assumes ${BKPDIR} is unmounted and has an /etc/fstab entry
# - assumes /boot is unmounted and has an /etc/fstab entry
# - variables in CAPS are ok for you to set... change the other
# vars if you know what you're doing
# - you can get fancy in the lists... think xargs *wink*, but
# you can't use thes spanning feature to break up an
# archive to smaller pieces of arbitrary size
# - follow your security policy when setting perms on ${BKPDIR}
# written by razamatan
# DISCLAIMER: razamatan didn't write this if something goes wrong
BKPDIR=/mnt/.backup # where the backups go
BOOT=sys # list that has /boot
NUMBKPS=4 # how many backups to keep
if [ ! -d ${BKPDIR} ] ; then
echo ${BKPDIR} is not a valid directory or does not exist
fi
mount ${BKPDIR} # i have my backup directory on a seperate partition
lists=${BKPDIR}/*.lst
ext=tgz
for list in `ls ${lists}`; do
type=`basename ${list} .lst`
if [ ${type} = ${BOOT} ] ; then mount /boot ; fi
cat ${list} | xargs tar zlcf
${BKPDIR}/${type}.`date +%Y-%m-%d-%H%M`.${ext} > /dev/null 2>&1
if [ ${type} = ${BOOT} ] ; then umount /boot ; fi
num=${NUMBKPS}
for evict in `ls -t ${BKPDIR}/${type}.*.${ext}`; do
if [ ${num} -le 0 ] ; then rm -f ${evict}
else num=$((${num}-1)) ; fi
done
done
umount ${BKPDIR} # and i like to keep it unmounted
download script
3 Backup recursiv la directoare specifice utelizand flexbackup
Flexbackup este un script scris in perl ce poate face usor si rapid backup la directoarele importante.
# emerge flexbackup
Cam asa trebuie sa arate /etc/flexbackup.conf fisierul de configurare a lui flexbackup:
$set{'research'} = "/home/david/research /var/cvsroot/python /var/cvsroot/latex";
$set{'mail'} = "/home/david/.thunderbird";
$set{'etc'} = "/etc /home/david /var/www/davidgrant.ca/htdocs";
$prune{'/home/david'} = ".jpi_cache konserve-backup .cxoffice .wine .mozilla .kde3.1 .thunderbird";
$prune{'/home/david/.thunderbird'} = "Junk News";
$compress = 'gzip'; # one of false/gzip/bzip2/lzop/zip/compress/hardware
$compr_level = '6';
$device = '/mnt/sata/backup'
$set{'mail'} = "/home/david/.thunderbird";
$set{'etc'} = "/etc /home/david /var/www/davidgrant.ca/htdocs";
$prune{'/home/david'} = ".jpi_cache konserve-backup .cxoffice .wine .mozilla .kde3.1 .thunderbird";
$prune{'/home/david/.thunderbird'} = "Junk News";
$compress = 'gzip'; # one of false/gzip/bzip2/lzop/zip/compress/hardware
$compr_level = '6';
$device = '/mnt/sata/backup'
Puteti modifica fisierul de configurare in functie de ce directoare vreti sa fie salvate ca copie de rezerva
Fiecare director in "research" va fi salvat cu propriul tarball, cum ar fi "home-david-research.0.tar.gz", "var-cvsroot-python.0.tar.gz", si "var-cvsroot-latex.0.tar.gz".
$prune$ este o optiune foarte utila ce permite mask-area anumitor directoare pe care nu doriti sa le includeti in tarballs.
A fost setat $compress pe 'gzip' dar puteti uteliza de exemplu bzip2 daca vreti un tarball de dimensiuni mai mici . bzip2 este mai lent la arhivare si dezarhivare decat gzip. $compr_level=6 va executa compresi mai rapid ra se poate schimba intro alta valoare pt a creste nivelul de compresie.
Pentru a crea un Backup sistematic vom utiliza crontab
0 3 1-7 * * flexbackup -set all -full -w 7
0 3 * * 6 flexbackup -set all -differential
0 3 * * 1-5 flexbackup -set all -incremental
0 3 * * 6 flexbackup -set all -differential
0 3 * * 1-5 flexbackup -set all -incremental
Aceasta inregistrare va efectua un backup complet la fiecare sambata a fiecarei luni si un backup incremental in fiecare zi a saptamanii la oara 3am
Pentru detalii vizitati Flexbackup home page
4 Backup incremental cu Rsync
In Internet este un tutorial foarte detaliat Easy Automated Snapshot-Style Backups with Linux and Rsync despre crearea si efectuare de backup utelizand rsync unde veti gasi si un script complet pentru crearea scripturilor.
Utelizand backup incremental, puteti crea multiple snapshot-uri a discului si tot odata eficientiza utelizarea spatiului pe disc si a consumului de resurse necesar crearii si mentenantei backup-urilor. Rsync ne ofera o modalitatea foarte comoda pentru a crea creating backup de tip snapshot.
Voi prezenta cateva scripturi simple pe care le puteti modifica pentru a va satisface nevoile proprii de backup
Backup la fiecare 7 zile ca va utiliza pe un server dedicat pentru stocare backup-urilor.
#!/bin/sh
# This script does personal backups to a rsync backup server. You will end up
# with a 7 day rotating incremental backup. The incrementals will go
# into subdirectories named after the day of the week, and the current
# full backup goes into a directory called "current"
# tridge@linuxcare.com
# directory to backup
BDIR=/home/$USER
# excludes file - this contains a wildcard pattern per line of files to exclude
EXCLUDES=$HOME/cron/excludes
# the name of the backup machine
BSERVER=owl
# your password on the backup server
export RSYNC_PASSWORD=XXXXXX
########################################################################
BACKUPDIR=`date +%A`
OPTS="--force --ignore-errors --delete-excluded --exclude-from=$EXCLUDES
--delete --backup --backup-dir=/$BACKUPDIR -a"
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin
# the following line clears the last weeks incremental directory
[ -d $HOME/emptydir ] || mkdir $HOME/emptydir
rsync --delete -a $HOME/emptydir/ $BSERVER::$USER/$BACKUPDIR/
rmdir $HOME/emptydir
# now the actual transfer
rsync $OPTS $BDIR $BSERVER::$USER/current
# This script does personal backups to a rsync backup server. You will end up
# with a 7 day rotating incremental backup. The incrementals will go
# into subdirectories named after the day of the week, and the current
# full backup goes into a directory called "current"
# tridge@linuxcare.com
# directory to backup
BDIR=/home/$USER
# excludes file - this contains a wildcard pattern per line of files to exclude
EXCLUDES=$HOME/cron/excludes
# the name of the backup machine
BSERVER=owl
# your password on the backup server
export RSYNC_PASSWORD=XXXXXX
########################################################################
BACKUPDIR=`date +%A`
OPTS="--force --ignore-errors --delete-excluded --exclude-from=$EXCLUDES
--delete --backup --backup-dir=/$BACKUPDIR -a"
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin
# the following line clears the last weeks incremental directory
[ -d $HOME/emptydir ] || mkdir $HOME/emptydir
rsync --delete -a $HOME/emptydir/ $BSERVER::$USER/$BACKUPDIR/
rmdir $HOME/emptydir
# now the actual transfer
rsync $OPTS $BDIR $BSERVER::$USER/current
Backup pe un Ald HDD
#!/bin/sh
export PATH=/usr/local/bin:/usr/bin:/bin
LIST="rootfs usr data data2"
for d in $LIST; do
mount /backup/$d
rsync -ax --exclude fstab --delete /$d/ /backup/$d/
umount /backup/$d
done
DAY=`date "+%A"`
rsync -a --delete /usr/local/apache /data2/backups/$DAY
rsync -a --delete /data/solid /data2/backups/$DAY
export PATH=/usr/local/bin:/usr/bin:/bin
LIST="rootfs usr data data2"
for d in $LIST; do
mount /backup/$d
rsync -ax --exclude fstab --delete /$d/ /backup/$d/
umount /backup/$d
done
DAY=`date "+%A"`
rsync -a --delete /usr/local/apache /data2/backups/$DAY
rsync -a --delete /data/solid /data2/backups/$DAY
Backup automat la /home/utelizator pe acelshi hdd
#!/bin/sh
cd ~susan
{
echo
date
dest=~/backup/`date +%A`
mkdir $dest.new
find . -xdev -type f ( -mtime 0 -or -mtime 1 ) -exec cp -aPv "{}"
$dest.new ;
cnt=`find $dest.new -type f | wc -l`
if [ $cnt -gt 0 ]; then
rm -rf $dest
mv $dest.new $dest
fi
rm -rf $dest.new
rsync -Cavze ssh . samba:backup
} >> ~/backup/backup.log 2>&1
cd ~susan
{
echo
date
dest=~/backup/`date +%A`
mkdir $dest.new
find . -xdev -type f ( -mtime 0 -or -mtime 1 ) -exec cp -aPv "{}"
$dest.new ;
cnt=`find $dest.new -type f | wc -l`
if [ $cnt -gt 0 ]; then
rm -rf $dest
mv $dest.new $dest
fi
rm -rf $dest.new
rsync -Cavze ssh . samba:backup
} >> ~/backup/backup.log 2>&1
Daca va simtiti incomod de a uteliza sau modifica scripturile bash vizitati rsnapshot unde veti gasi rsnapshot ce a ajuns la versiunea 1.2.1 si pe care puteti sa-l folositi cu incredere in prealabil citind documentatia de pe site.
Vom incerca cateva exepmle manuale pentru rsync
Sa presupunem ca vreiti sa
* creati o imagine exacta a discului sau partitie .
* Aveti deja un hdd separat pregatit pet backup ce poate fi IDE, USB in retea etc.(in examplu avem /mnt/usbharddrive):
Backup la intreaba partitie:
# rsync --progress --stats -avxzl --exclude "/mnt/usbharddrive/" --exclude "/mnt/usbharddriveboot/" --exclude "/usr/portage/" --exclude "/proc/"
--exclude "/root/.ccache/" --exclude "/var/log/" --exclude "/sys" --exclude "/dev" --exclude "tmp/" /* /mnt/usbharddrive
--exclude "/root/.ccache/" --exclude "/var/log/" --exclude "/sys" --exclude "/dev" --exclude "tmp/" /* /mnt/usbharddrive
Dublicam partitia si stergem _update la fisierele ce au fost rescriese de la primul backup:
# rsync --progress --stats --delete -avxzl --exclude "/mnt/usbharddrive/" --exclude "/mnt/usbharddriveboot/" --exclude "/usr/portage/"
--exclude "/proc/" --exclude "/root/.ccache/" --exclude "/var/log/" --exclude "/sys" --exclude "/dev" --exclude "tmp/" /* /mnt/usbharddrive
--exclude "/proc/" --exclude "/root/.ccache/" --exclude "/var/log/" --exclude "/sys" --exclude "/dev" --exclude "tmp/" /* /mnt/usbharddrive
Backup la partitia de boot:
# rsync --progress --stats -avxzl /boot /mnt/usbharddriveboot
# rsync --progress ---avxzl --stats --delete /boot /mnt/usbharddriveboot
# rsync --progress ---avxzl --stats --delete /boot /mnt/usbharddriveboot
Pentru restaurarea backup-ului putem utiliza Gentoo Live CD. Restaurarea se va efectia de pe exemplu /mnt/usbharddrive pe /mnt/driveRestore.
5 Backup Incremental in retea cu rdiff-backup
rdiff-backup este un utelitar foarte flexibil ce permite un backup total si/sau incrimental.rdiff-backup permite un control extins al backup-urilor prin pastrarea atat fisierelor vechi cat si integrarea celor noi care au fost modificate. rdiff-backupne permite crearea backup remote prin ssh. Pentru mai multe detalii rdiff-backup Main page.
Isntalam rdiff-backup
emerge rdiff-backup
Pentru a crea backup in retea pe ambele masini este necesara instalarea rdiff-backup. NU va fi necesar drepturile de root pe cand rdiff-backup poate fi utelizat si de utelizatori obisnuiti.
Dupa instalare ptem trece direct la utelizarea rdiff-backup
In cazul de mai sus subdirectorul mydir-backup este creat in HOME pe masina utelizatorului remoteuser la remotehost.remotedomain. Daca acest director este deja prezent in Home atunci directorul va fi update-at pentru a reflecta modificarile de pe masina sursa iar diferentele nu vor disparea ci vor fi salvate la randul sau. Pentru mai multe detalii si exemple concrete vizitat http://www.nongnu.org/rdiff-backup/examples.html.
In functie de configurarea serviciului sshd si schema de autentificare puteti fi intrebat de parola de acces a utelizatorului pe mashina pe care se va salva backup-ul.
Acest proces de autentificare poate fi evitat utelizand (ssh-agent) si este in special util cand utelizam backup ca proces automat in cron. In cazul in care nu aveti configurat (ssh-agent) vom proceda:
Primul lucru pe care il facem ne m,utam pe masina ce va stoca backup-urile si avem nevoie de passphrase-less key pair ce va fi folosita de rdiff-backup.
Creem passphrase-less key pair
ssh-keygen -t dsa
Vom salva cheia .ssh/backup_dsa si enter pentru passphrase.
Acum copiem cheia creata in mashina la care se va face backup
scp .ssh/backup_dsa.pub remoteuser@remotehost.remotedomain
Pe mashine care va crea backup vom adauga cheia copiat in lista authorized keys
ssh remoteuser@remotehost
cat backup_dsa.pub >> .ssh/authorized_keys
rm backup_dsa.pub
cat backup_dsa.pub >> .ssh/authorized_keys
rm backup_dsa.pub
Acum a venit timpul sa-i specificm mashii ca cheia respectiva va fi utelizata numai pentru anumite actiuni care ne intereseaza. Editam .ssh/authorized_keys si specificam comanda inaintea fiecarei chei.
Exemplu
nano -w .ssh/authorized_keys sau remote machine
command="/usr/bin/rdiff-backup --server" ssh-dss ....
command="/usr/bin/rdiff-backup --server" ssh-dss ....
Acum putem trece la mashina la care trebuie facut backup-ul si ne asuguram ca rdiff-backup sa fie pornit, si vom configura mashina pentru utelizarea passphrase-less, key pair prin crearea ssh aliasing prin editarea .ssh/config si adaugam;
nano -w .ssh/config
Host remote-backup
Hostname remotehost.remodomain
IdentityFile ~/.ssh/backup_dsa
IdentitiesOnly yes
Host remote-backup
Hostname remotehost.remodomain
IdentityFile ~/.ssh/backup_dsa
IdentitiesOnly yes
In acest fel cand vom uteliza remote-backup host identifier in ssh sau scp PC-ul ca contacta remotehost.remodomain si in loc sa utelizeze cheia defaul va fi fortat sa utelizeze /.ssh/backup_dsa.
Configurarile de mai susu ne permit crearea de remote backup prin conectarea ssh la o alta mashina specificata fara a mai fi nevoie de a introduce parolla utelizatorului la cere ne conectam.
Acum a venit timpul sa configuram rdiff-backup ca un cron job pentru un backup automat editam local cron table ce este separat la fiecare utelizator in parte.
File: cron table on local machine
01 1 * * * rdiff-backup /home/localuser/mydir remoteuser@remote-backup::mydir-backup[code]
6 Pregatirea pentru Backup
In anumite cazuri cand mashina ruleaza mai multe aplicatii sau demoni cum este mysql sau nu sunt montate anumite partitii la care trebuieste facut backup-ul cum este /boot avem nevoie de o pregatire prealabila a sistemului inainte de crearea bakupu-rilor. Vom crea un script ce va monta partitia in read-only mode pe durata crearii backup-ului.
[code]nano -w /etc/scripts/flexwrapper.sh
#!/bin/sh
# mount /boot pentru backup
mount /boot
# MySQL Read Only
# EXAMPLU!
# Aveti grija ca parola mysql va fi in plain-text sau utelizati criptarea cu shc ;)http://www.gentoo.ro/content.php?article.47
mysql -u root --password='yourpass' -e "SET GLOBAL read_only=1;"
# Rulam flexbackup, unde vom pasa si parametrii
flexbackup $*
# dam 10 secunde de respiro pentru un clean up
sleep 10
# MySQL Read/Write
mysql -u root --password='yourpass' -e "SET GLOBAL read_only=0;"
# umount /boot
umount /boot
01 1 * * * rdiff-backup /home/localuser/mydir remoteuser@remote-backup::mydir-backup[code]
6 Pregatirea pentru Backup
In anumite cazuri cand mashina ruleaza mai multe aplicatii sau demoni cum este mysql sau nu sunt montate anumite partitii la care trebuieste facut backup-ul cum este /boot avem nevoie de o pregatire prealabila a sistemului inainte de crearea bakupu-rilor. Vom crea un script ce va monta partitia in read-only mode pe durata crearii backup-ului.
[code]nano -w /etc/scripts/flexwrapper.sh
#!/bin/sh
# mount /boot pentru backup
mount /boot
# MySQL Read Only
# EXAMPLU!
# Aveti grija ca parola mysql va fi in plain-text sau utelizati criptarea cu shc ;)http://www.gentoo.ro/content.php?article.47
mysql -u root --password='yourpass' -e "SET GLOBAL read_only=1;"
# Rulam flexbackup, unde vom pasa si parametrii
flexbackup $*
# dam 10 secunde de respiro pentru un clean up
sleep 10
# MySQL Read/Write
mysql -u root --password='yourpass' -e "SET GLOBAL read_only=0;"
# umount /boot
umount /boot
Acum a venit timpul sa inregistram in cron job flexbackup:
0 3 1-7 * * /etc/scripts/flexwrapper.sh -set all -full -w 7
0 3 * * 6 /etc/scripts/flexwrapper.sh -set all -differential
0 3 * * 1-5 /etc/scripts/flexwrapper.sh -set all -incremental
0 3 * * 6 /etc/scripts/flexwrapper.sh -set all -differential
0 3 * * 1-5 /etc/scripts/flexwrapper.sh -set all -incremental
Astep critici, aprecieri, completari daca sunt necesare.
Acet tutorial a fost tradus si adaptat dupa WiKi HOWTO_Backup
Monday, March 2, 2009
HFSplus Basic Support
This is a howto made simple and easy for Macintosh and Ubuntu users who need to be able to access HFSplus drives and partitions. HFSplus support is included in the Edgy (Ubuntu 6.10) kernel but it will require a few extra tools to have it be both dependable and reliable.
First of all to have your hfsplus drive mounted, make a directory that will hold the mounted disk.
I use /mnt/Macintosh_HD, you can name it what you want. Some people do this as /media/Macintosh_HD, but this is generally reserved for CD's and other removable types.
Now to temporarily mount it use this command:
...replacing sda2 with your disk device and hard disk partition(#). My USB drive is /sda, my clamshell iBook is hda, etc. See which one your's is by typing:
here's what mine looked like:
NOTE: You'll see other entries besides these. They are temporary and virtual file systems. Just notice the /dev entries.
Now, I must point out that Linux at this time is only able to mount Journaled HFSplus filesystems as read-only. Journaling helps the filesystem preserve its data - especially useful for power outages. Journaling got added to HFSplus when OSX came out.
If you want to be able to read and write from and HFSplus drive, be sure journaling is off. To see if your disk/partition is head to: System > Administration > System Log and click on syslog. Now, punch ctrl+f and type in "mount". If the above partition that we mounted is journaled, there will be a warning here. To turn off journaling, restart with the OSX install CD, select Disk Utility from the drop down menu, click the drive you want to have journaling shutoff of and use the button Journaling disable.
To have the HFSplus drive/partition mounted everytime you boot, the fstab file must be changed:
and add this:
Not cleanly unmounted HFSplus partitions or drives.
The Linux Kernel is pretty picky about it's HFSplus drives, but it's a good thing. If it ever occurs where your system is locked up and you have to force reboot, then your HFSplus disk will not be cleanly unmounted. If you look into your syslog and see (once more ctrl-F, and use "mount" filter):
Then we need to add fsck.hfsplus support
Note: The compiler didn't compile the program newfs_hfs. I'm not experienced enough to know why. If someone knows how, please let me know.
Type fsck.hfsplus to see the list of option types - there is no man page. You can delete the downloaded files and unstuffed folders if you wish.
Now to make the partition/drive read-write enabled, the filesystem needs to be checked:
Sources:
original Gentoo piece:http://gentoo-wiki.com/HOWTO_hfsplus
Debian derived piece:http://www.debian-administration.org.../lee/weblog/21
First of all to have your hfsplus drive mounted, make a directory that will hold the mounted disk.
Code:
sudo mkdir /mnt/Shared_Disk
Now to temporarily mount it use this command:
Code:
sudo mount /dev/sda2 -t hfsplus -o rw /mnt/Shared_Disk
Code:
df -h
Code:
/dev/sda3 17G 12G 4.3G 73% / /dev/sda2 43G 29G 15G 68% /mnt/OSX /dev/sda4 15G 2.9G 12G 20% /mnt/Shared_Disk
Now, I must point out that Linux at this time is only able to mount Journaled HFSplus filesystems as read-only. Journaling helps the filesystem preserve its data - especially useful for power outages. Journaling got added to HFSplus when OSX came out.
If you want to be able to read and write from and HFSplus drive, be sure journaling is off. To see if your disk/partition is head to: System > Administration > System Log and click on syslog. Now, punch ctrl+f and type in "mount". If the above partition that we mounted is journaled, there will be a warning here. To turn off journaling, restart with the OSX install CD, select Disk Utility from the drop down menu, click the drive you want to have journaling shutoff of and use the button Journaling disable.
To have the HFSplus drive/partition mounted everytime you boot, the fstab file must be changed:
Code:
sudo gedit /etc/fstab
Code:
/dev/sda4 /mnt/Shared_Disk hfsplus rw,exec,auto,users 0 0
The Linux Kernel is pretty picky about it's HFSplus drives, but it's a good thing. If it ever occurs where your system is locked up and you have to force reboot, then your HFSplus disk will not be cleanly unmounted. If you look into your syslog and see (once more ctrl-F, and use "mount" filter):
Code:
hfs: Filesystem was not cleanly unmounted, running fsck.hfsplus is recommended. mounting read-only
Code:
sudo bash cd /usr/src mkdir hfsplus_support wget http://darwinsource.opendarwin.org/tarballs/apsl/diskdev_cmds-332.14.tar.gz wget http://www.ecl.udel.edu/~mcgee/diskdev_cmds/diskdev_cmds-332.14.patch.bz2 tar zxf diskdev_cmds-332.14.tar.gz bunzip2 -c diskdev_cmds-332.14.patch.bz2 | patch -p0 cd diskdev_cmds-332.14 make -f Makefile.lnx cp fsck_hfs.tproj/fsck_hfs /sbin/fsck.hfsplus cd /sbin ln -s fsck.hfsplus fsck.hfs
Type fsck.hfsplus to see the list of option types - there is no man page. You can delete the downloaded files and unstuffed folders if you wish.
Now to make the partition/drive read-write enabled, the filesystem needs to be checked:
Code:
fsck.hfsplus -r /dev/sda4
Sources:
original Gentoo piece:http://gentoo-wiki.com/HOWTO_hfsplus
Debian derived piece:http://www.debian-administration.org.../lee/weblog/21
Subscribe to:
Posts (Atom)