From e6862ff1c345b803f2a6fd30cf410ff8a343e400 Mon Sep 17 00:00:00 2001 From: Andrea Mazzoleni Date: Fri, 13 Feb 2026 00:52:06 +0100 Subject: [PATCH] Auto update --- beta/android-chrome-192x192.png | Bin 0 -> 34556 bytes beta/android-chrome-512x512.png | Bin 0 -> 152572 bytes beta/apple-touch-icon.png | Bin 0 -> 31149 bytes beta/compare.html | 435 ++++++ beta/dashboard.png | Bin 0 -> 133005 bytes beta/design.html | 163 +++ beta/differences.png | Bin 0 -> 88371 bytes beta/disks.png | Bin 0 -> 121744 bytes beta/download.html | 192 +++ beta/faq.html | 1961 +++++++++++++++++++++++++++ beta/favicon-16x16.png | Bin 0 -> 926 bytes beta/favicon-32x32.png | Bin 0 -> 2417 bytes beta/favicon.ico | Bin 0 -> 15406 bytes beta/howitworks.html | 295 +++++ beta/index.html | 333 +++++ beta/manual-de.html | 2107 +++++++++++++++++++++++++++++ beta/manual-es.html | 2053 +++++++++++++++++++++++++++++ beta/manual-fr.html | 2106 +++++++++++++++++++++++++++++ beta/manual-it.html | 2084 +++++++++++++++++++++++++++++ beta/manual-ja.html | 1915 +++++++++++++++++++++++++++ beta/manual-ko.html | 1973 +++++++++++++++++++++++++++ beta/manual-pl.html | 1966 +++++++++++++++++++++++++++ beta/manual-pt.html | 2016 ++++++++++++++++++++++++++++ beta/manual-ro.html | 1979 ++++++++++++++++++++++++++++ beta/manual-ru.html | 1971 +++++++++++++++++++++++++++ beta/manual-sv.html | 1985 ++++++++++++++++++++++++++++ beta/manual-uk.html | 2196 +++++++++++++++++++++++++++++++ beta/manual-zh.html | 1813 +++++++++++++++++++++++++ beta/manual.html | 2022 ++++++++++++++++++++++++++++ beta/recovery.png | Bin 0 -> 104728 bytes beta/script.js | 268 ++++ beta/style.css | 830 ++++++++++++ beta/support.html | 416 ++++++ beta/tasks.png | Bin 0 -> 110448 bytes beta/ui.html | 181 +++ 35 files changed, 33260 insertions(+) create mode 100644 beta/android-chrome-192x192.png create mode 100644 beta/android-chrome-512x512.png create mode 100644 beta/apple-touch-icon.png create mode 100644 beta/compare.html create mode 100644 beta/dashboard.png create mode 100644 beta/design.html create mode 100644 beta/differences.png create mode 100644 beta/disks.png create mode 100644 beta/download.html create mode 100644 beta/faq.html create mode 100644 beta/favicon-16x16.png create mode 100644 beta/favicon-32x32.png create mode 100644 beta/favicon.ico create mode 100644 beta/howitworks.html create mode 100644 beta/index.html create mode 100644 beta/manual-de.html create mode 100644 beta/manual-es.html create mode 100644 beta/manual-fr.html create mode 100644 beta/manual-it.html create mode 100644 beta/manual-ja.html create mode 100644 beta/manual-ko.html create mode 100644 beta/manual-pl.html create mode 100644 beta/manual-pt.html create mode 100644 beta/manual-ro.html create mode 100644 beta/manual-ru.html create mode 100644 beta/manual-sv.html create mode 100644 beta/manual-uk.html create mode 100644 beta/manual-zh.html create mode 100644 beta/manual.html create mode 100644 beta/recovery.png create mode 100644 beta/script.js create mode 100644 beta/style.css create mode 100644 beta/support.html create mode 100644 beta/tasks.png create mode 100644 beta/ui.html diff --git a/beta/android-chrome-192x192.png b/beta/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..91e55c4865d3fcff43de0cbbea28b4abbd50a4c7 GIT binary patch literal 34556 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 literal 0 HcmV?d00001 diff --git a/beta/android-chrome-512x512.png b/beta/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..d47aa48d6ee255b9cd9c08a2811261228c0ca3c0 GIT binary patch literal 152572 zcmXt9RZyKxko~y0yE_Ee1Pks?aCdii=i=@`f(Hoh?wUYwcZcA?-7cGdxAtk~X{uVL z=gjHT(aMU_s7ORe005xM%1EdJ0O;Qq1R%iuTW-DQp8e*ZF#gB=OZ#{@lvx3)0H+rIqQvy*Oyq_+4Ep>1NSPb$K2J zInvGW%2vBdHFboXj;B?Fj5q}Y((k>09(DTxs ze2|t-^X?!Ww)?ZFp+bj;fFa8p3`_N(Y?6b(EK|%WVNUb3$6urWKrCO-iR=g(I=(%< zfLLN_u?op0UYHEtOsWO14k3wzoS6I#+uyR~N}{*;!SF51Xpb?o~?&<6VCr5>M1m@X5Tc!iP!yhDt^R&lX+IBZCeZn;RiEjz*mIMO8tYQoa-^D;wFbO~6a=jJ3iH%HcmMLL_DE7S7u)N5m3Cp_; zWcgZ0hc65QZ&o8)>~*5~r)PA1SROF7p@6Y~i2R5*jWZLAM*W>Nt&jsE^9n ziLM+mT8Xv1wr4|!kZG0N<71Ajv{7^UU)*nJIKs4c+`X3Fk@*BG^Cu zBIlzYf5cH`^iXCBN4NMELz{WO1Bz0?1IhnE4J_&l!3Ex-0g-~8CwKf0el3PBCk+6Q zU9)mEaj=}(27KnD4bg})t3vQXfhn_~fmVf4ASJLm`aJF0)J3lix{NXD>c2E|HwjNJ zK<@1O9o228RDE z_4Ums%XJG58qePJ^S66=Wotgjc5>v&=1BXTmsq(VohAEfUNrlyQv9dqu10+H750)- zkNL#y>YYoYYPk3crvhe+X*%Aqe7}N`(8Qzi+6Eo!NC?0Fje28{WSFW#zxng+h2V9ye0j!qasFawhcrm^fbkYSUh#oo&fW|s6srv0xg1m+z%4KGu{)J1+vG2 zqirCLBuF9TY#8&YSUU|m@H*J@TUtFA>ci5aT^BqRz7VBc`3&}MZU zdo@G)88e+wkvoaKQ1-^faPw5Q3hCYIe2sh26zQJ}9cErKtO3CLe2rsuM#NjskSpo? zFAg!b$@br33y1veI6;Eudg-l1i5(CD2vsy_=;_BaYR-oxt3hGO2`*1 z0AQbC{xxe|I(Uc**SCc-;4;UywE3`wiHGbS00j9jvd)59difwy#2C0!wBBYsccr(d z;873_A`F1zPC^PiYP2>5Ph*U6%)Y(>#;kHAn!fuoix!R}CZePmHT z3n)g(Q$C;SlDs!&hTYFwJZHxrK)2fK1^G4Y%4tXFTl;v}zyi#*Px?~bvb)i({d;>F7PSm5##QgjB7ab@kcSrA__7;GV&o6GiWn{TF4dGb3V z-&o&gW5BJlDA}KJDHw@j@=S3JR#e@HMJk%F36Z#+QA3dM!nwgvfXHmzP?7mmkbdBE zLmi-hxw2NXu9e#*wfCaIp%nV6@Y|~vo?Q61RyT4wVM65#qW!B!%ly}rw_>vjwH-fH zg+q8Wgmi?g27+J~J;sc)RZg;8EJ?3*t!$g7tXf>3 z7rOyaqNK5YDfQn}QLn;!@$8Ik7MQVUF9RX@OtQC|Wny&MmFQKLC$vr>m^PTNT!#;O z1$hF<#!wwi;cH_{^qAj+W*b@KEtPn=Qc@}~D;`H)hpwv`ZB8)a4tvZaN(p7kvKF(x z<#^btxpm8W3AHGVYeVRcV@FAlk}F^sRWm7|&;p37t-Chb_TaS~R@+Fze!&I>uKjo! zF6jxTkb@J-GTPjCJ7`^Mmo>up{k6Bv@e0o}+T`2(T}rzReZ!X`FQ$-AbP^J8!hE&X za|}ER)`B|UHId*b>|}C41d3ZU2qw!l833RX01u$B2Nvp_(v4|{^;YjBNCEPOy;AX* z{LNN6g(BL{?ro&n>AhOO{8xD001x{0f6yybpik-HWXbXA`seHGD-G4IrgZfX+)OT{ zV8cc!$`ieuv5R1}U1};7Gd2l7zsKeR4~cH;yGiiz;MXbAE#s=F5^3#BFnDM^rwt(D z{3XsgeTv+}tUwU#fA&P5wb7;m^wFqTnX2|lkt~dFp^*zTduiPGu&wRx4&%xpFj*aN z*R$p=lW`EjQ!(WRR`OM+eh+uW6zOjc!Ua#O!*+;N7F&osQv=3Tg6}KjUDxYctnj`a zms3tc4j0Sgx&JV^degS{au}S!^ASHVjd^!9LB-52H94^UT(}w74EfwAUhpICN1L{_ z8wKi$nkrfuD@E75ps^;@-0h$XT{T6kc!$9ZvvhD;d9R+h$kw4}(|)6gfp2H?wAT3cc+}1U25tF2M?!OdWy0;x2^#gQ z$+s5delnd&V#VI-4pX74{P6k2%Hra+9%H?5A9+r#np7b_`F`2Z3MG|r2SDfxE8mc( zWRWpr#$_^vS2@N!f@hI81q$Beu>yJ+=&f6%H;i9FB#d{~8;$v-Uupzdvhbt8XC}?* zw%$Zxk+UajN@)t&s_{fq>2mb04LZ_;>IJ0*1=`cAe_#dR3aH7a;aD6?fEdb4zlrqL ziaGD$2gCN`AXa$B&c7XX{4#)gTfj_zqL$d2 z`1)4`Y$IITHVw}*PNuW_pm`#rj>y-jNA~$OWv+2_DGV>Au&lL2u5>L0tk2AbeqZ-#Qa>xWNx9Jae-j} zWZ&&`fT*HjNj@aan;KVKo4LqKg_@Q7m1%4eiqLFw? zuuDhNf&%LbjEJBT9C<+j3e-$|4faoVQ}WDdKhh*$fhv?`N@dJcJLHA=;iCAd9_B2( zt#`6|xDO3?=%X2MNV*026Z*KTnU${LE9U&ZP{Hb`BzZ8m6eMdk>5dL_%wAX#6q-m) z=*Fe#RW*MFuk^HXZu%~p*)~!D;Iy{aNPqu#Zz|z!r(O=?+%&pVOBN-cxABS|A)xGR zJKh8j5EOoIr?L?FjzG1|2mDxUvx2d#`SX$T=s{}aCtYQ8fZGdgiou$Zd&lRV|Grw& zelTc%k#q=;Ex16Xy@y+qj?LMJoT=u_HgtBsjv$|Shb=ky7@}3eyu`uO80a8f*=Vtx zeqT#8QaC{Q29*VPCj2cH&ibRL11W4|bi~$}ozKjPx&LmUA&Us(h$at$z*LGrL;Km?2<|V40YF$+mq~4(e850?O)0G@ zS%jLrq8`V`8zr{Sffue6>;QP~eHTg>aAsG%&|(9WORO>$T>qJ`^jAyy8QFx2`ioA+ z0lHVD&d5N_C5od^u_TNT{6vsQRF=d|^XDfuUgRA(S^cmd&1ZhK%a_&3L=CEsHXlLo zp5X#45%xZwSPF!KYnKowdwcg39(TU9B8#<+rvbxBe6mpNGYP{JUQXMd$n1I?6wQG!~1am^Y5!yKwRT_$YLvRBK2E0DEnaXFoD*y>X(}$FH>&gUG;;tR;KCEz#SM_aIJIU4wJt?#*{j|ep#@ORxxii zFagF-lV{3;q1(cHNTBD(3~O{HM34Z+G8l%>Z!7^r%f={^sCMVOOY^TeB6~<&?hO zGRmHy=WEHtgFwe8RM8-+R~LVDEJ#j+PouUJ-OpOq6~N?E^DKoqh1hHogY(-ipN@#WY<=Sy1F-zJls zFXFD40wHIgu$XSbNc7*bw}Mt8g7l%Fkq!GJ-{O&tP$L7D@-0c1Q`8sp?z>ltHFVS* zylmr(JyS?xZv3z|0(I8yqY|PE_@bsf=bNTbx(j2zuL_RO_z${I9{Hn>yX6NSGT9swI{M!2nq0{a$|?Q5!D`ZgqxWbje)#3M(yX!mSp8F@tN-?9>jxQI zu>8c+%I9NE6S&Q;ua0beJ)kuRB5QFS`%WGlujRBhZQa6#-4x_LYb&IM_mViaa^1LW z#}*=4bjz@<@e=Yx=G0q4R3Y_;!{4UZymxMN4O)`k%pFj<*d-s%SdFdcAVIf@bA*|^k? zb=5009x$hBrhklxXz9Y%v0n09Z*FU>lCQzV>V2rOv?|3iqLz0n9Upf%3mEC$c(>1v2OxAiBqhtQ4d?Z^r zqqgZjmE#EFyAgz*ULf{OEHC*DfVQPPY_Zi3ah^nUXeBTQ8C_`X)LI5qk9k2GQwhLP zxI zhr5)rtLeKk#@&`9$z2EyCa&-a2L|(N7@XOgO1Ixd4E%obCa-yp5)yCK4yXBut{J`c zRmh8~J*JSO`KKYi22vEr*E!E$D&RVi?G;d=6#!U}B= zXSk>78OYnux$j@5m+)XE_~!R%9p6|uf0Hl+%G_Sx*;yNb?FSNog8u031Rn5hhf+_% zr%X%$bwm20yIIchkms0gG8r0~pDvEGzH)_*$KkvlC>ZO_2_~cnGu52O+oe_CwcWH3 z2i^a1ss;xKGnY`RDDD3Cr1ldXgCa!z=Ats<3o`gU5{8q?%Ed`Cus|fj4onn6E8-!V@U^3f z7Jyk!XNAQZZQ?vm3;};#sr!<*xdhvtq2U!OD-k6bknUeWCH0+Q^&KJz!*H?}hDaEP zN}6Oh>#(Cf^Y@#TG+n-*?0n5qu*&kesiK!vxk*hyy>b8Az8H?U=d|cn?rT++!li>k4hcy|46v9q#EC3LzqHhes0S$AK?uOW8N&SSNK*tj(CpUuB5bL`EDrq?1rCJ3?^Xd)VvdEPyUo>k8Dl#6 z6z*#DrxvS4_DyklYz2Hxe0^I0X&V_&3w&_=nZW^jKDLmuhKF)xQs`qtfUF|lYe&vl zJ&z*MyOFBhmhT+yA!h_tM4Fh=%6~B^wLgLvCMbEEt7+epwxEG@z?6O&0d*?7E-Re| zdh<&}qM)o?+$v+D&JR{ZIL`=Nk1q_`UEYXlj(Wh|l-C-y9*WMJukwXP`JkUK00M8h zxJfp^2W8Vwa3Wj}^ZH7xP*UHQ=7|cNyrAe2rtNyhz=Y6(1N_Y-W#}B~?!C$OZ+3Kr zdunqt5E1WBzh$4-umELRywaP(l=na~8M(eSaurDnl93+!(rH|wARvvQARRo0>`;b-O9q$c zJFjj+6E4rV<`7$;m;V^sqZ(^u%&?6xBCJua_k>_Q2d%1O)xb4AsX>FKKGJ9#|~sHTX>kP4%W=;f+`V* zCp1jI%PNren>`EECEq%37THeCE!zh)5&s@$;0R*%!G9qLj!wVU%9Ph=cx#q;$xsXW z1Jza&*@fYck-6QEg-&4;nAmxgaujwm6?-pVNYN(Ye2M;u4J9JFMigN9T}_yR(hfp`efd~X3b7$o7oY%0%?Su(gP}69 z14}i;R`{lnzp^=m#Cxg_UQ9%gJW@+TKDl71LQ!Xvzy1N4V$@MMCgLSL=IUTq`%T^y zj?PGrI3c)yC>>8+1Id<_BJz|uY11CNm5c@&R}8h8WK}7$o7TT}9WH8Bzcj;g`^j#$ zTy>CMqyTeUl!9xW%hOcaV?k4mH9t^*(dYf8n0nMA1F&SaRJ!E zosL)b)fpmigN6=olBL$c2pjWB6^%7a=Z; zvw;9$|4=C#iyN$o06Z@)j6JA$VzUrs`6JNjT#uveS+3iBxZ*nrtaQZ2diP_vjQXqp zJbtg0VTSI@NhS>amIC#sZ_ycO{=j|p~b7#?2hUvN3e>_ zrTxWg-t~AZ9lQTKruf`1Q`aV^z+Q#2(L|JKj-bx$edwFc(jyI^U|^})4Gu%snJiq8 z>>qX-^?&eh2}R;~xIrPVlnzGd`1%WQhlldD7sbOVgLnvv)=}xaWBqxRt}B9l|88T8 zsnQbB7G)Vg#kb#uT*O5@6-9*gHf821XgpKqC_AQh`u|!00v4f4KX26qO?Nxl_9wAy zw*#GJT4vWZGD$BKq3ocHHN3qeR4ka^;P(A%5Ktzy&`Rv%9-jlv{WeB;Ja^}hVc;d& z?PXlIgQ0u7eYMoApYve&K#B(#JD1L3W#Nmmq!Z0ojK)DC2?*QhnGYm~^r~P#v{aIH&3A45JKn@&w1cuG&Ul@zS|hH684! z7`^zm_<)m?>IA5*q0Bk~U5ufI{Rlg0h`6CIdsG%PrbKJ&PucSU;by?tr=6y+$r>J} z=MD|TbGO&o;s}7D1S}=3^^_^_>_0jgb!QGKFHit0>7s#0obP#y#Py8@Ci)OAA_#$WkR$=vL~x&*7f-@RY4Y&Rr1Kw%^H^uj@!qm;yy3AFc1%m(t1U@bu$ANdk1bE`T($$i=F1-{SOPF4~uMAR6r+w zRPc5~D@JvAPdLBNvX6`a?ENbdQfffKl?af4}_mMYnpW=xV%&ShKG$*kGRt z*aqV13iY@HeAi<6T;AxiUHoehPRTLr!F${?x7z-kwre9+9e3m7Z}?VS04Y4X zBps~RabV%3ITuMPq$;opsldwf93X(pV{(E+#{^`+`PT0UkU!Av-6cEGT@g_&J`%0J&SF)qEgCtU z4mqcxV`Er*b5yf8386G{M>tV0G7yq{fhha7+2OweoTOmPc$irdf{spje^F?3Tq$de zCi}y7B~KiG7Xih4S>~Pmp!b-&EfPm_O}RVb|I{cl&z}!FvWN1H6d-}kXb79Ek_l zfP^>?y_g@B(2wi4R7k^xCZVRSeq?n(g%kqlt#{!Mbv7_06=$V-D2OuG0N6vjk9w3N z0|<^Fdy3ue zytShP1Q9Cf$?7YOuG$G_3sgYo6AuY)oN+I6hC;s`K*Ft!7`U zJpP(gb>W2?O&&GFsBRq;&ChMWc4uLmuuSbx?7eOA?{D0Uda?OniPPf|c>G~ZCv%f) zG{MvF7YF=?9HM!UUuJ`LI7b~zh8ut{IxK3qN6Vow4g?K!l>M+RR=X7TwPKIZ*g00j zc9Jd+VI3(jza8L=XXgxp2JHRhTOcDE5|G#n^0@x^a9@R*m)qpp&j|-Vl+03YfZRbWq*jgmn#n=uKX$!5VZcqUKcbmoVhIfi!5o8L*4o?$1U~f)lnxsV zFK#7sn^pUbg@P7nAtsN_`H%F_N2hUDEipiEKtXxl&~sw&96#o1Q~HHv5z>yIn+^pw zw2;Pp{83#}x9B6*Kp`Z}=?`=896Q5;$1YS4$~NX_qIaEeKA{ zQAC~x>NL{2m_EJ7Hb$B&c;;1d*3+-<<0rWQp)dI5tfWLxaSSs`mLYii?#Kn-j*cH% zMFgbIPMucLg`ojYP=Vb_`P1gjb!mZ!UNY?iA^`3n_`6cxOwq(=9tar+6>JY0mG1|) z4XYx|!ES3p!@Ng37z<;)a~{D3{{SnDaOAp>aBNvpj-KeE@ zD;S)$oQ%CZ4q>%EqWZ0H1H;i1kd!#=CD=yypwJ?|mP+K%Dxg7RUYJ#tghDb_8KEc?>f4%IDkig1!-r*=JT6BsdTHup5 zI+Wy1D&af}Otam`z!@#-FboCv6>P=gc0?4jQbPmx_9@}Fq9HP=_0ON;pxPkkoxecN z4IeLdzKtcV2K5YV7MLU%AG*V29a8iki3JfT%jAiu?oB@K4EOzZ^CnO?y!%IpdS^Mp zt1H^%C<>;%7N#ONkas`am1wFOG?Eb)-T?~Q`amn5Z6UkRAiXHeF)2BG4ip7>- zxI*_S{@71-1_w`HT=aP1Lwp^R$xCN%{%x!tsbMp(C{J3=sjo75s%V{-_(gKFfVB~ z(s->@fA=0o*^WPjLU`uoTUIy~2?LvGb47V)Kbf8peGjjc#E+8wO7FvDL8AUiYNL7t z_3U3`SiMOmHVR-C*tx3Q?~iywxZB?r&!w;V0Anfy{4HG>aAAL71yH6T7PK@N&DikJ+iaxxI=CpTZ&j6a zUmqf=_*y((#Sj(rce$vjIpa-x{@d5VAO*juZ(asoxVK{M7M6N@3Vg5dM_eeMov~bK zGb3c9!w8Hl@qmBcU)oy2gFCyg!Ibu82Yy4xjK5x>pOh{n7G9yxT~5!cH}UZT2(6W9 z8l^5#4Gjga<8w7M>dTffaOl&!=-~?=5#CgNE~Ntw$49 zMSSOxV;LS(o4?4{i(Nz6(@2e@R~OG-#UKP-B9wu$ToD|SIvLYC?b0Tl5|@~^95ng8 z-iPHC{rofQ4JR$~Ht_%x5j)|4m#HWpn=|d%cKxtn3o5K|sZbNBouhZ!-xIIrNBqo0 z7_E);@4Ro5zun)`iC^bI7%8pk^5KDu#c7uu-)kW6f6EM(w!h0APP~wH*AD2wc1oYv zEeb&6z>rm}yf6e=n+ml}ogjFT!8|l>;G9^ZZtnT?q%X#^;h2ZjWUv3B$Sl%gb%?ayhXMO+Eg=D;|@R9cK@Ps;tvy#Q2ZPQoByx7 zy)gMl9`^hjq0YT!&C;i}l=zD<%f`1su^8za8H1t|WszIc4-A9#nB(JG&=FtzMf**+ zb^nQ`2OfFFO>wGdE?mBJ66EG*K}^KB-2zyVjcrww&+=!dgTsSk*d5sLt&?6OrJ=>K zwW96IJ;hstLD;SI&Pri|kx)VR%&dW58^h!IDlsm1Z!X5q;`!ovC*T35sE;s;=v7eb zyx^6Tx%U&-=dG3OLbIuk&sm}JLjV|!i9jsSeyr)raqe;e0HlBB;V93lYKIeLeaVX@AM#O6>_@k5! zns}58hJ8MUqI#n*mmOkzpj1j<97x5nu|}53W>}})`Hq0aHn>K~c8|i8B^${QeO2NO z=_UTqoV3vO+@WvE9BmV?8QEHuZSG}aKZbja?86VrQ-U<2Mqt%p$Qczw#xE_XnRtM@ zmnrVraD@N5oLs+or#8=#HKY_5SoRlJ-Ri#US<9||la8|NkVE-B;1*7g@mUiyG+9}P zh(X`@k0kA$0+Rv#vF%^s;t#(IOXlDKcboV0VvyyQO0kfmk;)9w z4Uud)Ua}WuL=y#{;)*jM+M0dJ#7YKmfAh0m#sa69LG;)#517g#@)`#_4u~uWIIahC zhXW|pP$g$B{xd?aLubC$otX!Zt(eXCXSniU5@=>*wfGw|S}8h>KR9OG}+(Zh_XGGDtx`icmgaCDEES z|Jl_ubb0oI!(QA`0cp0O=J!ei;5s`RnjWdSx|b=X40$j$|03lUd+{(N50NfGQ{5ow_R=?LM z4?%V)Dc=p%@}Y}%Mi-5BD@}g(%Y(#?n_pqX-(4FS+NlzR=N2$<{ozSoTJUItF7J$z ziQX1i9AQGGd(aF#G`cP5ESl(xMop5TV;^8lbriQs> ztWntNoZsbh0Jg+4tE)b*!!jJ)fIDKVb_rr~f$pUn(LWb%g#=x+Lt>a30>(pWkJ+CC z=DA$7-Os+|Z*q6?+w|6@sV^b_=xRx8nlfi6jfzCj2uCwaX;1u+bmCti`l+a{(qiz> z*J#&$pg>q$4fNqS8@l$lc3Yi+I1fk1%dvQW7NQ^eBFC7BXkX<*Ul>oz{x^|dA(q{L zV~`ziUwgC}!UU!IGV#_TS~p5d0#iFI&!l&*EU<}VEf*6n=&hPuyIfN z!Mo}rMvXGj)pFB|Owuy6|K=p_W~3o_W&I`^%obBsd<;0GgZI8RV)fG(#m6| z@FpHKt!A8vZD9zvU2nLZW~deO@;*>MOGQw?ko*d(Uz%gqcAuYh@Fm+5W4qVxk1$ND z)O;tqv`~QK3^7)N6bhFE)jkfJgn6r0b1i790Lk|#T1DRflPGEi$l=vf zF~|es%_KdlXEp`x?XBDA@WAKv_Q-o^U{+eQixV0K zgV6p$j>|+mev@6}R%*9i@w=$2fW31|!gIWX7rqg;f!@X}GyVQAq3H;7`} zcF|+~oxne+Um&45$JT6$B+*NrzU1o$hD!R>*Jp}^aOy2#KecP+{NkZ=dFv^U9$8wy=NMk+@$NxO#2Nzu_K^8px^bG^ z#Aum`E37p6bDuQRSl!7&_9+iIGe)^EIBg_qk}VbC zU@5yM^;JbE&O@}flRwf$fC8$SEnO%+iyC?NHY}jMy%HE(BTqwqy|Tf-vlEe_D2ztz4V`_7 z^4O->i~6I>+2|tfzAKpmr924<7aA$1%(N1MzNrlCyIpA`LJ9naw=(6b1_$`s6~2Xk zouwX9M+6+CW1wLH!euPfzaDFbUiS;)Nn0i=f7XS2_xE3hXoc7gO)LK}LYbG>=I*H; z;hFyw-PZ5!-?$tc6)`|6teQa+ioksK0b{$bFUGY>!0K^x7d+c{x-1$xMAlH#&IK#W zM;fe-Ea!M~(%O};V!6F-3eKEIlE;wszC)}p_7deq&U0$K%Ar~L=#{ckjeLTgj4Tlk zPS`idEJ6-4MsEf#0>Mc&;D$GJ?hN)*(T5>bk0EHX_galx{f^ zS{H}*MSAM>Pxa}~=Ej|5m+o72LFUd zs0g+qOKsE8g_DR`7&2h(!9yGS9Rr1UL&ZG z_sPxd<9v@2TK{S`Qqsl`Wj@S)je^$1K5+%P+-Emn#4!-N?z`rwC8Mv+S6Q@0stHYcb zlOc6D)Ibrb7<#jSfLrWq_f_07lv-JX}=yrWIN6U49Z|2+gvt zjO7ChTM`0X3jnS#e-O8&#wRwV$>KeQudJKi>!pj#^M4MGRH>U-T8$^VhUhy}f{s*^ zidYdZI=MUiT)qZ_U*+n3LHHv0T&gy6!772%iH41yN7^nQOUCrGFIbj*3(i6lKkPD= zRprH7E|Oq>nV6JPn`=}t0K}-06G@+?eyU>p;*lBgTI5gLz;0Y1?tPo1JLi9_JnR$N zse=Zr{11AH_(xv%Qz*}I#rCHtDY)YEPq2-S(hD_VVKV3IDkBubsR$+>=3h^QMeFb*cX zy_y7jl^2T4{B2Ivy9db^Nn`1Ga0)L!DeD2T$WYJw!n zEGV~QBJC#3dg7Fa_qJHp=#s@6F7ofTqDVg#PV1A;C%n=Bgq)1UBb`IRrpEyYEP%O4 zfibkGz-Pv%&HJT1mz`kyV>O*6oh662*eAs^3od@f#X^~mEF9fAS7BBVkW`2~H~-@s zKGZWpXd0sEk2^A7`|m@SHF2SL_>M!Zv*VE~sb#2Y;!AhgQQ@coRVF(;zcSclTkg+% zsj~e3URgt~h6~#bIt$Hv5dyR~i@PFaD*IYCkS2wox#fIpw?%@(gLoc7(oiF_1zBWB zhk1V(Co0fSbvA2Fir%$W$z0hCo&NS`X9vU`O+><=Um>>jD&gY6XduuChv{GLB=4vz zU-kTN>FO?(MbBB(h2;yLmPi$$LL*TD@6C+VRp^IJ z$kZod>Crz`_@P&v2hwQrvh{SZg1w?e4Ng+%ig-S|b7vG;qxj}OYJy+oBg^msfH1=A zc9H7SfO%a^FtlxC@CpS^%5mPidM8iy)^qy7UnMSg1b+(wBD(Dhh0BijJYO(00FCf0 zxVAX_(PV>hS`9F^eCtY@>Vxv&gZ^kkWZJaS7u}l3N>mS0$8@3?3Cc2cRHrqMUCoT0 zgg^L=A(+64mum5e8#mWGngq&!Hu}0!%7-G0*X?bY^ljhOqzC`G`9b_s)^9eR2IBTV zTydcsfSp8_d!q(W*(GBWd{@7%(ZeAX1wZyxN0ZxY~6Ix zA6dAOD1|L=WL`f@kgYtk4L~t7 zU^eI4wI(k6%008a#Y?79LXp%)tU<-i^@GJLNYxB)?#BZA6~s}4<9tJ4p(-eY^P<*Ggb%%I|Wnb z2ngnB8Njv)cK)OE;WAZOgrUh|ilHk*f6>+T7y=@r?gtOCm_WqqUjTDIcha^FAO*IK zDKKwS8)u@Yd_8f<{c>=yc|Zqs2tZYBq~*6eX`=7U6aric<&jxOIrKoE_h^d@dsV_8 zzNpHP1g%=^*uV5tyVL)M`AY%7{&k&nOM!18_KgBx2|>TA5(OyR7A#KXQ^h9*ZdH*+ znTSb&KQNVh675lSJofF`DQ7MoI-Oq-*Zsu&pV7D6lsF$Q|BXZ5{J$1}S_Kx~KG=zh z0Cefez6N0{&|Hb#D3@^DtB7t(6`Kky3U~F5xi;u5Gcb@@v?|C&p)AD;&zuGo z}T&7AImbzGQ%*+0#u7ii|JlfJr43)iiI z>INy(^x2Jq>0ZnEeJ1<^p&bGMuTz0SDBK-*D1d;5pFW>OgZ6*{$?p|;!z>AH1pTX8 z^sd`wbSTx81Ir28fk4mk)kj7rUizGxu<(@_Qhv1yXldD0;xatSs~Uxh}2s0E}V5a0xB6lSyc?cbS))iGM=OGqM4p9u zRV)M3(d3%d(W;}45*~F#GS_PTr&UL+zU#JEpLfI1b9{&j9x~oIOn=U~ZpZPhX6OHr zu|GelRDV<=FUN^RErMV3P^nz;hSNiu&ay3rv_zQn!jWStN;3NKNe9y%Fd|A%S)pME zFu%P>&0~tRgZ7{uIj!1E`C`&wAP>-}Y2@_#Q&>v{7NzUg(&KNvES>?)9QEJ^e}>)5 zs{{imr~;h(?_IdtVsLAM-=DKASim9s;{l3zrso52!EZr>Y=?YCWHJ2zO&tD%^8g^i zv6#@UE}~HoP?dkM1#tYR;{*UaD{4!S4#5c*u?GhkBN>M9jHptEH0-42>Q?xX(Pkj* zdoXuZa^PBVrs*`Q7A^Q8apI)VNpj@A$Jc!OO&9MPwmVC;+(yaKA+Z}@6OHPEs3{g7 z0Qq1&W$n)V=edAQX8@)5*wQSMrH9yf;yh{CErYssF5@oUv~TVbr=`@52*I!Gs3Y1v z{Q8gGbGHQZJs!1pKN(f2B-xs$ln!_o`JTRVI!Ic?+T&_<4hsbQ6hI-U%ePVMS||Vr zdr(nv!piB;6zK|C{$Ab91E#57G1TqWU%P`ALJW^O164cM9_U}CBV30az&gz;bzJ;@ zf+1IG3}B^ODUA<%yaWOzX*od_S=K2t2c#vr1!CkM5X->W5wpp}^yJpDiSd7)nLXkk zZ~WzF|Lsy)p9^Aj2fFd+fAagQ9*+XjHUT+!E$(C_~ph zeTO|7o-S5S;4r-#s*o*$6M6C2mkS}n4Us&e&DzF)BHgF;huj- zu`bAY0HN2-M?wf^8o62oY}bSX0Im~VnAwrQ);?CDf*h`cRDj}MGbu8cU-}$%Te!;s z&te)TiT-cT$^L(W59si{0DywMswZryjsg~Pt z&3$i@Ucb8%cUFtvNBXa9JpXdGtyjC(P!L4hqodtp9!RKzJUD|j{_+N>P*Gv5zILT| zWUq68?qfj`6N?#QpsHe)e)6FQqepk%73~)vzhvx@qqG~eqruXjouubLv-|nI@DcAY zK$ThL^NS;mu=ka~w)Y<7ROz;Qy)64or6JSPG1D!&Dl!YKW;D!}D96^*!0WlV092`MbH?XoaBCR=&{V-%AAWC%@Ndg@BnY~`0DzVO0|4Tmn>_yH z=!A-diBR?%xdnVu{*D;1)6+!p{i7Fwx%ocelLZ z87~>48B4mzhR;3lUeT7`h5)rnjJOT_R~{>$0(p#42&w{v)-xEd%j&Xp0f4RqE`EYz zSh%>>WLR2=$q}JdmA51~G0=`OvUgvE(A*PGMEBouNA$$K_eHT}(1gHI{TAkF6{Idy zi^_OND5DrihVtd7l@~#{TV>te0laSD*xFH@4q&!<~YZ?D`j!*mmK8xZ+0qH(1eO@3M^eA@?Am8G^bZRKdB`fWt`p(UoNd#@)y(022tjSIHG?Llc$1W6l8s<06@;P zUtl`Dn3Dm{8~{*+2?|x>(){?DC4dY8+OlcZD3e9>2f%KTbQgeR9NWK}+mmW!0APasEdT(7 zO)0zTPP_4j>ePb?wenG_Ugku z5D)-B_~+ZGLB$py(!=kT0{}GN+Q>QpDB)hXWb!jV4Wmf7;U}=P--Z-;F=1k5nn3!4pWIWe+%k<35jraYptG>HP@*C;) zLk0lOxh@%N?YrZ0*>7^C5cKn8)Mn_@CMW`tVs30trXg4*3Y`TfuVELLPD-9AePnuT z=H=zPM^uL`jYuA0$iru6767bR6T|xEF+=Sr4h?b@&D`LKbp7` zZ8LvdVO-t65A6{EVCJ-S(eW2AxH#Lt1p@WorkF{6Njv z!Kr8P+-J|_+9t!&P9ZM@l|>mFIlEr4F=8boS|4;Td-fl@>f zEr>|ABeru9^p!CY@{)K*PW)j49$purPr1N;sg;90v;%`U6gnJg^i0QB6{l<%py>3W z0csTv9t=NtarMLSo349(s%{KNy|$ea-x#EgSPgOPHIeO9GAs%pNMvrYYol7Jb>e#E zrp{RPpJpnx|Ni)g-*iageGd9El7WfO`^1j_B6#P`LgcGuo6{;FS|0TZZHHqfejZr5 z#94y5(pXRoETS}_5oJ8Akc@nzY z;kZwKg|ySpHM20f$?h5z08nc%iwA<25D2A=0@p$F@L38Vh&y|>zGmZL4FJx)e&!108lk3iM0r?rMqlW;THxBFLtJT-#;3kQh})AN`;{U08obX zQZ&XX*`}8WNPhIr9npQaZ;LvzwT~y(@$^sSqtN?tfRAo@1`Vm!)Q0fK)@bls0LwzN zdujezA58o0X(BK_lGf{i&ANK^Hgh|oNle8XtZS|<|kxk$7S5EJd z?0awy!kiBk0pJEa1-1=Xk+KdcuTdbt(X-!}CDGD{L)i%d00Rn35I`7|NjMWch+Xn~ zQdZ?3z{lK{t=kGS#{(uu0Y2wUlphadY~vI~$%P`kyd_5{J~Fjx?63EJ?3aJ(U<3Yx z1^}>?FK*ADD}j8!C-Z+X5>3eI-yBE~D<14-eGU>P7wFHHf^N}3I#fea+-fnLfDW1P z=*xVVXJ|w&UU@Xx`)NIeKL|E>lW^hBhX&}v7jdnDW{&dtz5DsI0Mcw)L3V{W{fQkmgpqv5#!f>mfC>ik{@@|Xp2MC}Q$h>p? z000>zG$8;&ZE;yc1KV8>_t+>{D^VUd#(=*DqH~IOkkF<0)Wsu zd)G8}VJ84$0}spBrfYXzA)7w0CFvlZr3d#J1^_rVEDCuam_Z_+V!f(0z|t%OXj#x4`Bh=e z`zs z?QjO_UzDT5qM(Msee}_Xyhoer{VCE#svrCp<}i4KGwq`nvns2jOk+ud`p{e3B9~tC{r><%p>TEq>}Grdgv{?> z)X*tfP5but(m&;Z%7iw*rvZ9~rYYdDI8=Kl!Q_B~3VOZ@)&ly&JRgAtC~{V*;Yxit zKV06(NzPaupkkJDJta?``gCP*4Jk4!0N~gQ9i; zJ~8p{x$EBO(d~Cco!z^o1ae)-dXoj98nA&w^wr0Z{F1%b|5BQS6bc3R@FU;?QfoB; zAb+XI8KTI$3Dggdm*#lzZ!QgyO|LF{=0)g_uaftaX!(+7AK~&TLNSxRHO>yUsTLr@2roMmv=*!mH7A|6rr7Eq4!uu1d6EsI2nLL5)t)1RpJO);o^yTZ_ z=S&r2+B%RRO}5H*+RbgPB>rqCYJ4#|?XGV{Teci9-{vsuZYWAQ=i@t$Z^X%4ByjI1 z1Tk$EUx#dwRP7OhAHht(Q#BcYnwe=x8l>ESNc=0QRkufJVjmpxSc1PwtO6=N26wGn z2^@Tn4o23FL3i{LG@;h7D@Fb0BuEp)ek8A_1kMC8nqY#N0X~6mp29l#-K+~*Ufa&V z6l&%EUHii}+3o}X&hmcUy3RcNxr~8XTeM$l=HdeknD}wPoEiCz>3?bd*GO3ie}5Kz z-=vXzBra)z_a*`WVp;%>y#N*f0RXJm=xKy)fa&~&qy=6%XkrVi!n-@vVzENHI?!$h zJnjpI&LQiCV9YcX1U)Codw0D4%>Q?kXDpSnYd^l@i1G2NFtN@Hx#mR+A{WC)tob1t zI!p{eQCNrH7b?hyxo;SN5LzaA76ud|Y(p~_5I9^_te$mY{Cgj`KYC=_)@biTk1)Ew z4w}Srk^zIYOm$ORA3lDRQwFSTL^;&y_zEpSIUQoGy$I*Uc@k(i_=))PE0V^$B7b8E=)-nzS}~}?`w_m~?R0Ca>f{?k9v>^cfb&Z5JNk|1*cvy`tD~j&>e(kc z!OVq#{+T5QWdNd@G=a2l6ZgPvwW#$!njikp|8^kU1H-JlzT_fA9iREhtv@^8PCiwu z)+dxd>;BX5#dH+%w5kw30DvZQKrg3@B^7~EQHf^ggTIg_QfQ%$I)l&QvqsGW z;P-Muh8mGkmQc4Q;=&)#RTDY{Z=k_ruA#A8fC;s7kN&rN!uvdkPY>*|I<@j_+aN}g zzgaM$0fO9VfYuh@HQ>Trfrs_E08ThuIg3D8zqtTt*$Djq^0_9auC|!DngRlJyHYr& zw!x+#7>WR37BK*H0gNk6pdCa3s!IF1YTIljhoUJB6kt>#?SyW%!iLnV4+*sji@~11ffWkF~K?Nk@dk`N38gg?!t!5^7!ZoVR%{oC@ zD-CD7jY?-ekNh!^;`pqxBvZIGyQm5Y@ESeHOO>fmbfAdFUHCu-9L_Tynnj~xzA$?I zVBWOrNwtw<7m0Kh_A0LALlI!L(qhjw4< zF{}U>b^vB@6;cX6egdU~_E3hH>2$ zHGZ#q7!AEwI|f+*2G#AqSES=@WacyNh=ARE*;S;(mIHh4zxB50@jG`25SWj~u>(N% zlJh<;4|Sj75G4god7eva*Yz+nbp@H! z!x$qZE>%!rDbfPM`~Nl?tNu}I&DwvDwwyC^jKIhM;Ea#lbZMtL_9A)o3#47o;=Ea4 zCj~NL6U=yhs2bE@4HC)9|>%_t*xq=d2#4FCv) zKFHqu`04@(0{TLcWcXtMT( zfrn)PK!Jg}B(k+SZ-Z+X+ErzB~}Fg+_PBV!eBy6(<)L!4U zFk!v4^6+}9I28EEpgyUYJ|6>6CK&sHfZ}gqeO00Tx@i6T9=tDlVB7X+|3eQ)wI<@> zu^zECO8KA)3=1wZ{XtiQ2_~>e>kL7K3nL#}+)lYQi29u-RUj8%9>Pukzol`ez@vp1 zXSC@4eE9Zh;+KRxZD{)tdS>dUZItA=enx#LQp0@rNnItl8vE)iL7pd zEL4Pka!aSuf~HKz2+HVJ^3YS9D@XNQMZ#ksuOgwid_Fw}5 z7uYF7NQJRXp+NkOn8jVo)@^~dzn{Wi%}ibghCU4zwDgmDCO{@+y{xAS=5U9>c+}iw z9t@H5Uc1KS;Ha7Hv;;l)Owf|$9-s*hi61h^3FKKQYBf)cZh)*nuR-Jf?0D#R=Yt=M;X8OWkOZ92(?nMiw!B_)K%<1?B zl@8Jn`_UqqyZHy13Kru*kPH(!tN}3n;>cu437k}RNo>vAZ~4XZKDrS4eyZ*{?{9am z*}pe=l#~G>A@hh>AXsX^bc=@pnc=fEh_9><#d$1(GoQ22bvW!;6hTC>t}=QktD6AC zG&m?q=y@H2U~WFzefN&&;jOnujVF=2U*soz<#cChO1~Wf0+>K4HirV7eZ%Tq5ckVbiXT25xmj%|j)=x?R zG_?L@qN!}Rh)a=y*1VixcV#mW+@WyqA!Ae^yH; zE~(zIf7_ddHNQ{xof5x;IUz-_nm4RN1U!zGf&nhB28E%4ZzNxU{W36sUwrU60cDVM zz)CJd=Dkdbd{#IjG;tN$XIe4qQ0Qr`>~4r_9UK??IhU(HjGAW*0H`%@_NNf1W}OLt zWhU<55B&atz@|1%t=s0uzy^030AyjCp%Hd!Nw7EsMapnMKzn!gBlXb?Meblg!7wut z_khR=24Sv-)|$BvNd5*`I2QPAPNJIS2w>Jnfd@hsp=SU^tv&`Mr9nD2Ri?+SO3Jf& z@g1x>{>13mXKb#wSFfo^QaQDNP+;PmZ)6X{_DEfH0~rOI(R(?hZ1(^HQQw9H8cKy$ zf#s@ZqjSiuUvac$`y0-F*8s9#Qa`V|_TE1c7tfnjU)8zbRy8qYqkl}>K(f+)rt>h& zq&>wwE%Fzx2s>%7Bgsu_ax5=B%v>MHZmO{lbpgwhV%~pHO#TmS+ZNR%7#1LpYa3SYplApr7Xm6rX@6kYNQILt9GPrV*u=9`IIU`XAFIZ%_>I*s_}rF0aRQ|r4?_R@ zd$*q6sE$3Okt83Ni0z4*ZA~%VT~VKsQm#LXoxrrVoFLAyXt$YWl;PB}z1x_%EVNs$ zaq2x8VOT3k;Q?AHG$lpi6lSVX_sZ9=DS$Dgy5~O)#0!E0Ik~RY+Fvq^&^=&nKwuFO zB3Oq#J2lIr3|$7SP>Ci08fZw{9kd1jco-Az(ZVSJ02ASB- z#G2@&=REJ!-Q%my9!rojO}0rn0AO7TUL5EQqLil$0ND6Yi6#SMBJAp`~*;iwpYS7|ji{FEy^*^@r_Na<9*m51Fdun!Og`!0*Md=Cyl;5Zt zmI?=#1Y||ZI2BlPu`2!B-8}pzU1tuAr3BVCk%uaADoW5Ed{T2izGEXIGxbs9pNgsz z*v2PV2V5J6= zpakT83B^%)G_{aPD;-4AY-avq7YmbE)XH2xVGRHPAOJ~3K~xt$#rZqgPj;&t7loHp zvmf+Spy&)Zqym=RGxK^7Jm-=Av~!rxTH$-5w}HC@z~sChokG+4i83_PpYLxL!QYmnOCw2o zr6erIt~lN=BZkvVr0Pz+RuRa_6Sk5^E4Av^By{*Y&`spGTjuxd`9}1mcQaMyxu3lK z;=M`y9y#jxxsoNtvdeiUHMMf2TW|(V8Rx%yVo4GU(EJB!2W1w3ViQBqsp~!dTr@fM zmL0EL|KJeadCH5Nf6X1gus^Q+FPS(wvQZPiNKOONt|mKjU#-%*n#qUf+If?Bif0d5 zzl(IiH6wk1*}5t8TNh2a(`jN4r%-RTGu}?_Pab_VdgPW{XZJkxz)T{kVR`lg*MZR< zX-#>ITMrcf*?57mOMR(;!;lqvtO;mbQPF$d9;ivT%o-z~bd{JYM+^XAVrz#AgywL8 z)mP%bMDS0F;GY)3KgsRgjO$`NfUahJg)KU?0AL|&br8XLZ&DiVal^rQcJ5JK06?eN zl%;g+k$cDIfP3kZxescRe1W8;eCmUUa(~U?d+?Sai z)1y=Cnq?Q+l{3(OgF6UG5fGQ~gJD3x2z(@^*|H!Rv@x%v^k-1TKIMcnmY(~^O>1mI$g+CrAt*?tN}|tvmV*{} zx*&oDwot*(H4-k=9^fIQqMnSS``&$WI@*i2zy9>E4%?@vvfMe>?EGY-)A@OI7^;Sd zjewvf&{n!eM_#P9WQ$tm0)X0L#;0rEq-)@tVmURf8SA})T`q|n+k5N${SWSY?ADv3 z#$!*`<5u(J7%~t{!SBLw|-948H0cZNk1C+wB z4zZk^-Z&Ew@^*z79)WrsI|TB`{f`SBuS0d;rqAs>r`3!dsL2*=SD0Y zxzZMf=HJi)kRGK=A*+H_uc^5{x799Z0f4~PV}C=_y%Sm(H-KwiXQ~C5mBAaEo->eM zx3<6}3%!GfX22Suk^RaLfFRWxqB|6Hn<9tB!HCBen3cm4Z9FC#(08P#Vzy5nZ?)#W zyzkS$`q{KCi}Yu2xO)3$X~+#~;?y_%VKs~?#$teQS&X0`fjqm4mH~ibTe?lmu|$t2 zAD?dRdDBup7hv{Dqu zxDYoK%=$Q@R@RDGy>^Vp(Hp-1sKX{w0nG0L(PEFiqKPJ~_nG}Kt z%M(zGfh-vVTTks#307uLzd_qoW3_H2l9xY zA6xqH1OOWfc##Wy1{Dqk`ZO4WO##^F22KG+@ihqYEkvFy1n@1EZhGCn7z<)gTEVCX zW9f${tLs!(lIBan%M$X@x-4-i;*Jucxv$>b|C+sj`g30*-}VR50`Q63Z;Lg%)65`DhfsoX2x!-uA7^)KJ^(O-D%V9fbB z*WENdw|D$WAz{roq&^8fZ$L-8i$)hO^aru8!98USJ*w%&$S}SV?U>BA_e=`_kbRU( z^L6eucWr2PqQ8-iLuYGnnF0WA1BA5*R0CIlDI3aCx+U)5HM_X})7oW=c31%5_h|XN zsTXwB7N0+=lzF;etXr?V@v76mGIA>~zpgqxzxCxJ=2weFV2!NDmx``+iaZX{T@$kY z(Clehn`0FBX0dg8O35lU4P)?;cnB*MKwbs5zH|&UWjpfpBeH)=&Z?i5Eq#+RPcZd! z@(ADj9w>k5w&j%ZseDM|TUdB`0)Rm=J{;M=3NQ@M!Mv4~>#hAO{W+J@08fkeP{K&( z%<_!vu6G*$W&a0W_Cd5S2LRSxeftfPz(-sFy1x*F0cM(>QidB$;A^%uH6ewsa8M5R z;w@WLKHwa%k=v$2nU7%Ar<6{1?obCS$Ei@pkO|`;fR2J)HU4xTf1v5p0$_+O4QB@#CPkj4@acvw44LnkwHLd9p>Jpdwt@v()|sh~|0-AfxJaL@PTtCs+7 zf~FK{N{6w5sQtTgw)I~&I+cg^Pwsy>`oOP9vj2no0(d?BfIza=77 zcqRz>h>jAs0Lr^%%PnW18PXN75Z*GfcG!(a3Oq&Ec<5c{`6akkK@!~NPu}vXP1Lj& z^}2k^*wlPaIAXvmI zj6*(2#~)adoWh5|zUssb&HZgL_csyv2W{T~T4rN2M#4A_6*?|X=sd{Hi2+I4BU`yGcok75WQB~fQUnQNfr1Adw z_r3I2`Q6(DCc5$C+isAFqYFTVzlsojum*&QMyH+zS)gB^XO=U(&!i@nNcR#vmWPNBsVx+3G>Uw;hbFTa08mzEN)TW&BhH>O)7&r{Q*zi7ROoW8xc$J*hZw2U3(Lf{vtSpmR}-)cq^n{i+Y@`9^df;}CP zDztcS0h3vFNcu$I_LM>LtgtSe4d)wJXm3gLId|1sGTmvMaN{qYx8$}1p8Kh7S2V{~ zT_f>C$P3CjXqgd4*@XgP=PSK&z)}JLwx*rYrt}q%n4_~!`}^^1=Z9|lnX`5;i1
}*EQZg*Ono9)VK*+MHpg`FRkbvuEhgX}B`ak#{j5{f%UZvpZWfNtej-irA6 zYm*XcAo==nOs|BFQQ=dtpnS<+W@HP1f&Ui%bw$eWI&c8MYaGV>KH@MQl;Wi_tIv~C zDQ0}7jE7;Q)BaOg!OJz&0FI@GPYobtDfuJYO#}e^bRGa~{<9nEkJe|uA+vpYtko(NdkCP6_TX(a9Ys@3|oCqHn-l01+8jE~&*W6h}gB|Sw0z(v~c4$1?t zv@_btXv3>tDDA7QC46-Ye>Lr8>rBBIz@}K@+N}@Y{-$%^bO5?{z^agVjIpG(>TZb= zKNfT)f$R(#g{H~)1$kR!iu9@kXb;_zY^=&Gk3&~8WWiL+m&YoLb%2?-Fv+~^m8to~ zTeq&icCjb54cWA=Vv{fV-IE&a)+Na~0^Gb;ZKN_Y0@$bh1$;QMyyh_$|y(0eo z+N7jsz!ANo^>d#;wu{MJ!Lz4Z`W&q3V?2vssu-qo7|vzh<>tEpLLRJjJvFaUTndYA zVQ3vn>*^_^)avf^oa&r~@}c;FNK@s|tvn8~VI@?);eea4PA*AA#|QVnuK)nf{OETs zZp4$qr8@=mHwOTmU>D#V3;R8& zCw)$OO&4pi9&f7vV zrTK4{Ns#Qa49O6U5*CYUR1-R7j(hH7$8V}@l9%)o2L`P3W3)Izq^31s4#VLGt>o~e z$KacVE#n#S`)c*McieQv=qIx+u16(zi)CQuvH6*)+41V*&E^}$YWF75{0Rc$iP7eTK)Dx5!Sn&|@ZbtV zxwH`A-b*$OesWeK$GdYbY#H}(SH1D;V%^RXv@It18C;IoJ>?h5C&JtSx-&`wQ?Uo< zgY)kzxB$-i$PZpQSE;>Uk_8;axIrLwaMJYf1}t3D`?+v@(Jr177Hb$Z$hqGa2ms0^ zzYByc1OSk6YfTKm;UrSR+cl4>&;0-3^ctnFNX{(-CIJj6ppGndx#1Wv2< z1^EEDM1~+y+Cs26C>OHWmu@;aZ~#CTss`|IQRCU_r%^tD^%k@pT0hzbV2)%hLN5=< zDtyBozqsj(!;I0vF0=VFw;laNb@B@WZl4R&KSp1mt_CIHI~WjYT>t>bThD6XIqoAj zu6t5PwHo$&B)7V9nu_|&7kpHM4K@I|1Aa#b)KI@3+ZlBaroI(Qk^I*=2 z!ud98&du>t0RsBEkcS-qJU_r7=)&zKhHP2qYEQ3Wyi*sl$%%pmps1vfrxUzf?Mv(mC21wQUUd-~r!qn`l*Y`-HRDbrWKKP#i)*Z-i{ z>TdT6z<{km-Jh=#AL=g>^|+5!a_93|dL*URrBR{D0|NQ~Qu6ZOQ*Ads^5A=~dgyQy z`r#yO{Peby+jE_-Nm|u)6g&_#;?HDqq`=f%6f_|~$Y@{)#4u<9jPQFJL*Vxm8X2xd zZft~o7HN`cQ?GqAsZ74*&eyG*8{v@$rRbTT+5QdzUB4?W6a$iWg8u>l7(Y?VhIP=i zX#H(i2#_(&Q96O43ZLM?QT;5HN(Jf`WIjCXcA-N9HHoPlYZgn100*nE^KVn_eLwMo zS6{Gql(sz;WiP+(y6RtkrG8$!U43b#T0OFw%wH@$dkzxHxG`T%%PL@E*$ODR36%D5 z-T07Oq%=_+&H=z*%N7bw#qZ`?2A`9^!^JMww#jEaC6xgNiu3Zz#wHau3aCO^rv1?wVqd!&nwb!~ zzzQw)aziElVEa8U%Etf*0C>LufVb)iQ01>)6R}vc%2Tlb(gAb=F@Jb(;83n{6x;3- z%zA?DeQw%k<}G{cNqb1NLy5143p&vo|6iIsE;|C$&ts9ZD69CmO zM6Ur)<&qB)BQJt*tCW1dZ0WmOBKn^=ao1!2{_PJViQeJ=+W5t7EjW@I zV+9L<>M)+yJl{`WyhV>?k!cJI{uVrnA!+py{$4-DB?yIUxqV+fX}#u_H(s>(?Pd$^ zKop(%nLExG;qh4+?@eWAFO+kYtmD1-ba#{Vo<_?|6*QW9`i-X?SSqhdW&h=!p8 zFfff(<7;GGkT1sMMH(Ckf$zeYy~)5`8u-Zx)ay2zeequ?cZ#y67XTP$ASpn56dVKq zG%>E--2(vhawn#J$eI6L_=gS31AwgWLA-^5PrXZ%Z22pYA##X;>90vrp4 zn!aue#GxP@A2Jw9Zwh-{lY}aY#Hmebc?ANJ64a~#Ji9^e!FQCCERM2mzaiW7=e~C0 zajRbZ z={hfX7DC6P0O-D&snCP${U&IvAnRNlU$ym(=U(%aO%U=hTyy7Zgs48QG}tZf2LS*I zgB~a#zfKRF1)xjV7oM*gqMG~(17KZ48e{p4?a+EZ-eMi7R9ffN8>_Bg3cmlv62g|7 z#*W)_PyLDg``;i*f!^DKe;Im&9B<4RTlX*WqPopcfN8)v(V81TUz*&^Upz_BMomko zrBkgay_L^0KJV+-Wx+7r?&A49(0#5YfdwmlMqmL@GAOYCnD*bRUELBzK|scbdW}b( zediv{*u0Ya=r+)rWeUUs(Cq?ve;xpMGqQy_j8GkB5*Aw~4B+YI0tlZ`EHkJd3jqMm zOf(-q2tp^)Bk{9sfY9b004NZq)d1(>@E{+NNu| zv#|Jw+pTKl8*=Oa&)#Wv6S67FZCNMB$CJ)Gf1QA8l3~Vi7~?!4&PHe_PLhbRD$Hy+bikhMDW-p8~~G zH)I?D#AS3AV2(dDuH5bS(LI$ulHh8UzX9*(-w_{25&#IZkNEhwZ_+#=Xab!~t~C7? z{=RZ)`(@9a>KuN!9vaBcZU_P3C^qo`bP_Y1*o25~7GIuLR$9h3MxhMe$a-{a9&xLu zyAXxHV;%m&w4c=d8N_y!2dwfJKYn1wj zcfYvZ)B_+N3L^g9Zr_czqu1l0m}ejT$ZO8+RjsAZaO3}G>7{ob=sEQ(A#irr6ALuo zAr1g^4~Fw8&$`hE&?{4ZOXqo?@&pl_*wPqU%2;IF-Uvu)lpP%kkI^gSTX8ox# zbZ5(JE}->4T>zl$Jflf#0uECi5YU}o7PE5*v88H3@^DNBfOzl3_0M1v073J_)ywy| zqU^XfrR!g@>c-kFe|++w(RSq(u;fP&Vmlpzs>V|ZBwxT-#S)UF_tG#~&?V4#2ZA|A z0D#R75cz3zMcmzQ?@I!I@i0LakPi4gW+{iho_yJ$w;C^Q4tR;LvC^ee>d5$sr$EC% zzfB?lu=J3>EB*9_)D$O;TwG8ol;sR3`JVUZ4 zp(JZ1B%L0Y;we%cY^{Cc)(^Vv*_wVcXLb1_(k39F4dG3Z!q^%C0F}5Y|FR{26gT)n z$}t6HGp|7E^QF%{%6j<7m?khycVomo<}H;B5BGz>%LwA02LAULS6Qp>#)xqo=)r2A7CLPJ$KEGPmr%Hw&UN3SjEYB4Vm`!aHCl*gm*jsDyA!NW$ zLZ0;D(L$=;6?j>yTH$Q-bJB%%nzu)I$PgzE0Fr1Xd(s-8SpvOdSEf;41afqDbzPXo z<2IKfdV>uoMGoB+!%%oA9)ig60N8ut1B&qEP1v(1IG=s}Jpt8s{lYyL;+OCMgo3eq z>Ya-ur>+-pW5(S#mT*ZPg=Ase`QGm5B`;FarpOld2~HW6w_PA8e2${P&SQAZ?}V6C z-X_jP*FPweOj<)u z{JB>1-+teTdtK7&_)6V}O}OV(4}1`o-uvV9FLchS69B~L8y}CZlm50W zXiKXC;Iqv+T%@hb1ZheCTR)K)?u{A%I{m1pq)Ak8oV@)UCk+9NW6^^*70= zSrT&FGta*eUd6ZP4>Fu+oT-u+wtFDSZ{Wb#IV>5NmDm|MYibuJ8GLl#Y}Ym(8i@h` zv3z6`>)iOaJ@rpd$iwd=6#>?omt;ZF=*C**PmJkW4*=b~qQLwos_pijINtUl*QIMLLV5nygfEu8|r$`x~wddP(XR|SmxVrUB6tvHPtl}X#fL^Zq(g%)O^uJS0^G)IT z1Oknf-`yXTpr;{3wQaLGdH_0z@}MFK$4MxKa-K)iip&hOUHPbG0V_UfKTRe8(D+|B z07zP^eBC#b1=q z{7Ry-NM40tQELr@lIBK`EL;C;#AOJ~3K~&uWv2(5OjX&xQJoke?p7q9Q=`Fq~2%5Ap zzVNc&4nO5QaSJTdWek?6(9bSeZW&HU?|4*s!4jMtY*Pzk$@Jvm{NL zemG53hJ5znx9@Z2RIcH^*FC(|y3xwl{r33l*f0hareK1G^0RiU=y-j4jzlK_$OBMO z4}g6^-g*Sr#Q;EB8DPM}!3-pLAl?@8GfzQP0DxjSIVG>+quS=B_w)fk;+CtPcHLVc z@174j9R|-do%3I1-`|G!IoWoTZDX=AadML})h9Pi#>uwrnQF3aW2(uvZP(NHhv#3| zuf5h@`@Qb_x`w|x=CMub)Kv-fuDO(r&I{`ked+se-&>AkEC0EWZ5{d%wdMFrGwWAF zj%I-DkefnTg#cz^6l2Z8z%$9=$S!52^$9Kn0BVMva;S$(xe zTU~To-7hF9qw22L4L#Z7;@>oFaw-7G#z*r^8R38vAxsah90RWay+4J5qy(xd5X4>L zA3zzLC?a%R43y3j>CfLTD@O$>H;-Jlz2z;x*e`CnycRxlE?0OG04Hxoh;m->Ef|-D z#fE=oWLT8h$4p?q>3m8Mh}Hwp)%KdvW{~o;ccMGGKHZ1FDr!>ZMt`$efNTZqhpIEk zxaD|ffg$>=9o9Onn$6(5zAxL`3bc9+l+@qoT?fBh9VFbf*?^{BXCAyh`zpb4#(O1^ zk$p`62do4E^|J=#N!@p^;K2YFGXB(|kOA(Mo?~)_x$Z6BW7hTeQs2Q;dGSrbBU_zy z*5;dr`wgaRWvz^Ksy;sVISURUpxd(v&V*I5Mxo_ld?m5Z^~mIRS0C<=#fO+4d(ow1 z4ujKf!W15EgX=N83H={$^$D5iBT&6_e>0yIC7svDCUF^*paU%<92B4AuYkho4lID` zQmaw$E4j{B4d+WcT}&hYzF2oTgxoapsD+loyP>$x=gs%UMMSp8>rrvn)CvwyuF6+0 zM{o{17fg|kJZeQFbXK5qgeyMl4)g4sFO71r0FT!kJ=fO}z?5X%jTF*XEpr7c3pXDG z*9C_38@9Q=%TGUJrfxk>Wkg^y4a0n}w-#J+-3?W(MQlOWYg5LBI*(?t-(}4GaAr&p z0)?J%J|Mr9<6bwOx0tEI@4pf>TW5W6{jZ;IJ#Je&z4qVM4;kO|8W^2HFk?NeYsVU@ zl~kwFrhsU2w0xcD1Ko2_o-5<2s-r{PLAC6si2kyYkx8M^3$5!BPJ5%Cr0xA`NHW5vT!_V8bW=X$kXjiXL*)172-U`qSW z?;$^Zwkb~TsTX8N9i||QawXVEk-|_wjiRczLiP%4yI=w|@VRZVXHYdpS{OLs;LI-y z;JF*W(YVi;+BYLdGwziOu^K)9DWME_Y9pjv=@welj{xhPq@3AUqzn7r<0s`VQ=CE<9QsW%f{_5@0s_r@F*>k`kBjY zrD0IrJ*yEOt9Svu9K`gFCprV?Pv`L0J~HxBe1e(^3ORL4TCDnjkKQ-);65uf7Tyn$ z;O^IOm(hwkqFl~#UTjX$h`?k#BlGDtTK)@^N!mF6 z4s?}fYLOS84OU3OR*0c{($lxh()%IG<&Fc#eFx9Iz2Ll_y_dOt{hFtwA;o8mBwwV$ z-!=KC#3a^)vWR7Qrx&>XffP!6T)f^GExNnOW<`j--|6UZEC;Z1hkZ@buF&c7;YxZ2 zhMA+nJ+F?EJbm+q+-fQoZ@+cw2gf(Qmuf8ipm%co9-3L(71$JfQzR-!oGMlDVPHQ0 z`9|(7VVs_7Ek>X%nKww2<{1MZ{RcO0?SKF%1kjIVXSe&V*t;EORGwa6N;Yb{iCn{w z5T&j=={|qHJsPY|NV)QAarvQ#Ej*e}ApA2;Myh`zGzqL?6;Vba|J0Y=^(68>`+{HA=j#-o#YZoH0(sINdWJ z&&zWi&HB>mc24w?{EhtS%82J(|`ILMGZzA-Bb;-*mC_Wv2pM08RFN& z(Ae67B^KX9LLOw(kd}jTVY9*vXXT;zy_44SB!)C3dZS|2o*VYdvzQ{vW}F+lA`IOY z18Q@uDm^n*bt8PrC7AolozwnYshmTs`VuV>oUy7;NX|43vcj4F;-!(1^>{-6y7@Z1 z#w|ou3S>peo3DMUAWjDH>mu+CDSmaZ3nUT^Y!jNirj^yU4{ z8F5VSan&~4cHZ9Qc$WO+{Isgm*w-y!P*^?T-ylYiJKV>EJdt=#FlO zMm9Z7IIj#~7N<$p#l8d&T6enr<+0g3uK;e(Z(Az_OMxpDkm#B|(u`%ev9Dms;!Qc=$2 zS;SgB>+H#9ROpevzbNik9R48rYTm#aF0CL9IV@(vwS!JnN`tOX`<3qr#e`o9)&cJNUV-xpLtRTh$4rBzdurD(u2lH%jev4&_L`)YC5nnU; zKDWnxjXxHxs)YN2akf!6EPq=Pr~6!aCS)?7gX?bbp1wxkm6_e`>SaM6&0?^re*Bz& zuw%4%I)xsWDP`2wSmOY@LbTs`Lx*k7ti$*T1F|MFFlbJTPb>Tl)ji^{7&E{qm37AP zkpwVTu6Dk$_c}VQ=8k$=$Qf4t=;5OO#swzX*;M_ra{j*DtWEmdgdJx4Uz8TdDmsDo z*qt*QJihpj|BT}uf0trk)*(P*_=E{xRJm1eE9eE+Y9wKu5Mdpi%$bl;Z{ zygkvTi6x}}p!cA*aLL*eOX1xA?Uystb2X65dBV>9;jqpOg#s=au4fc?z_Mf$a6mB+ z$)vt7c9f|Zk*3L4O#Uw zM`JZyIUicQmRG(Q(BMV=tNpxFHn%i#QM}wikX_sy>Hi2=-1y4L%3naZx9TDaPMG~) zhHyuFo?L#revGORb9eM2;c~T3`T2p|-5B+yh!1RS2{{RX1bkk33kw&JU0N~xVT7qjK!BbR$Yb~_1mLzEDBu_1`a%{P5p}F+-K`0u zrc%m;H;a_b%De3h-)AF;eOG-!Yp9w4xgMSuFuGo{6$nE?3mAuMqZF#d62>4*Q02Cr z#%Ywp8P$M9_pjsOQrd;(wGj2u`lDxPqZ-~bo}+bmDktuz$H#}yO+$?yvet9viS517 z*3$GhDwYPWz}+S3j~-u(vhDOxfuW~CLm?1AX3?quaZZ2&K2)V2xc40Z9Y~Ef|Bqfu z*e@43Br9;5mhHDy2e%ZuN^18NDIkv3W?%D%|M(*<)zEHX1p8|JXY1vnTa6}LUuZmG zjl!_;CSE|v>aku~Ty@-Rj;%JNdBSh|M%%n#%my=~r7;bAA%f=1_v2w$fJ1oOp>e$9-PWjwys9kq(Qblt(%!v> zh!K1N24H+_=!)jYdE5aqdQyp!L``!HL)tjUL>GpaP1dPPfy?Tt3 z%RU+SPMjGq6;ceN-zIR*r+wA6ea4IC8$XZoEO1@%JOT+>Xeh5KJSj7X`xW7>wUqPn zJ$N%6N9e@SKa!fc(W4}?M21!dWkYfs_%^9qe1B;!TKK_QZ~nm}1CKzBVX8X2 z6yiH$JvZ;Evv|4f8k~nJTW`*Ges2EvpD!2|tEEO&yEHtdhGFl6k^#S(`mwF3*B%Dv z(;)y<>^%IPzlL;!#MzaWIgFU(V;;O0Cl2$QPv9oSO{G&=pFQ|e<}3s(*6s&ZpZA@x z^=D8V^iOBb+c85>|9%h&dxh~{_B`%oYD(3h;Zz)ri5m@hyhBc%)txSi%A=8i&j`6)MNbUv`iAt^hXYtlsW zBLN5GIO@>4E6{$SR1Eh^d3l=&cBGGswXX|4m)uLK6?z_*pA5y`o}4P93X;(Waq-9q z6RcTU=}V0NWgdJUzm$E3Zib?NVZ#{so3C?W5MDjhdd*~~BvlcDYApuuF}|nW{!jQm zPVN2`e!cNt%U9$|!SuvbaYCRTHRoNWelN0|G~vw0IftV?oLWoJLAGXd@w#%UuXZ6c zRA?m*i;NxN#|@^KXiN=7VU{rEOLJD=~d0?O!jHS`IAzsa}* zM#2&2SE{LH-C%@HV%4SoCEgrAyO>tp{e6yJe{F0ZEApKfkN^$9=eSPU78n%GSq@KC zguiUg;LtWKwa~E84QJDIa~dP+G_yt683n#a(T4m%A^^C)MX@V*LD^L?sFsmNI%ygSdfLsWr9Zag?c z0cm^lC;zN~Y%^ef+vOTfYy%2xJn0aRP9{uSaYp)hVS&kyra2r0&P#BrtOHB){CAee?Og@pf1e+{eh4o1X<}M2^+BRtW0DAwgP1vD}eJ06PxK* zKy*baed47dlZ~0HfNR({`pBz2+DEhj`TG@Vsh7`jGV5kN2Xw7cAeNEET|IhbF4=}d83R_?9bcG9=*i_O2|)V4 zC5EJ`q?#sh9AK&W{B|HT^^Xpd#_Zw5Z!pd`K)aeT*fsowSApauYG3u!B#yeh z(0ve`vhSrFmYdZ3TvQ~uvgu)fpwnu?1J(c{k0cs%sJHSbo_YeBeA7N+OamkNRUzhT zUbR1_76;uFVjEvi5vJtxX+SUr#bne-7{&|5R%8<2rL_LT0!8Q2)LdRQS!^DN`s+n> z^i=^Th`wY?LpRP6`g=DUgg}~!MpqavH#G_)y45p-}U!ger2_){IRiv^RZkhnK_Zj9XMt#em-HzQW7Jo2Ep zJo>_s#t@H8OiyR@;cKAvQmKw3353Xs-1>#+1~CnqUD97scF0ZWCNp%3do%_4e)Nqd zgqEk_H=Ce}$gAO6Kv`}~Z5(8oB;^G!d4_Pb@k`u&{%=ea-*3ruxhJOsRPg@K&$A(wUCu_*d;i}wKlENLZ21tGIvyJE@&ZN`7xuX`POOLo!ftKid_hHt zyb&g20tl@6lXN>}2Z3F8xYZ7M$EC7?r6{OfSY3$t{EwP`5YX-%$6S@@LyroN^OFMj zEk=+s?E4&)QRf#hl3blaZACZ$)ZgB+u`2aT`2;jP6b(wC@nWV_B?}2Rt(NJqJ`58z zo?5)_+de5ic=|&|O5R^kMOTp)prdUA+)E zxxqlPoZtL=`{CT(U+01;$N>nTdk+B@Fafd@qHV;g*lh$E?FQS~)UH%$7k&|mnrPB5 zR3skVk>Q@IohiO@pX~}$SetjEPjyd6`uW-~$F;wUJ;blUj5ZBiDKoXuCRd)#x3%Nt zd{_OBa?Xebe0GzA)d^h4ik$2gQNJriojU%#hm4FW-)i{ysoVyirh=GZN zVRO0Xhpa(N{y73nS#3_E9XEb`v_-@_!$ zQ#Eur&?$`$aR9ui;(^~`s*>Q(HgC}-n2!CQdT9R4Mkr3pCsHk@FyF)%X?&*@udUGi zJdA~swj7vlS@Le?L}%*@Bg|wQNZ14p%Rl$oDAv!R=gD}}$l!q4%ltWhQa{0!Z9}OX zDkO$Y{~wKlSm7rH5jhbl2>=w!Yuqf@p1xPFl<%5Nf(Jm}$3C85SI~RwXsThS{Yp97 z{;H*6a)0V$c=G}-y|p3&XuH0bUOj5$@b9JnqcOr)_?b9tDGxRp-Jk8P!N;bRLm$vJ zoA0lGc<5kM?pii3&F3Km>yp%6YiE3hGbW~1Nd=LWS*PLWy;pNy%Fb1B;n{X)9rO;( z0j>v+`By}ubh$i`S2SLP&J>YRv7pfl?Je7|7@ChQne`0=@jQMWn_*lWC^fC!$ z+9!=YJm5I<=d2wbiNyDO1aF1QO5#Ywa*4j`riUBK^mZ@ZV>C;~VG!$v?r!$!PcI`` z$iC%Qqi$uv!@3RI5(KX)$<}BKbISz|JMm`)N4s<@`3X|h1P}ORBtX<22+C<19arRm z6MdAhi=8k7L#S9y$u8*M(*)Fg+O?&p%vl_$FRNV zD}2@HMQy$sd@r1!Mwu+0&s)hjk&CslV$$r0Fo552BOx8#js!s;GojgfzKM>nUgF6x zy-7^fpBpx&scb}A2QwTKz8|zC&CB|;-F-$wP7sZY@?0zlFCEfq^XpN*1&q*O^Q?o` zrtGP@0j@c~2MnT7@^hLqQ(YMyvD)fg#fW?)65RO@3HSiS0yt0ZJ;^LIPRF z?&REV0AfNgKGAm9Wh0ibxEufMQt`0;9;GIVJM}dEI*{&={6=+tSF)Ut zpy0;og@NosY0;LC1f+UWvBFnReg=ScP+8`N>f(|vAGSmLH1+#M?vBNBpm3IYvfc;# z@Gl>_XeFTR!^#`qx(V~&W8+-u+IodS$BmzyLDbte4+0|D_4dy38?MnMLrjRVoWd9h z0f|y>@f9l)pl;5vJ#g>EK*n=>whI!4iGmz`p@N1WLS)cEqcDJrQG;`FB*(?xGd4cw+Y`xuwAgo=_h3x5flp0=(gtawlvGjLLL<`)WhT zGa3hzY*dX?LZZWkY2^dUJg@YFED?K-RlwXBEE3F+TD_Z}#m-&Lo^f)$ttt-)+Qo!0}SVI;227$I#`zpkl zf!imU1xXlVd$MnI#cB?fYY`1QAhsFau3wP#AK4@VFMiXmpBOtJuZ+CBh{%~9tJWAO zEn=w11%K}yxOnd1Q878QH~l^9;SYZG@OT4>(T4z8(qDE03Q;~Zz(|-So>=9i!Ic7# zRiNT{`3@6i-s!({V3l(N#tm;Df-j}Z?+vt>{jCdIf%{_|FIlX>8dWaTHkQH&M25J_2itl-%XOp<+f4oezR3;F!oz~NB;1l zNmeMpfGE^kNOf?5(0EP7ayg&9brJ~B3xWo*2!cIyvpd-8o&3BcHi$8B#Vjd?En<($ z;c4-cFfKEJOX*bCBSSr{=oAbU8pG)kQr&4+V1lAxqOV$PB2fb2CG47~?6fm%H4*psXJI+m&V zyTvCTkzf7cCAdcd3sJ*}nk?DBRbszPoG~hU@0&Yq?YsL4?+Gc@0~m1wjiZfpxm2iO zaD0&IS*?5ij&)gqUK9XgJ)!v1(%x}M&@Fntxr{WE@cqa;Id@|r?u;PaCD=XBKKw5u zjarBdnqb5mnx}2e`$J!Tn{-4;=kevIZ15#F6d+4{om;4Tcu?qBz14~pUt<$tN8ySX zuomvlCw)48#+kDWT;u`xudm2KuBNFt8{!a9lL@ zg<70QEbZ^^lsioRx;Y>kJDHH`mZ&^wmwmc(>UO4(E<<((s(&>9v=HQEi(f9S)7ZwcM60vtG}0`DEh6kHd|~yJS^;L&xlwg(-IBEGE-Yg+ZgP?8@+xD zMWIO0{0!T2LZJ-+edT8q;Y}GN?sE?J_f!Acx_0gPKQn95^g>Pi$}2;Rz2t-*IPtBL z#CZgqf`MqP@A7e7)F7oNd-uYsh)q)Cd^%vL*7x6@(!By|7w@_8J1OXtIN|sS%E!9V zXZ1aJuO({#mGZaV>yc)WhtSg&vU~yw5`fw8o#b5}UeP-&3roF-@JQ>r{IHB2rtd&< zF}~FT)YZmWxm5D?)7#@@!?OK!>D*EJOksNrwKCaN+#ubF7LEJ`urNB!lvRiO;nc$a zE#95kLA(_tPLWQom%X(*{$+tCm20!QW>&tJz&@{5eAbrxb?-=eTxh#H>3L22P3TpC z2O8$?W##B`;&JUK#PQit0|QIFGKC8U1jHs>#>xga)EuEe0l66In6R==Vc+_-eSC() zS>D>BPuvhfg2d@4;YubQPFg9P6wV6bEu6?E(2D0&DHuJ{2-j~A$P6}O#wx42^bctA zIj&dps!p>z+bAZwY0oiYI^VR?3HavGkmsWHy&u|W5f$5fr@kxu7pS8}A*2QabQkRZdXq@=h;ADic7&Kvt>=Cz-18=1BZ zr97}%s%T;CqQZ5~hv4eraY+;x2v0!ci_tZ0Dqbhk``^C;HTuQwnxXo1QBd^g9Hc+Y z80f#@++$=E)j5Q!JXde#Es433bWV68Q%40cx*CgRK}7#cgdJb~Kf*?(~vL0Y|KUZ-UmcWP(Z!_{xS z>`Jh}!4N2yflM3oiNj8QIwY#Ft|ZbQc(2|Jeohw9yb%JKyN(98_{?A1zg1|Jke2el z4_zDSp+5^*;#12fCQ~I?+?19n$8U{k=_B;~ViKbPfEq!hPvXP)mn-LWPx^GP0~fJs zwkpwry(QLV z=GGjZ?PH7VhosekKa^V0TK};oynckzt)^M>GkKwhKZE>saXmN{;UR$0K;HS{-}~SW zAL#{&j9=9%9)oDb)3ZJh6A#Ht6}~9 zjsOLiUb2xUse_m*tf7X9bL$)*4F+MkKv3xcK~iVUeS+T8yZk`=dEQnVk*Q^4E(3Cc z>g-hqjq|F^R_1%NV0juR29Rl7(Cq1(%?RmSOOYs;6Md420mw!?-N{=v*vNYE#R=Td zhyr9$`v}1Cyj@KN7}VgzgjlyYCun)fANGCpX($~`0D6n8@E|kFy1*OW;E9igSp3I% z0{k(2@0oYK{I55q3+ck+)`_tgt;Z9=(}e>hO7IwGVMFCRfyGt;Y}ETUmaF~IJJo>0 zi+QepeA^H;KV!Mhv~^j7ktsmsGlhraV>!;$&~t>0^zFq4It{d8{-{xWiYKc5(cOb! zIq?ogi)fP2W|WVCU+Mq%D2WzJ<|oHWLf5TUbRqPQaqycZqYjZ<>7M3S&-b*E+Hs_!NBR3&pRet$N8QpF#2uw_feOJZUup<9H4U>p3H!ZrrV=bs|v zp`(LX=2Aw+W=Dw(xAddGc+O=?;c{OVxnq5=xx`4Q0>vq9YpB)|Bg4ZuZsRFbuIL%O z=pB6n9Rp?B8C^3Qo%>_Zqy@U(ek+3{{L&aZYsOPWo_`dF3w+Jgg?|pyi#e;d!E<6@ zPJoDKvy4Hl?O2Zlw(SQ7e2jDlg^D-=fUchvcYmU!I=&gQMe{xl?PUr0=GD%k3JB0$ z{TwhJU(yU^@KS)Sf`Lk?^A1AW%&nTeqMr8v8FFoUGKlgHwpuxgr}ujKcxB*k{ue@{pG^6@ch^OmZeeIj-dN*}<272W-! z9r+A1oc&P1{yiD_P`e=V54&AGdAKgpVOwrC-}5jI`jt{YvKk5?i6`SkS~j-ha2!h? zMZNK_O-_K^QY5axqYAv)PzkX@}{Y2tNwwA_eX!Cq${atVu zIUBCRK&&?!GF4@tc<4dsqUB|%e{={DgOR)Nj#r4aR|Di~kX3;$VF0JmBN7bJ-6cBk zs>ANoo)m9@`jVO1O>S|VwFiPe*>SrKo)P-8S2l!c8ylY}o0xK9##|%{p++}ifQWW% z%r1Bn0A2j>pB%IjYJw`HUi8e@px>%0+l2TP_afGZjj08HqW*yhMih{IwmrAMtIK%e zRV0GB)BCv{X<;$Jj|Mq=NMDEkfqpQ2WGzk;tX&LmnLP=>!!AfH>^UPxYH(u;^|T3@!H4yDIkV3_v(dTTeGp zv^R3O#BDy6JMA|w9qA%Zg9K>THrZ7VEz1g>h#1h23lT+cJ!pLX;T8g)Zr%Nm@%AHL zO8Z}peI}k99&@xKj+l+hx%A%uLs-&`EhDhuc|Y@WJ%1l|Qa>~lTE*6Ox|~P>@2(zj zXX)21qM-I0ivad|+sh`Y0Rm%7|Ct)C1`2BE&aZI&&4;7k$m(fjaUYSBmLyis(89)* z>?yw!*(2rI`>PX5rhwlV9#|1Wi1^=8t(GW?JBSGjxlm?DRhPO;j}QtI6XgH&tx&)A zr~S~kM**ms6P1&d;h2AIfh2GnA~SlxolfxntxQ5Y zXqS|^+EGBW)tol`MU6=2Yl6)NNTMMkOh0??<=}E<2{Wlyi&N1V7ju78Rf>5j@6f+e zc+v@WlD!^rfZ5*?qa}MV8ENmy3w!u$J|q5}WbfRo@UYxn%c0|_eB&mH22VV{lnc0* zA60%UL&MB~WE1nSH;-giL26`V=&JK+of-`2;=CW9K23tPIldT|=h9YjU@z7L`8JlKKp@S3QIS$UCv{_3M4rH~ z`bizT5Z?_cA3m7}=IXW~g3J73=R&Eps&F!^-~*A-M5hLKn1laLAr@SeG~b5_1eePa zpxGjHPsQK-xroSqybv(F3d!F-HspQ9*7l!UJas(ZA9`At>uurwrby*R!5+JMfe+5D zXQj?#;w>npHPbYRAK+Wy+zD#g@lRFM_1{OjlvOa@J00X=P@)0Q-A$ON5u)k?ui@Con|En@U9ZhKtTu)6cjc0c-|ev{s~Egs%g=FlKsv_aNc zytC#j^xz|W{76D2R(tvg6_ID^>&2lKIl*^a_7H~9&DwNXB+Y1SQdd=jFgTdmV!Cm$ z5~$J9Yq=KHZdCJN7dY$*_#WUVzhc$jinJ@w2K+fUZ(RKwpXGRg&m^ynVuW|BVXp}j z_|ZSIy2IaNT$v3$EFDKa{;A^WR0K|+eh5woWC+L+wxp>Tkf2B+1%6YGnuLz5P_0lTSoGyo^9;OYaNj&;3yr3=8g+0s%@Xe* zSn|}}#>!@L_BiWOqx`B3Mny4vRAfK3Az1#UX`YwKXB-|#xOH#lj`BfFX8OXY=Uk5{ zMd7~WqEnQ>6L015rg3}p(CX_xAl5m$?C^Tdiwxt!|Nbja+Wexj`xBn%c|igVXHc4+ zDW`Z@K>7xrG1$fx77-iTvcxLNzX*<30~20WeF%dU5(I|L5zA2ouZP_5kVs@WKdxE1z@3q#}g51n7ogHkSO6VvqB@ z8*y+N6>G_o1Acj5t(@uH|2!FvW?HfPncnI<>#l`fYH=RVr-I&Lw0sge+8Mkfx(8Er z-!lHYY6btpjTPA^Gl#h5ZMDsuEAgj)v$_iOCmyWsL>eLRxtwgA9y;uyruVc8#uhz;6 zA%YhOVr_jfT8XX&EsXYK><6B+|449WTk z3}}l&4G`LVlqw=j?;dWM1$7BAtcV`8_+FziTG_oM7d#2fvbS7Qe(6);VKmTeY zaw=mM!OiZjOj}wgR=+PB^X^UKoOhp{P-lShg+X0L)kIW+PMq|)n6i<6EkOG&j^;y> zemJ)1-oa_{{HX{v+a3IGlgJp9EF4#Begy!`y3LX38{OD}Qnde&y0`Clm_;4D5df8w zG}S6BrSx}9d9cdmI#m*}qBtZ_vxnqBikm~l(FaAo^W2XU^<5$~U2343Gt{Cxi>}}C*3?a}7&IW}DkV%%H7(n7a5gjfmNB!49WXXR!DW`dL64vr2@xHCcz1(wV|DQsvD3ec z(9T!5<)kGiwk4NT_UBC4o*qQvV{s!{Q4zXzKbVLkkj0-*u1*cvG1pKVpDr9+L`Mr? zMh!p=f1t&}w7O+0GeH&@6iPQ-h8dFh@S^DqsFZQ(m2%rpVCkS^JO%oxbI zVDe^BR$`quT2ci1n6~4tFQc6$zJtyxMvd2YX#$!hKDahNsoM24T)g|1IGWX*UYq3b zbtK|*A%-BpMi#4OZ);m&A4Igw(sN7bp|WcjkBI<~x%H@1@r1#tqG6i!=Kk-0#R2#d zzUxb{t(*k75pnvJ;#yIe%BBr?;S?7fim5 zl(g;)r8{t=yZ-1vmf8Z4UQKT4InUqXj-5!zO`qbERj9G%*mMW5Jf-k+LRRp7A&J$^ zfBEo#@}QzG!4CUv0|3qqs%1m*SgK@k<{zke%)mNjg8ubUm&~E9qK?YI`7U9~*z$kD znVPw_j70v_cZ&C$(#9ge>1y7HwyA6G@2#j0@~qcq>zudPMtnw_FpY2Un~;F!4(=<& zbZ8ChlM*p*>Db?*%Kwb?)qSve_IocGE7c0{c03e25ZYiJNo04MnH)@l6Oy+vi(FK* zYstYvi~x(g8vq+}!zJbcs|%md9Lt%F6&HtvwVzt-%v2=~iJ z>t?-*{%bCc90UY!(FJo2q$?-p8AAQ1h%UPeeE-3|;HuWo-5 z`{kvPlyj{xA7UOekjBqF11WR(ByE z&nKvJ{*7>Y8vXZ6tlTa;yfvrWR4smNdJ+|5CQ5N9GUji0up5i$U$qnlsx2lHmrEF+ z)l2ZyDpn_yYa~Y$_!E@P%%12ugfE%o56!fRsM_+f1~Nf`P)7&E#r%@kRKKRaQql8i zKwR7z>Wr~U0hZ_fD|6bEv>)$F%pqVVC>u{(D1eIZ4~~GQ3!d2`iAHZCmagD9I#qzi zN3u>W<1#pgBs_K3J@m^NGB63B^)fQnJwu6HB=g@tbD4ozC(#M1) zfL3{BK_dL){X=X^hIV4oSo1%LaFC(D2ip&*)Fb#M9}7DY9*U?5(nG-EKFF7c4U9-HmU z502sk2BD8QYOnpnv&2Qr5B6c|;$67kVX{Z)#8(N%3db5ZaaA4ryul(D#1VQmUwMnZHf9l!9p@eP-w?G$(U7!m@5wH_ZJzr00`1 z){m1|Mu9l}uxil{Ar|n+C}_uVJ+M^H)Dr!oGB2;tgxXke6%(yzpG~YfaU9-$EmBm5 zdH{v3zb$)}Hgp1Qw;PPp_seDBbLWHLoi-`Zas|cB{*kHx8+??$?MK|Ho6Svb1VUy# z@yQ5^&6r+LE#TH#2Om`vP6mQDfKl2v)Sx zoUK-t4I_lb7rl@S74MbO+|h=LsvHT+N=45rxKViqX35bv9FELZRgG6Hq%Pc!M@Uk- zg@b~$%fb#&#wu&Z8}mIX;q+}g+IVx{Yj+yNUT@r)7V)&N{rZT0cZIBRxA!7?GrxD) zbigBB8O_frIto|+{;Q;hJu}ys0*o-8w@L6RpD{vrQD}_wOY_~4P$(*;TkxZ~=4?Qs zl1T+OK9%+M4{$uqb-f9k*bC}^A8uk` zvV^+&B8*zi?pH};`dCIJzzkuCBUw3qqoxx{PXZ=ZcFQf2mn^2%tgZ0Ve}#i_q+L)M z|KYrw1_+?}n%!=CM(?k#zx(v67!5zZyZ$#?+0i;{$697G-efnHWtD+NS??GN;{|&{ zn9`p8DL4Gf(vLsOOdEq70NLphhnG5|k)? zU>e^x1OkkdVBY{>rQJ(z9jeM$+oZtPx|a(akIvj)Nl_4`+9D>C0{~6e5n$N&?*{-cC?Jv{nhg2*Wuy8AQTs;G%*45|4wYt_9HZ*9>95*T zac7i1esDpZ9u-3Ph=F9<9^3_g15qdhvB;?{kw5GX=H@JsC9TL2BSq!tp&!A(Na z0(2c_%B8@-ZvMihvSfLfsaI4{U0k6{JuV1FG^If}-{ zFz*4U&z2Eez~KAzCW!?`DaUMCOng@?K}NI<4#7rT?6 zxBHLqR-pldhY%q159gxerBFSf-&1ZHYPo1@7F~KW z?H@Ol4%r0qzL946ek?GHNz7xIAvPK$lgcVbT$~h9lLXR&Gih~i=!E|Ry+A_0XVWdQ zf`w-^`8N9L7Dn+6Rc=q_QGFu9uj|=H!N;3}S;fz!Kj9I>SDcw-PXI^_3=BGr;X#oT zY&3?`OcSMqJ)?mRMwVj26Z05&=xz5bU-*N(x%R)`@+i>2alk0RK3jAXOLxUs&GJ#H zUhMoBg*XB7sbeb)KgbjFhLQ2UFdqPCVz!(9ppRC-yq+Nd{Pl5&mfi7p7XYxt(e%S46@YIUpeZeIWqAI53W#9jE(Pn$750jm#~ldlvW(Mk&u-`6v~#Q3{uVOYUM^KLR>=#4sr%Zx8Z7`2S|8Aq18TScV+1tIHuDFA~c2PGhr z3iWxN3ov=&EV`Q~0IwpC$pZmt0KhJeU8p#piC{DdV5CNcu4KH707~fL``-ZBKlsb{ z9`NvH&ZC?3^cH{WmTxxw_FLI6TT);p!IdsBZF_5Xp;pa^`627e_QB!{>jId)@7wg; zfNT<%1p!$u%VBA*zVr00dy^uD@_ zS6T7n;}(r>(wnJ2_(`Wg0{{T7RfGUEDLr}bCMo@i4W)>J?;cCKcRW2T4ejiW-&$|2 z|4Y#ugNLkoCG^VWQ0I&2UDipf-A(3{!-0$t;%{xLjl}wmFbZ8H76d3UY@-iJV1f_M zt2dmH9d^JO0`t%?Xb??=YVt(HvhlYblWWD9=sR_e3b>ezPj&*+TP0Le=i?{{~yih*qw0`W4kG|vK54`%$B2VpKGyN2J#f^ULm$%;faWs2+ z5A~9qQp@!eFBo`$C7`k|f`hPip%L%}V;{b>G8T8|B7(Ow{P_C0YNG7*tzy&KUt z2J=Z7hQw$|GYF(QJd6XV5U8My8ReD1O{(n0>QVZzaT$N`+v7LaE8g+<9KFXcrhfnD~rRxy@MZ@`|n(WpiC32*59^?bbCz zm8VXUcQ#(P>iM-=<%+8B9l#PZRojfgYqT-=gR46cx(?Z%f6Owa;DfK&)RW&;;YLB( zfw-zY5N{0b>zO<3guH+yXdR47?|zbxEFXGnafxdPn)Aaj2i9*$lU#MDzHmwsOk zG>DuicZ&=u%5{0S2S9;gF9K{aP&7=yw!s7eJWD`$L-GQYe(|y`(79Q2{bTPvYS}lZ zd+q!0+juFk{d@j(}hC1-$x3#O$L zlOSLmzns0(JZGDEi=1|25Wh3X+=Lh;mq09AmQ86Le5R0#nIpYqNtRreh+qjtSdwcr z4+suIKe|^^%H4wD<^$PcF8n-o+)1A- z0FcR#5#G&vqW}N_!X%4=0JSZUwuPT-Q2qn~b^J}yE#5M7jeT~T6*K?_FguR9XZiEK zI`ymEf5WCif#H+Bvm=_LD6*nmA~U9lPXE5C8_j9`;=IBr@iSjH0B^zAl@n-2yi% zV3Vw(Xegox05GD=fFb_Gv*)S&B@Iv%KLDK8iX*X-;TaJ6sYb;=f6ZAhK4)^M(0|HQ zP+;jNe||yJ_uonTo~H;hD8`aN0eGf+pjO{7M5b16&Th>e=9B?|)Hf%ClHj)l`u1M= zrM2}V540B$00^zL2vFt%OhnheG$u!{009BW4WJPc1t#Ltq)`JeBoe$nUw?M}`&X~r zb8Rlc`WI{w6qvQ*+q)~^Hrcscc(HnYzI0CvAdNt6%5v$UD2Ui*ybvyz_6@s$We zkk=};qsA|N<2RJ0R;_ZkdT@sen`7%%w#L@WbS2r(#LhI{p%uyj2;g@dpadn=9nFs% zYQwAfm6-zL)7BF}qSA(C0vl~suUbQofUR+o;3B7no&j)TOE`e{@~zSZOxZp0Q%sPB zEQO5%Udr9kO9-GB(kIQu z%8vN+LUE`9**N!&lu?Lm&4a~T1tz4 zBu9+@!=YCNYH6DjzItJ+IeJ=i-E%m_bW8vMRE$`f{CAj%Yw`l9;Nhm1QvpF7y6WYR zQPt{>HoR#{a6A*&7bPX5=5sY1Fo;G$bI~=hitd4UyC^WU5n{(8X_P`FpZ3WE0r@Tw z`{X>!Drp1-sc&yhNDM3j01~sq4Knp<8R~A;ybTG%NMi*7J3i^|js4pr?|a!_6x%BO ztEQU*hh5`W|L=jD-;I_0B=-ZI{{rwNhRx%msl3!HXL&Ji--mNZ-=o>j=!G99PPsgO z5UZY^MzLfV4$y=w1=%Vqm?~S5hCw_{Z~#$EX+rK)*@MBzDr6=hH>r8iUB@mxZQ`Tu zKVfsAz~G9j4{Eyu*R?D4t?4P!P%9O4JntrNwpRJ&UDx@2SpYyaYCH7sNogEw(}{VF z$`1g5%OU_^)(PLd5PWf(59L3$_9@iqkAlIFbhKBBt0q>i0szUt z#qW$x>Iesrn)Y}Fn@LHfH44V8&)OPY1JOEo_Euoxx>N?hucz7(9U{eJc)VodjD%)d-xswUIFEp zayqYG@UfqK6ioeItY1SQGQ&CI0aMRFxI1;d^%HF-rJ3=`AG=qnIP+$edqLgO zqQJb~Fh*=dEJ><~aaxip;W)B^x(`I~h4;MJ<%1tkaaA?m-Nu0|sncmUoI zdH{x3TzesS>9h*^%sXSxInDLYIDT`zcmYryAZ{}arm3~h#Ipc<7=3K5|LA&K5D@*H zJj(E!B_Qu*4!{6B0CRU);54?H<1`T-@E`!?QsW6w{Gnb4Y49OZP~+fIMIeJLlDN^m zE3NA>t?oE}M^eplk-eVxe2aDB&l04kWH*Yy{9tAs1s3uQrjqmj0I&R~{JY|R&8hFS z;@9t*x4y_&``1iA1s0$CpYMYJTIKuo0iTrslHyJmHUeY|FRge!*8yR#4a0nBBPY(gp0QsrbE2rOm z#DdRnz)|;Ky^&C0_|)rO+iJTv_&BhOyk>Jq;_y%bbhhyqh0sY?24<^#S>BKg_dG#x zf<8+@`7Ijj003ST0L(b$I~TTE?bGP;uknPk(X~!%-7}8c8pE09O^G^dVxL+hio)Y> z4Z8u@;n+!bDz)&wpmU(O4P0jo+Oa-kma`2&z>ICTb=akYiBQ^Fh;)KmMl>}!T%IbR zL{*`61zHb5xm{%efE`_0+&(QvY2OwNIiytuWG#0x0LZq;M8C%_5da_-k{%$V)S+8z z{J(yA)}OtiZ}pVhAJcjD(vSY+jVK8GIM#2OY5_>}8j3v>4dJ&K(`F-h*`TlZBP zhR7JRo@5psaykIedxRZ>Daze=hEe01{D)Hm*8_c328W#O<}Yw&Zo9oRhCTsJ{9ytQ zv)t*elO6+{IAZE_b-Tu_wn;@%W!O~%Y+~baTE`W8nx&p*`KJk`_#y-cm~hz=P+A-S z*z*;#_C^u_AgygTInqkbp3&4x)SB1sedyf>?9mr`B{^;yFW=+i|M>y{;wu2X_w%r! zk(dO2(a;z`9QcNff%to#w5c&l;oAz!1(Eh9z)!8*Bx9hAGVgWTQvw2vWuHAJ1w7## z0Rk98snwksIGwbHa|BuhN=Qg*!L>5naKCuRTbHirb)NnEHV+CA0JQze4YZv^&qNeS zs7H#a>9|U^cO|K639%bMT8fg?Wu{|c+I?L-=(@kb#y@)W(l`7^FqW-Oy!vb?*$*@; z?qCxK%+!FS>mCvyMxS-Obx$#gOazW(mdi_}Q-J(Y%cR&RbhBF&rPhfmRaz*tbgD?b zz%v^SXWO0UJHy-UgtG*Oc;bgBFn&b zm?WXXM{lSJZO{*mCDM|vss|EYATKN~RI(Yn}XYKdfVyoA`YPu<~ z@Z6hr_xB{VVBuL6oA5yojWyK zp-1x)%22Azz|x+ZER=)s+N5LBq}Ff-M`k*W5uEkTz6&Dk-5-q)48Qe(!*_hV%*gxK zZeA1+4}j;~pz6e$x6HA@9+eRD6R%c1Vf>;)?hOIJ zNmm~{TB&~(mc}kN)rgKVWXTEuKxUv*X^u%Ia%ku4?Rhcn=p>|xhkypT6MsSgK>E6{ z^jnPgBWt&bxm5>;o!L9=;>-XDa2q&3KpKAVX4pK`X3W%-l0~}n>#8zVeGFwR6>{F)vDO~$o6rNG!GhnBL&Qvg6F z0W8ocO{IeSx#PLTtgzq~QSxflNm^GGC4wV3LjWM4h7(G`BWwM(|BkzlS$JjX;rDOY zY$!16lz)0%v)%r_XeP1OO#Y0`Y%eiW%X?|JOkDZ%$#DQ+$^unPh=)A>LB{LVHMf4s z)0e#d$>7_aPP%^hk8b-Wz~O!Lj5)QoU9^|2d*e>)xn~?_{j(^e85b9_pds-BXneWo zM*)B;aK`_G_$0?Fk_rTeaMM<(Jo*zB3=R(38eIct@3gZs4q(udMmH+laIUc#3%i0b z>B$~YR2%?s?4^Wb!eonh0E*J6*me0tm+WYep#@My&{bs*0nk{t3|0Yd7hihMH}Cq@ z`~Ga7emI~Q&k5vcO3TSM+@oUvwkQG9JXS*v2u81CtV}`n9J66DwVmUJ}f~ z=YlW2Kh3O-FSzr)fAQSpjIaNcsi45TkNougZq5CBzdcst>3|iu{Ut1bwX}UZv^_N3 z+u#G~D%hcx%Z;kko>pmD?gi6ywa5~TjeSMB}tGaf_!O9 zdKKtcwfi0Jv1hI4Q9km$%C3k2OOs^@Yb2IWF}#sHqMqbt=S>~L+Qd9n>2pQt8KD(O zuM7L4u_l`CW9Eqy0HEn*#r;{sagTcF{RiA%f^7Xur>x#Uuf6Zn@fy1t8)aO($u2rfh1OPycOS`e-ycFubkP7-c z)j|b?x_PAD#s4Me8Cd<6Gy>|tAVD#z&$JVd{Kk5~_!DHpMQbll0009gUw;cM>HS#p zN2RM`g-Sz$?NF}p1~k_>ZBz#M=oP>?vJQ-%d;Xh9N%U}F2y__Xrd%&1OQ)Yv+x{xy zI)IRzgHDeFtQvrTp{?g4BrxA`Muw3K%^AV=5pMv8Nw>EyfF)LXvxfA|D*z_4ejVjg z0YyXiP+374e{)*NVK#epZ?Nb%G$D*_Wl24TPR!xT_?e*-1uZ7Qg*3Jjw z$IC`z#QyJ5CV25fXT9)a{k(vUS3oZK_)UjmX}>F#Fyhii<1EW*2Kec^7O+G%-f5N^ zSsDPafT+cgiKueJfkRArj_eP0YE-(upx{T0KkFOPrUACB!<1n zDs2@UbT7~}q*8*O6nIgjl#B}sdh#3rBNC-avkj^6xKzJ&{){=}A6~uk z;Qnc88>tjreC~fAhs}QxLUF@#EVP^s$yE=}=|~eq8|joLG_2$tq)1vb005m%cDy#JJ!qGr1P*&-PGgn6?qX*@@n zZ(Qk_03dYVX8{09OYu^db1ft;1Nl3ulRCWB0r*#4&b^)J0pODdPX6xaAWTl@zqJg4 zabwl%(H5loLMWB7XPq`m1Y6_l!tYJ&UHb)ej#reCsim|Yf+z|y1s8IYoshm>8+r&L zV|}v-Ic*(0xYah!oSo-6b+izM`d22lL=~54(#Iw$W@E5;7=RB;x??gHF*?e4dnKWV zte?0;ViQt2^PVmgDA&?I!!j}3B~h&%d!~a_URdx(IoXbyXRki< z#lPPoguo^^$;IdX^pqA(5`@wp(O&op1i1QofRKX0;vaHNnd`$R_jXtDk?~69Y5S%k zem*j;8YxU3=H4f-Xp=0JZB5ciWEMRHgiq@oqy?P&@cUl=fpVkkU%jbPV9r@Toc-L> zqferT1~7mo0E*|^{4ZV3hnBycdlw%>_^(6fO%MR&S^ix;0MOgF*7iU1^cVl;eNirw zaSyHd?tx&3n>3cF?lC!)T&zV^3TiQ`Mq;}jXY3i22tJ8QGSedF@e&FP{*S-q<73Fv79Ov6o!&%OCgUVH4@P;lq~O^+GFJlxp|00huUpA5UdRmpR` z73^u*pm+`d?iDzeJpru?^XJYyzMJE`k|uQ1)V>vX-CSY-fXqvFegK#$8kj?*06D$y0y;VEt3;000me)gx84$3_wu&Oy5BT?#)za;(|7 z0f_Aq+64e@ke?7Gxs}~kgV}_5H4H68sk+rC(b@OiPhD}umsA5pJ}*4!vid#lPGiWb zrzwapS&t7(Uz8;B03blB6b`g9L^$xjO?U#HcD!ewQV<|{1AM5pIE~>N9MseG+T4vJ zLQEcN!U~poIS#t=>J0$*L1*r~1vplCTW38_`6AK>Q%iE790jUYfEv&m*J1l$wpCTJ zrvRb62+JLQ<^_}KJhg4!vnM$DJCE#MO1T0Kn{jvkzDfYQ0Jdg^}nB9@k7A@^~b}*jO>C zd$yF9A*4hv7Eu-eut~rj;?d*5HjNjoDoHCb4|uYJPTiga`*o00m*6oFm2X1s>fz#e=?~{9 zv|Ff}w$OKO?ctHu+Cv|^a`_!bDug4zWGcfa{}VbPimj|xzp1sS@~675NsCd|Nb+YS z=3!(t5XoBy5U}n^^a~&e5VOK0*jRzn`;LeLfS|y_5&|H=!@rpTkZ^x*& zg!5b|f30dTp#wqs#Np>?d|r9TX6*c>o}5!`jhs%h=P-Tu2oXIZN25a8PopeAjVtCNJvJr-0OS~Csf3Tu&yF`d@1qSTK;@8!KJc<1O#SNh z->@MmU;zM~*q#klTMt0W2Fv1)sCz!j2cewq@_z~c*-!M@*(c8$pB6peLB9f!mO$vgsKB03ZNKL_t(*3^{YQ z-N6~zW;-OjqgMcxzf>xS13)@{iDOjaq+;I)l#xV633=$@DU*?y}eRS#5 zGSDM=H3T4C0rbgu0Tn8bPITMo5wQLV$qA5C`-IChf?`jl3oMLMn?l)LN_I^9VS5lt zP=bhzjTYX;oPZjd1P#LrFmt;dok|0)P-b$nX%HeCni^%Yr7>m!2XvPhH!0hMb}vl! zV9N-u!qZN0^%PU(otvu6*i_MLUVt3AjFsiev$LFnJr-cXN$mNzSB9NKesk8rzb-tV z{)N*@fu*0kahF!B@%QlB9mkRnX%{T}-6(hiqS*vW+Xb^8UVf5%7|kCr`99M+^67h7 z5^ux>En~rMwL$s!EdKevM?bXxKTO{U`)`^~3T%DCw_Y+{ssEJa(JAnaP z+-iv+j`wstFzw8_+dEsKeQ+B&0`y==P6J8>dD0>ETU%OzYBMA4J%7A(937^a{_WHy1_2s z`2p(&pILzlfeYF7yNbj%Z3B%4(82>K3Wc{$x(C4YXH#fdciBVqh=pZM8*CB<`76q& z-EMr&h89VBNW*$X!g-ogMsZIQy)#%gTd%ZWUwFqpboR@?u_5WvfA`c-V4JsHedSoS zdR&WHfMPM@|8xh$HiwA9Ns!m^S!6vk^$2<~W*M$iUX|oSarK!BIQ*L-a_VXR!F+C8 zcg0_4cmPiP_QS1uV*wSt?RTR#rT*7e0Z>qArmzYNO`~HwQd$(_&ge5ZT&_7PNfeT7 zCy%fIpol*uN*>Ni6_71wvRRgL*pZYT>LfW?fg1P%>50zBTr>>YaTllE7{+`+1b70} z#ch0`r~%^L9tJ303roNfdn^sml-eW{*iaqHKE+p6bSxBfHe;Mc(Ohq;20oSwf*um> z$v|&__jIjVJK*6DzWlxtLzNpaDYKMq=7oix+p?KD|3RCWV8VNitkl{n^rBSW; zhYb&||L6X>8AVrO3FiC;%{??aADyq)y)R(gA=PY*7FZ z*3gR!KLh{*7MyF>f8lQqw=2@6iHF~I)kj*586T8h*#W9h%Ue~0DqAW7Z4=Dz^Z;S; z8iTPo7`OSH(|qm;$3eG13K=#C5*MTa5@ohT_)fL{Lr;K;tC-U}h$7NQQX|Tcx8qvzqEIm~2Sh}s zt~)8iW1%F=6l+e9$9xcce{ZGMKK_?y|G%4herf;4DW|}^kN@=8y5GLs^IACZhBiNi zgL=G}$D#d1UNTk46Cr1`miT zBFnfoc!v-!pq+>@-4Q ztxiJz8=3&|C}7Eh5}79%0Aj#KKeA_H3=rSrh4>?yI4CbDbXPDG-PZ&Fs-O9{1-l9k z^inhjLFl{c4~?&z`G>C^9h~^u#g}v${^|FXwUu^Lj{=Y}X+@!GcRfy)PnM&6DLDAO zFpELTjQQi5nl}c2$}>1T@DI|)w}!(u*jT~#2q?a=s>}msHt!ES0p<%%Qa^gC61x#H z{Lp4NfEGTK|J;QO9d`&Ipv`Q5j3u*ZAS1{Hywy#N65{E&KR znMzbiPk^pIRle4kGHKGfnfNoaMFs{3{rwjW4_#AA3#pR83YuR&hGEgOP1{dZ0d1qc9U0RZ?uG5|z|s#z<#&KSKNdn~qhijE>* zCYRP8rbC?XbU zp>~AnsHaxAT8Q)uFxF060%r!GJaGKEXGHl+H-Q4~6cRMZvNUdk4rVnJkG43q0Ki~2 zy+Y!68l+(Cvx+dlZ1f5koVgX6ehnaf02K^4O^}IgsD3Q$wn{KYjx%5n49P)hV2 zc|tFgVqHs`xHr?rDm?(Ori}M<9SH)oL5w(X!Z{2JFu8#DFJbd;` zZ!XFZ{p+Tm0*lW5pEuyGmo=NM9hehiKO#I#UXRHHnf}4W-k7vcRq7Pm=X{(NMw$Kw z=J{ETRl*^t>y&3_NFNlF49n!^0sP*>!DDC=067AmN~`%7zxv3l;W_PpHbn~Tx$2t6 z!@qGy*#=k}W2t9MlEk?M%IoFaxPFqgpSG*hZ?0ko{ZvXv+VbD<7Gryv=J{2NJu4cLxs6f};* zgIx3rkg}uPkEvla&kCMv(3l7TlgML*fhP9Zx=qt1&VE8i`N8Xw1f|$35~@-`E=kf60Ff(P#T_hX z28x%EoGXV4(^o8qlhM{fV6o+_eB`6Ax}=x6_wU)T6c|}?-K#vm_3x4o)7JbpS!)3R z$9-u#ta_J6Jb~B@^AqyoQMfj4jqtL(ZhY*7~P|N`kD~#!do6Q~hjj zGqYi+7_DU*sA74$qH~kXK{vLC9*67<*u+?rqd>2ww?wNM zjO!-|pjc&1P-1csA_On%^H&j)3;>d7BC$!4c?C9M!bUB(nKbFI&Ui3h$s|hFhjZ54 zM0%{M3SoXPcuDpN&tH&EOLRRwhK}^_c=WE{U+Y|Z_~uQWxzOq}R9Cl4( zU~Bh>@P{81RsyNg;~#sfoaZtP&(zHav3K)mHrIjjwMX*G$$)ebw?-Xr?VnH~06wA1 z-RLwn9jdZ}k$Dbvm`(B%tZu-EKD_`3izw48>B7-x@Hc|tF}C{CPSg9)_UoL>ANldB zQCO<(qLIHk!f&>|=y>A|7x8bZJAwx`0wEpMpFyR_iU!>rVG^PW!J?ls*G8Wiy)UWE zDjqV)8&V<+F$&%~LhO;kN>Oe9)b&wxqC%2Av{Or2 z>~`KQbH~?@UJr2m;yO}>$H9v{TZ6o)EwZC$Lzr_j#Da!J!SI?Sh*q6(_7!0G$eac$ z{1K5Z(L~h_cWS|$ndsiv=O%;UB)*U=Xqid!r_;R~^0GuZW!q~QOg^S57VE>)SOMRx zf(P}JkE}X)bR%5y{*Yo6VEljJgzIicADg|!+@-!TiO=kpA%;%i6)i|U5v~!P&_fI% zN#3XF4qFDO-g@2dZ5RD-#Cz2Sh;2HJiub}lerfrw(HSHGfNEo_$~hIc_IKhY6N|SS z0N4gPUH!s?5+ZAs^BI;9P#~xbXs!E`(;gdBha>B1*^oy{kxZ696-bAnQ6}PNr>8DL zJ$_hg6{M++ytDReoRMmv0Z2G6wtM#GrCIlRk7Ug3+9E^-> zLmaE{BJax6wh^kA1popxMCOIUDK6-eH%sToyr+?WrQ();w{$tNprS>V;uf7`at-&-aU)e=H=|at|SEr0A`%@z1wm6`QB>8sHcd)7JMN)A~*#%@!6fh zUJWnF1Hw-N0O$yp$>rRqy8q()KC`i#D0%fz5daVj@F`5%M(bbU)tcY(7j82?^Um|a z3II_l-ShD)I2QPDjOSZw>6+|#$pO$Z7=4lHEgs{MfH5NH*4xR@698Mm@yFI8AK+yM%!V6EGPN)|Jnsb)2IKPxpQD-0BvDnecaaTIbss=3!k3@E{@hPS?_2Vjo9B7! zy>mdpqq!+KRXx~9V?c7uung4t7f287i;(n*TjchdEC7%P4x(Tn?VX`;N)vhA8>}SH z1eXgG5=Efpf}{~cqx=|m>$<92`9h;P{^|Qa_Nw3X`kwxMQ%iwe&iUV65$HJ!66kG? z$C??nnRQ(aZ_2u|2Pktrbl0w%=8f-K!L&EbX?p<~8BU8J2{ijca0+jW`@BqL-1OU)H5Ahg7he^jw z%Cd-OtEYG60D!zbmHAF%<;#$bjusDqY3ofRzJ^~6Z!=bf_?>e`y|o{LOY09{mxfzW)aWnYnmPB|tmB(vqACOi^Fvc5A4 z&*@bo&GGl%`|(%*>Ho9$9RPM!)!O&mGLw)-s8RxfL`2c2PkgrDf^@`+6d@f1snV+; zLp5|nQ9uw#NPq;SL@5G-KA-x0b{{?qLI@$W^h{>vmUGU(zP0wgr`%Kax%bYb-HS1k zxu@*C_S$QGd(~FQ(Yb$cD6s3yr^eW|QIqm^^*exafaS6u*$^PHKlD2iCdw^G`&j8y zbP-@jnJ;M64*)#g6_=j=h@0Jag2H!c)-?8Uw)*isA?(8BA$X^;uq7;TatjZGt#r~X z-KAdYB-egZa`R{W^RkcscdH}r+&?%J*lOzCyY&`FK2GX>SLSjb00P5yf%&pO#R35S77fZWniTJdtqcLcm=hk{w`w~-;krF!LO{tE2zZ>JQ5-`G zV*~*}1M-dn05l{v$kPD3sU}~IItNzC5u8l_(ZNo=~4yyo2)O7cXw5e z{l|qJOF%R0IVAT`Jj_JvlQT$gTvyBG$4E}Js>R8mP82vB{aMhc->G9ly-64pVB}#u z2mmlAU4Nqvm<_bMq#GxH0)QFgWMiIwxc8EH+04+V;U!4`09V)OK!dCzDzuO*SE<)R zp-?73aKOULKJl}(F?YTndJ2p_dhTget8^Ki`bXAbZmj>R$?=)Q0I)8J=Ic295Cs4v zfLF5UxNJKOnF<{Jr9W5xVD7FNfw+{&w~aaW{(VWcQQKFF<)*D(rH3GQA9ei;%0I7t z^!fp206-!WF&U%==4*%tSe_a_({Svm@88>^_ES3!G2TVO#2iOV30;a7m&ok=fvudAtt&-t-ge z(=^o9iKmayAPgTFxJ#%O{fPqrT1;x|5Z@18hWKPIL@=fNl2-p!f}=;h((}omo6@Xv z-4Iit=h@=8eBn@1{?`{BcRTQSRifOLIaDA46t~U_(dPfKJuIxK8{{B8R+k))n`N}@ z42rH)d0lr=cu6UmUlaYSF@uWR#~ekDIgzZXQsc1_r^eDd$s9nkbn=ob_nte%tJ!&7 z3I)a-egF69uy?#1YPFSH+}#pMhEF=+OnglW0Fao2XwaN=IMlIMe9~9oK>&b)?ScYu zu)bhzuXS}eD=QiR95?&@#JclH-A|A}2-MCO003Vflt2EkNQgt?$^xKYP{-Z6I01?T zQDkDi+MlcTt<2R31eDnHB31k(5eX-4rA;!kv8XccXh%OG6Owz|(?3d%<5IuF@2!61 z8z&__cF&&QZnn0&_OVK>_Cu=uJ;KFlRux4;1ayi1;OWvBsqvHLRG$tET4caDrOw(r zv`PjiF#qG~5KSQgw!DDvcr8_G8CyvRei7~I$A8fpoci+Rdq0+WSvxlj4Fv!Ka$S2D zoa&<_Sh~UIi~(@!XDc9bjFB&`GDB35ydSQ!V)e@hmT)2F!l^vPpzoKR9srIxDXC|L zSy)>tf+bzEF?yt#HnbW%DyVvxUpa$Ftc9#vENg%c5*NIBF;?QeByb#@3AZ=1Z5siAj^nBa3-a5+XQ%w;$C|s48+7Z98Swh&989Uqvo}lOzT}3SpoIHUvB83XArSC5yCC41SLZa$8Q^ z3WNgt0`ko%DA1<*09Lh+{q5+wrQ-p3>o5|_`q2Qu>s^3qUihFY5~Tv(v39k6eD1lP z)D*RMU-9d0dtLjr3S=KK320CRfl=0&D};qkBOxIdjs-9Q2GQ5Zd-ywE=;-&F_>OoD zus+#jp!a^Y91_JX-eS}X0AqkxBrOF2f#TNTErj2xj*!HdYf3qH|AklV_v@@H+qr(| zDDdtpp5C_KF1?2AKqxk3)krQptX^UbgU?$sdLoz!>Ajj~)xHmoK3JhIYGz>oz?`3A zDh&%#$!NlU@z?0l~@66}{lctQOIo-qmDH8%fSKgtX z0hPX7rFVHQPeFl5x!|Y+dJ(pezYI`TR@NlN>o9&04Dp5(-}f7O%?WEC>-nR}GbdjC z+X(}e%Fl?FJ8)JoDgQ2*RyaB|<}{LGgKr)Pn2cBs_6-NF0KX*zm+)JnOrI4uTWhMeE6}wCS{?a!-{wK2;b*@?$6xglj+1;zQ z^$hLV?emmBTS3EAmIXLjmq8EQH(odE}z-?v@LXeR(L z#moYLhYdUap^J%Id)Q>Af`6cjy^2G=H%E*v?qsRS36ljE<>6B(xdSNB&KX#pvj^5t z6wQD{(E@!bEtb^+pk)Xfp4DO&F%|Y*S~WVEzDdvjTK|Ge>#Y&f)_CHT|MiioW8LoB z_Pan6a`ADcLtk$NengrO(eFvWP69ca{b=DU_sg^Nx-_1kppN65wn6t z+59g!mxIOx&T%*?|E=m85E;rxF1g}>`V{80{~O%`NtCn0CZlEK7r}Irzpm3kE8=W_*jJtE0xL* zU%Pt0|1%v!=eqV%VC1y>KS3h=2gJP-5aXqz=y6aHCO6YOsk|Bj0CD;L4X{$;Q zW-rEImbUn4c`N$||4+6$x4gDga1LI2=g~h4-yb`>;;}zGm-hK(bjGD4oS3>10T0s_ zv`Cs>5;IEUN4M?uYRt1MmF(1}) ziUT-h)x$mWvONCnSO4aHc3hy$vaCht+M%Vu z&KLdc-zf~{ajJp8E!V`r2}#A+aL#cXhSNH~C+q|spy?t4&=sSy$TISLB2 z``1uh0OA4AIH<-?H%a^PCPzw$kcu`_a%X21+<~>M6$?n>UsyJ~o5{{gWttFkm^?FhO-T7`p8)vV=R;)=y<)=b06<(dY%b%X zPU7=K0Sy%jB|}nC*!WR|A=U@g7Q1t`8gesgwL-pj(&B%tx}(!SAp1%W)g9pdS69^5 zBD4r?p|SFusLSpE?1gBhnN*<1KX#KnfpabQLbKLSbWbSS2I+3V4WIu-!%@lf9bd?Kb}IT4bL0RezzN)M#^ z00;_1r9cU!@l4F3Z*<(Go|1m1C?hdRil0(C8Orz4?1Vc#^-;a<$0;!Pt7{(mX6E8F zdtCp^E&6(Mzo1&n?-Uw92+9h3fKJB;cw`pv6GVMUi=4_>X&eG7_>_H=YeoxHo&^J# zY##tE+~WrTu<$_WiKidW(*>Sjl7jk>Ob?qnZ!vhF0uxk^o?WBnv>ao3?>H6adgP=KyS2N%g_Yz#1I2UK#-C zKAx;gdE|haB@U=3>-r_D?>e$4>i&2DKv!>e%={w%C{eG)F7Kr zNh4LxSl)$qi;0JBuhF|!7l#!-uxkFou7K7603ZNKL_t(VFEz6ncDnNS?;`WvO*Vlf z8W|-9aD0KPT&U78WS7?;FXeJs79{vMIp8|*F%Lxv%_N3*qk^bSgl{CB6#kJ};vX7r z=@k~?Cm&G=8i>eRNff!ziGs?k!tG>rx?A3BaY0VL zJrGz2ArODOeIoys9B^dO5Vi8|NlPx6imEVPjU2wcb!BQfEz_1YuAkE2rYAy z!T{oArm4k?B_iGx63F4-#l43`FAZG>7V@E2Z04N$&JkC6t7r8Oj<_U>q=^7v1Ob4W zW$o|K(%1RD6mSYfzH5M zE)oRfthc?k0EjZtAN{RPj?*GZX+X9J0JLap09M86G?U`R*n zB5T8^p}a*4UU|r}%NHz~`I#3}r_i}zolxN4dValQZ>@5F*|9!q<;h(KBLMiDtZurZ zr$mCtAMYnW~l@AQhZsHojGun;&5+uK;^Mgum1oCB(!0gqG+X7WNkB zYLodEgLLdZicRWy>B1d!G{K(@HvX#=SP z&Ztva#LZFs%SI%+7V}^W2K}1>0HvLh-Tvz2-od7zpiyxnf#7VXR_3xit z@Fdy@0N@uvIu6x1SW0ucWc81FzLT~{N#E0gSi4>N^RErq`Rj;nsJS80N(D*r*_MAs z5-`j$g3cHign~cn@4(zbu(N3kKdr!;bb5r~4%mi{Xi^T+<<(!K9!2&!0D3%wD(cbntx zo6v7t|AgZaD#haB4H5_7fjk{nXD%nRlFAPNk}L{Iz*Se~Y!iYZ~pXdQc0|0S@K}ph$Tyhv4 zj7Skw267c@9OO_u03rrB3ITNjpd{&9ebN9Z(Pj`1wxJ93i9<%?`Qv@%7M73)`tNHN z^z5B=(HgHOL3rt}PoaReuM>r~accyXP;daF=89<&%ix*66R}s|@unx1@R(e4323u#Iz;NEmAN%smeQr;iXXpFoC@_WqK(%K56Up4XW*qnj zMMScQ^@o_&#Z}dQ0HDqM&B}L?)MD`#_Zm9{7y#h6Rf?}F<%|DWDAhi@;AlmoXARtjCb$I^vN*C>$cP4LHiodvy21x}EVg|_lb=-O4Q7hL?V=2$3r z*B(93j_k9$r&CP81r#c=9To#ifogbKAnKn?m8=O(`^gHs*1}v$jnLbSfSw&gsO!i||0Knbc z(P$0zv9xUB(+x?sl6A?V%lGNYG}q3>MidzR)d${Qt+{`vRB_-gl0O8%@E?IM`kx#? zV3p>0fatV#qZdU<+8B3Nme>J2mbEF3ohzcgu^@l%&170s(a0C&LS1EVM4O;Q`geV|(wvcXV%Uyu>-&!g)eo{8>&kR42X>KsTx zf#?}fu*)QE-s_j;3q2Bq&+haKBYeH z7-=YZ9q2D1W`A(8bXkNIh&rjEBs5M$0Eku>6>jYQB~@NJ{gtaf_S?Z2Z|9k<1p9&pxHTT06?*NY_;ItH?01!*NPOp?>x2guEU!L z03(ija5ZfL0sx{)#JoTsb&^jTc;f~V3xJf56#$?E7^E$?{I>4XVB*uHNEuYuuFSbq zDX>IlV+)OhxTY_zH30w~RM8fIe4+T3Q>(4`j}LrukLTK4lC!7B&HteK+)^6-SO5`v z7n%4Zjsc%=|9~_)`oA|7aA6BTEI{*1tR`FlevsjfP39R}@d`Z32-4p>K+-gIV+$^z z!q`9xs!$Hf3x%RJW#JW{>hurD!Z1U8?S%85m{=)v|F&us#z;B~N{Fcpd1UaA`Ugm7 z(`Cl7Weu3}9`At$ll@b_#&2pc(d^0CBxbfk1|>IGNKZud@^aQV;1k&o#?+s^-oWFSyB1+o$7<#7NY-cp$^D*gBJv`vLk zSg>WZuj&;G3RVvQLP5FRwNC?787Y=Li3_{D7W^b;U)LV7cM*KSM6J= zP4h{xZg2LLN9_W2w#ZXOCfJVw0GNl^YAeg=^|VQszw3&U9J-|}05WE!4c%P-aJxET z={-{#3IOS`rUC#elrWKu*8kK1KyDC*H37t7qL`p>xknezkoO_*59xspSpdpp34lca zWn{wzIYhX~$r1ZkcL0>?PFe`?GNYCmuKE+1n_peMpyxA#v4A^Y__KG`AP95Ck3!f1 z#1yznUX1u?(O2nzYE->{{dmnU^Z#)0#cTr-%52#qyhtN7$G(YyT5?F{* z=Dn)Lt@-0q1y`H)SG>GxxImQc^^gB=+OlSjkUsRf6vpKaoSB5FD7qz?opI25xfaL2V&7n>OKNe8ugX?Rd%~(RBT$DXjxQe8#tpA3Hp+cFEvR0 zR)6CuN%)45LWfF$HR=`An=4a#Ao&_OWl-lC`v;;=8Dxg!H?dWKYXL~BVQR#ovlL#X zyuClJdGz8z0RR}CTlb*;beziA-5P$MBO6ofX*{!fFTY2sAgC}0#PWLu$FV3!Qu zqBlwOJ8|d2G-Fz?F))T%Tp^ik(ea=D7z@%)xDO0(`AdV+~+E@H*~HFQ(%i@ z?mMjFmgYgPptU>xg9S#^zRomLRv4C4>*q&zE%fxLXirWpwQ_4$+}RcYa328xq)O1n zRk?No07QtJet1(WQ?3aB;C+rQLI0Ph;6PUPs1HCV{|Yq?vMXyjkVrbsdE>xOlDe?BBfgA%-H&>!~O6aK# z0DzY@_SKO>i7%H2oA{Ub!UW7<3INgsB)(_HrN6tlhP)Vot1y8o{s1h{eFZq1145Cw zu!w3iwBB-NgfH1S@x%YV?6&!bAKqA!vYCbI+|zanfcM9J{iiR{BJRvq9R_t`p~F5! zq_zH}@lHDj*UY<`xyNM8?0Z&R%?4bKl>n0y6egCZNWfe-#Sww~sUssd6(YC5af^!k z-jVBRvxC}Xz#I5ABd5>#omCkAev6cgi-2>IN1UytWG0F;iFFG9pGC_JEn(m?f-FTa zwS1(sI=jvD&ZR5wJnG`45t&&4j+y%>Y6kQk1V=Or06g=r;9U&>Sg@;)KQK_tgz^Q~ zn%7Qkt`9(JqFN>^zzS&{tV#uI1&KEZPLUKmCQID{pgnkqHpj`674iQT3+^GSAH0Zi zLI>~jj;nq#YHeTc0oQi-BXhP-Ckp@&^vN?0=z2Nv2%yO%fFdkEaX>(xivSXgAeAi| zh-5M@|1})(Pp>J#|E3C8$f;1peqa=IM3i6_@B%mnL7#LzV+OG!q2Q8b+h@Og)qd9w z-pX~J+$sge_xxe=YI*eow8DE+0Z!hP$P&OFjO1%?Gqn2Z*!xp?R__I$eoeh6;%#Xb z23-?@i=nBlSI_UpzEmeu$N)fq672zpETLkuE}ikpmHXW=XhhlwAIw(m8TTzNATU5?DG%rb`MWk%*>0NN)*9Uv?cD($TJLCsy*U=!pL`+8e z8NMg92o;M2+!|t8QGQaI0|y3yZjq<+Xi(ty1x3w?g^~{-$ok+tMl6vCL`;OFq(TCi z3DV{YT+GA%`6#C5A*tF83fOV*2ijCCt5VU*e{12)eNG$f_3J#pc?#@$?o&I}^48V# zghObZOEw~`v5q8D)TR_m7=r@v1DvtC=7(5(G@mqoCiCQyY_lZ69tQ&;fVVw)|Eqn01WG6;bUVfGDTAFzRJ;C_s}4G|`IXtU?qmRP^!L%5V8WOR50}pKz=_i z)uoDcz>#cnr9rVW*i1^nDpvtD2Fl;L=Ftm|8;XV7lWGMltM)!n%)1AH|ElzdEfw^K z)1&I0fFuyot6}Jkj%k*ltZ|x%1`MGYhSn*GU5pgF&zF(v$Mtca*(MW!g0xThNQx+9 z0fO=59k}J?Z|-~YP^@9+9nDc-PpTF0R)5#rTyfav$)iIBaL^qOhg<+Z#nQCCRYV=p zGQ-_h51CapKV;q06>Q@OV-6(=Q_&JjUsAVZ`rLPc+m+(*te5Ig69Bf}9RU!KfuvkT zgWG9yEE9F#&VP4N*WRaf+yUuC9Ch3SyAy-`f@r^`Ue7eyW+tD~-#r*tfY-c(8xD}@ z*5kU%?w-^}0ASaC&+16+A#y<_Z^IahiBbyUjx^$H6(}|b7-mrQ4=4@w04Oz(0sTeVVM8AsP$i;6~Al*k@INI$H!z< zVY8HT9$GeQ${}ex+lcE>GO<>5o*=!st3I3p0En(gRxk|%@awg-(Wy7+%Ty+~9Ol_y z4IeO72_)rTrSw3=1pox-o&X{!up=m&C*hMYvOX8wz2%SXlI={4>^8L3!0XK(n&=#e)g7VgGt^uq$G1!d3t_yv4Y*lEh;iN{)uyNuD(m z01zIx)E8COFnTy2h6n_ZY4*Wfp>*-0s}6jA=vQ^ac;l!U^XAiuuC{x#>*b1wz}Kvylc0PsOO?h(-& z#LviS!7+`4ucHq2av)(Sd^=Y~sbB&Da0N(xd8SG*!dUA>vMmY#P?hFbnZUu|oVoJR zp6kAj$es3aZD;|6440cg0Dc`AMFl4ua8 z{7o|v;y0bxR~=3rl)3>Z5G8#dx;ed*lBEeDRLL~zKKjZx_x?g4(4n0R*LhaU6qwla z*y#TLuCI{6^4y|D4YasSHsni@4z;l601RMlVez4LrM-Y&AayWrCcWz8jN;4Yfoe7Y z&_FD9`KjLuTc>^kV+HU+ud%*J57()e8(0+VOUFm-U8oCtg=8weJvRj6M8bq(yN)IhEw zFDC`h8UVziDg$!$pr9#2e&wFI=Fx8qDFDD2dwP2Evz@(<8K~B7qM#mSmhwFRT%00; ztcLM=X*|H+*L|Cz_cSXYlkVdUpezlhpn%87|KSJDDCZN8#SJ{5B)T|fnykpIIJ!y% z4a&7gU%hVM4hS&ffOT^bN@m|a@YB!JqRu5tz%ZLSn4v@l8h(*q4?CEGWOdAkulQKF z0+_+@+XDcC8zf0l#2s+5@VuT@!`RtUBJL7#8A=U!#8c*o_sP8dQdizR>E){qc-(+A zo6IF!&Y1Nf%KyKEBv-~D`SJ$uful56g zdrzVb`W-ZDf&7-LY(5lQA6;03$QOYUoW`(2Khy&N-mNrsj-JO(P^p2G5?DjOfNDRx z0vIOL(X{{o_8uYzK%powfaKgFsK)vg>5oYR3od$TUF?X77d-Qonp^lfjbS{~Op>K| z9`XqiuAKmY-^b?k(9A*JxS)W#bTYUm^jN<^BUK>Qr!OPnhCxgY#CD)A1V?`I>0dfS z5?@fk6v_;MGMP{4@DehK{?$jwb+NpicP3C^+!>F2&Ml3;&ap}pDd3oa9l3G@=p!yh z1@1!l$Zi#;$l^PXDgzuW{Ts!k;X(6;P(DSolY7*(O~)NKW`HCF0iwAQ(}tU;;ctjT z1W@7v=kHyX)3fl}gYN4vpHN`)8TXz}@uk=EDS>5)9JI6^V4e!gz-9mdWOZf%ogDy3 z78C#q0RUQe>=;sSKXmQt3B9wYzL~b}#;SPp>2s#ntipG5R%y8EQpKmZvvL)483dI|57TyoUex5*8FB0(;74Wzp9Ts#IFL{O6QA_@*rE3E|ymrih~bm>P| zKXSo;rx9+jzTfr2XZNMv0aww;-_Ivr_(pl~04>SX&cbiZ@VoY)gYZp`} zHLh|;Ei?;G^^%uv{NiPq9>0-ZJemLi9rOZLUdyJ*|}#3D1d62=RG~HV&}e3KklC^kt2Yu0NAVu_=S*DHAtE)ewP&hG$7nDm`ThDB*uSA`5hSATTRRXv^3 z!Gp@aEj^rg#oGCt=bo=P)pt5b55yn%xe*Hh_YW&JGuab0kT_m!{C&b^XlaJQo0|au zc!Jb0A*&}WVg!r;1SEq92O+A9!u>|5!vKRP3KY!cu773ZfoE^3wF1V>xbOXR`hSj& z5u=inzh0esjRsb)>*|vZ0N9-YOE*`HtU6Q~_mma0W_;IV#F^$bX8OIiQFp3iaQwoJ zaf;pK#kj^)DM0zLflK@C`EODFtRR#hUz8qvAY>+{J^`o?P^(nPHGpd*CP2&qva$Io zIvnK7PqK(>V<0br6ITF8;-nl}i79+)Yi*IsTny0xL}SR?M2FYnWxd zqvpr!tc1QrfnxkTZ4KamNwx&i$#5!?vZ~U{n*+*72-ev8gPxz(%n=p)@)y4S>GEK% zU+3A)Qvkd_?t-5_<<{(dBpIfQU0^ubmN+QTjMsxB@a{1O0nN|B^v)~*puUe-`Kv0S zo-|W#FcfPeT2X3Io;Cv62!wW!AC7zZR%3R$?D?KO5MjAVeYQO2p$}H=>aV$mqOxMf z$v%Hv(t2$HU=1$8v25kG?B5lg{-fWVb?l!_7B>?B7(4Zz$!@-QGl787+(bdWJn2ON zq{RU|>cinrX{p6tC2s*Nu z5%Mb6Dfjk1e#MSvBOCmywm)vcW`(iCzC!_SGk9w3(+Dn`N8_M?Yjjun?(-AB8Iyi} z8BJGFZpZ={{M2O($1_KuqJ)9*^Y9aYDS@3_MNwNinBOGQ7dVe?KR6{3&lGF5+ZNsU z>8}p{3U=PmECu#B@!659N7>)5xz==~c*5-n7oU{zR)L_I9^S~S?F0gvN0~2uTP+P> zHw6F`@9P7N-Vd;j!8XDj7Pu&k$P2C-fZ%8Do@(Fn>U9U7kco5~!Np^y&HWNlp!K7I5f;x-m)2*l-?$MKjp>Ee5iiD&b!6wAT0P!F540n~WlH^iy0NW!ArznVZm zFXxL(5fP7&+Kzw+GJ4A8)=;;>SE`lrG5t?p{p?1<-4SA^PTizAe+pcEHHzEHbrFBm&!{GpqQB>)zsEvCMa#Y%!yd7hDB@167;TE(vM4ov3Q zh%KBRjb0t$ zug>^rzxmrbR}M7=c0B9JC+XC`KiqqqiVTrQ-W;UA6|kR)0bwOT%m94i>R9r+{MXhE%MV(cT zUv$I4FJ&IUP%}V_?_=F{^nJEXsY1~(Ff2rU3YQNR?UYt=lL;T#8m|kuCRp4-@uM6% zTB_BmrK0H0O4oo1@$ki)GI)Y zKso1>DJuZ|0w_4J00F{r0C9H;@7KsctH@znbMV)~i_T3}_fQGg5`Q9=!UqCT`p)HTroi^6{rEnstLq3>{#esI8U+!b zqpOgLk>Ndz^j{?m1Pchr56Xu|H4sq#A|C4Y&G5d6I)#}|xAD{&4FF;RLxlS@Fuo|j z!$Hs357KQ^tfy=_dyL{LzPadIhy22H{2StR<4=2N^OdVA%c<%gsE|GdUyx~QDShd$ z@~(&n08y3-K{Apa4w+BDZV45^`}a2t^8fWa4JZ+uz>deo5t1jp(r$(%2|J-sr+C6k9$%ZDP&pN zc3!*d1<##cbKDDv{9CbEn+7lCf&c~34;l<1F&b$?FHS*6jW_DFq2y$&1z=qQ0ROvn z2SF5wDj-z`ii4~uwu{~iR5>tj|L|Wk_dAsM*yw=J&h_j(%ZvhCHL&lQndI&}8?Hp& z;~b96wjD}JLMku-vE;~0_fT}$R0W0j9{Hr1{loPq^az`kYyRRz4YOs%Tpw5%Uq@Xo zbBL4P+*&*W;4nA>X%G-YSurT0B~SVr6(GHH;dT3?Rr5yq+49)?uc}n-bA)IHYHvLP z0QwN47bYm7r2aoke#?3Jtvip}C5sF*phS=#U`iQ%^gNr8BketyAEM=@^9(Ie6JIMIq9H0om_yppa-6N+)~4GYh>=d?nwcs>M0 zDC`ODDyEL~j^OAOGK*F~H>#T{!G+FW7GJ&Jd$VkyR>s`9H#-H;JEJ;aUruXuCIxj! z1vIjRRgvvMsmXb?5r&DIg^%hE$`Zg+m{Gixas^cSR#03(MIvNjDdcAW00SzQDL@aMGx6a9P!#YcJAvY5l%$L0J7$xh zLS@Mjb6=c!9y&R*P&J&n|GDDGjFG=FF%N8opz(1bEo4-13>49bOD{uIlKd+auO2pH z_{AGjJMAsLa?g%cyYwQh8E1q?nOHPmcmTjp+r~p{7TsmIylPT5k-u8B*) z7Y&U@4KMDv_?E+8HGf}|ygGXNyeY&#vjhOdTTB}eECj!&|Lf!Av@TtnS$%JET1}p) zocFjmCVXBX6vYG71}G~4t^jfki7S>FWf5f42DNTktQVnBfM zs8|a6Mljez=WKD2fL2&{ZY_+j=u-Ti{yZ|gSUB zHgd3){UD+NGMp@8oYoCXNr5tCtZNoud%!vCZe`p1=CRZ7o>|RxpM%4zsB#ZV>FThJ zZ(KJ3APhqFxS{|D^9&a8w`x*C+>vQujLwu$_z>g2~=`wVa z1eb~C7l0uDGTn?x>>|~%`C;t;&)Wm!3Rsb|D}4k4bUkf(r^F7iS%CIJ;c2?{>a{=a zS$AcD4fnw==Rf!HvXj4t#`_^@af~^@{27re?aPyoTDzE@^?u2*ZNmdE-Zln#Q_{Z#IhgxgA^v_ zI{z#bOE>l{_=ZtQ#dXT$)J}Nk-j98#nlF6UEm-dpP^hc{p@A{NG(1_Gu7T-wX*8;z z%o1Q_+=fj$U2)SCz7Zl$QpUWR2v~0w8O^?9*ou%&MnEB7SoZQ&`)-{TRj19f^L-mB zK)gS(_d}nc-WfNS?b^Fg{uUM}o3tDE4FC)-63+t&pl^up)sf)UaBsA62Fdy8O^qkU zH9(3T3WHsReEi4XaG6LtH-aY-BZK{5qtd%odgAqK4m_xxb6pqD+VYtB&z7t9UQnhG zEpex8|Jb;oSpCxo02oa8;qZXK+bDHT&)%;kd-(TTJ` zRU3dhWN|z|fA2D4dU6He{mNtrC4s;qIyo#U6bjd@-Rxc8&donu+0(OnNFb-)WL=15W4A^->h z1T%h@HOTS-0KoDUx}EVWZkxI&%e_i6X1ztO-(tqRBPfU}w$F4N00=8_|8)Unz~)&c zzE!k-CIFzO1;i^fmCkYO3V=Dd)<>}bD+vg!W%Dmr7w0Nt^c{l43WZ*3D*rf{(=S;4 z?H&90{~F9 z7-E-Y)J)^cE1$UhxebZ&C!F=*n8O`XppwZJW+!`6pRPZ&NbdpC2Ig;Vj%d_`UfzFq$&TS=sTfZ9FqAw*LjVx-5T;v9mRxciK=6TS*bf$+f@S}9SgCN( zlG~12nw9LvsxoCnX77CAntlG2W!#->hnNDy`#bf2 z{Q7FmJ{20QNdG|?vo$c{lSScXRmi5-M;O*xAX=OYKvX>3p73!aD3-&x$sM4}7HeAQ zGRnmAd~)W}?>T4j$YSB}zg_#;U$ro}A-i?!qwhJW<`foCGbv>Kl8lFimutNkj3F8T znBA*nOcQDHaRZB!!yM~cuqLgzo06>=j6_cC*0FDXZNO1UjNeOVT0161C0zrs=g>{H?$I1Uo%3-aO zFDx8Z81a#%kDj}x83M2Cdv-qO*>4k=IT;F0ayBr3?FYx`bigH$KbRiZcx6*l1(-VB z1cYeJr1dr0G?qp1sx1|3U5y^6nEhqW>Xff6P{N%kB`aosd@l`Fpzfu~6=#j0k|bS; zj8U8>Yi{mMiZeT^GzYpo!adn)%~{)j~+`qhh`3^kV4tiTqjL%J>l}`VeE9)GZ)hV zf<+kt|=Yc`8-D1L=#jG1b=XO6cmmk z>Qu;F>XwE>kSy-9%2O6!d(d;HW9(eF4k$p{e8TxZ{X)6sTuyDF-v#iCcz^<(oT&RJ zx6I|>Ul#QA9SIB^WF&l6TaaYj&GH!TivtJEP{eComUOp1?RwXUtZU+pu%2+u6nz@y zpxPCrq<*^Srq3PP#1jYo7G$c`EbE^HUAAG+$CV-}1)PnX*#H0r+l->j$}hZP^rAfL zPw*ripE*VY{3r#kxcxIVGZP3vqC8)?t7H$HObvk6Hbc~A=2d^sL?ZIC?yjHHK;P?- zfD}Se*-g&D#iPOa5T*(Q#FVH^A9xcM001aOP-a{;Q;b9mKse&jRwn`@ci660xk8{_ zUQI<62<_7MR7JQ#5wMF2waVI+PtJT_`Z(9`D|Wx|xnl>a&b3rGeKd^R0B3AoQu)$o zl^o1}6*477-!mmcfm6*eRo2ZCrgW?KH#`sOfHxih02Px3Xr#Yw!cSF>yrIqK)ZAfK z`QKj}{h7bydSV>R>o-emGNaq&yl3{W+3t7qjy=JGD+d-Z7N%nD(=Gv#TBsGFLdJX= zvl$+1=AN`gkwQM6OpCrg0sttPnD+eO_g*~_Nuu(yXe_iOcihLeeb+W$_}y1OfV#`; z&1c7B=55hiv6u32mE|)>@eHs~OVF<;rP3?_nAA|nv@ig`0ab!D!H-4do<>HCxN2b) zAZ_;T6|=tlwPp$5%)ILFB4)5QpE3V`D8ynX^M+VsLjKQ0mxCoPW}6abEZ5p zZnKyNUPO_>^Y_%vdSK*w-aqaUfP!|xr0R24Wi_1;a8h7n(JO?;-dy?k6(4Ap$m`R6 zJD>T}LugVI99WwOtBAw}a0Mjht6~iv9Y+WQkda2iSl($u=&>1?V4uU9qg9NSJ`f1 z56baC^b{>L0^-EKE$N~P005mFnKlM2JKQlQ606^KG z=A5pq$?}>`NJRt)y1BbYj2L$2-@du;vdoVkq#L%Ha@Xn9@9=sAFH$8arC`X4$1T)@ zW{@bFw5D^+D_x0bD$2ake2S03E!%rhf zcLaHb1q2}AmxHUc!k1mau>c0ds`I$8o6$Y~$42pGgUvIE&Fc?K9<7nEj|B1Pvmi!k z{6ASySQ(*l8uIHgX-b=(KYi@)zTDH(6PJQuK*{!9vgM@NE2!VW=5X@>07y*;sq>QR zu7uub0xIdzXOS~3(&{vqcoaF|ivwNk)p;`gV@#Bh0jmK03XPi_x9i33eD#ZO&YJe; zW+`XH6G;yrKmDQ2S6P+iu=@i^YXE@8EAT0!nwsEF6?DcAQ!2RG6QgfHaR8ux+OO{k zssGMz_syDPVUhmF><#}5r3Us<+hFP%2*0lsaLXc1?%yX{6cb_yJ`&RwTjYo` z;1O06LXA`{5b+{q`qhKm?Y_RTZM~< zz5dt+x_}r!fT5g8$QngviA%tI5Yeq?AoGpJ`feS|46ZMG`9LgnU0f!>dbjNJCDWz@~q1hRsd0R zl-(fdfO0lgG|}!ucBhKJnl{0otl@>vyt>(MmgLrvHDJ`_dp}O+{hzyJE=N@l007+= zf-C3oJQ4taB4RUc0FyP3yN0C~RFDcM;@AZaMkSEN6%29kaB>vOk}DLuXaM6;yP@#GraI1D&icu9HQPA@k>Q*bKugV@SD3f!0dI}e z3G;9i{ml6~8;{mc>k%o3!Es=e9)O7&qhA3;jaPuW3g)H<=7W4V(FJ5<0OB;0K;9(e9Zl7Y0P5^0FrSq-ohbX%*FM=Wc z6X(}#PWj_~g9HG43f_Oxml?`wpHD*SIw=1l0bRsNqnvb2s*TX!wPoE!`#mq;_@z!@ zU^;uOvnvieY+m8_JCFJbc~@_#k}n&!O8@|>o1v7R49zcV;4(1znDKTxNR0&L4Hf{% zRd1Y)=6t_fD|+z6zX%_%@utl(6U2p=F zij}du;H-T8?#WxU8gJ1S0Fa{%wDqvcC9YMXu1mCy#BVOAA}|G|Oi75D1dbSK3q$(1 z3jjzTc*bAM>Y`i-%1~AS#RI(6W%pB~F?(gc*nR%8$1Z)uaCjTkWjhj(>&}n5fK=I; zw0^@)Pyb9e15OH`n#_cwN5V$GXCnZRXZlNhrVH2b1{4+*1+V#4LRfWIXb3)?FezqM z>`@3y_JcC-6BnVrgj02gb>}9$eC_96+Mt+W6CCVrXFq;k*>*3YCPJHWD`7~47&CjF zm)ZQC3(Vi$+;{(c?Ey^{t1)Ip>H#t8pA&DPf=|bCn|F3mNKmKjX;q(= z0YG5a(?1LZnDIaqq%gyXfv5V*G9&d**Qk)JB$)m!%CU2DrNY{Gzkc^|&u17?AN^yvYB;CeR?0Q~Rdo&a1iQddnE z!N)qDPd=jj@ke6F!TP8&CjnE^YMACumH-k%UtaREfZRnwVd z#p&k8F(HK+v|@==W95=y3T_1eL~X13^8&KZ%WuyD0K$99KUOGE_Ubboh`VvP1Fs`q zf>o=`9{*w*;Q!csjj^C49HQ3QGO&uw0=E{oC|xm_!Lef}-SZv--M7;yKPUhIBay== z6sWAFfb@0&fGEo-lOaLo#qon2I+W~EmKS{(1r~5%5un3#(XLg-kL(*u@fCfoGJo3u zz?PHl{0}OQ@&IFqjwea+PaHZA$$x zt}($pC51Vp#He>36!oF30*ITsRfRUq7HZV#000+yV8TCHk(Y|M+W?|@>`~OLTf2Px%hnCt zfIC!IO*z`}o&c{vP`?-cM{ywaK!u0Jat0SL1;o<#2(EPVrGCdMJ+t`613uTP**cCH zwmfRiRJUN=%`gRx-Pkq9WxP~6uUIKqS~XYzGO`#03cYSD3Im@;8pC2Dzl~BuEJd_S zQ4LNCQ%QCjC|+Z$59pfv{(IlP!->!Jd`g+rGmhPNdD{TM#Di|?UcU9#m(ya`+s|?z zZeT|)H4CIDEivl-TADiKjPG?b8B{Oe0OPBu2!Q%4f+P)gv;1hI!U5#yBroEoONk!NvAdE$!O*8 zr#S=THtiP^x2ZRF%q#lEae~1V?FIom9(MZ{mG0qp zP$2Ucs*u-Iq^p2RowNmEvB0|-#2_x9O>~s?F{^td^n{=k-iZ20ToDde0>W%GFre!> z5fHkR4`C<+P&jb;>`70yV^3z(#L2H5J8kayj_q7V`Li?!?MnxVq%^Shn$`iMLYmtvKR+=M0BB$$u?i^mB0eJ|#W}eyx8ha?R<5b_u3S>Amakv+)2qJUjs;lX zpRv=|o|r-$cN5WLbE!)$MM1!r2$W(Wz|3u?_?Ztv8^Cx?Q;3!IIbmgPA{b+bpwa@7 z{Q}Mx|09G$mFPu+r_fCps*t1XU6%rQKJdbgpZ)#%zV@5?_{N|8*e9!1>k8^4{}HNs zm#-na2?21vBQIiyxBw6PInkY`SoFp^G%f>X{H^V6uE>irpp(7ALSP+-@uEqFU={I5{Oz;ih8lVu2u%wp!& zrN+hbCFbS2Wvrbbfa9rJCqOd*AY4ATuEt`9L-a{tI#~TcO!S;Lhu^oKvX#Ut3(z+2)$EQrjPQ>t^NNkqg|swYQ*Q z=`N>zWm1SidAnkQ_tKbw7pt8ctAQ1;fyGuK=@=61RiJkk^0jhxV9mb31q0HC*98>E?!IPC@ri3O%2 z`A-0V?lgw+aPuIfzH)&X3QK}ZDc=qI63oTR$Ul18Yv20JJ?qOFcg7J-fxUX3Exxd9 z;6&p2Zxu=eKc~MwhIQb$8+u!T z2wFfTV7TSrhNCX8EX^4J_*Aa{P>OFdi6(OZ;LTB#x}TojI|TsXql1vynnAaq$X=mP z>{&kRh)Y_bm;YWf$(`YCTO4`!6K=8l0A2~iYU+mbnZ77=BChc+-Z z$EA&oz)slQ;#mpb_`e0S>tMpc8mp1e<=`!Ew`bzX2!ZVR`Q!v5k_0%O6b5Gp@X3eT z38UOBxdTWBQgNyMU%dXHX9kN7o#(cR0;FBWo%QSql;3_cXS?&^MwCCe+aCiE7|_@H`BWvdr5Xf8#I`Ep8v%d-AM;N=lK_V(x>>y(P6y};fUTz9XV+ZH)MghACngfu5Gw$e^NIlgoE;EyMKjfWbBvDr5y0R4$CHXdAb=MO z0I(dA7aVvkW2Ea|E#(U*ES-JCg67{Fyfe!>8ohJkDK~Y$xpLdLXxO6w0JwYvD^_e4 zO37#e0GJ4Mqd}^R^yKw2dH_H-1W|&V#tyuSAPjc#)++zgxALu*`X4+0%URyHF+XR%e(tfR4P@X0(-*6V*miOvK3UtK(PIv;4_nqMVS=7f1tegqsK1(VBjGL zH)Rt*PYksW@E9n6m;Okc44p@c&ZigO(8&&HKQFZTiIg3))0&T*L)h;dmQx)rOsoI^ zpV}k{P?yEQ+Z$w-q4KQDBsGP4oRn-G-Z>__r)eIqlg^iFi#MwACo2v)NQv!NnY(!} zNK`wu(B>v_43A4)xw758xGV3TJEFU9!QZd`{F#&`JaPu0{{R4 z%s8wBEdUZKCbJ2EEJa*pc2~p>Q`}?)l4j$7uMQ3bfraLlLsCNl0Q{R;FaKoOtS=vs zl|JbsXyX%s#>PyWzlw_HjN%vo?y3cIklq+_vd;R+nhIlrQp3p4-y}jT0AME>IXvH- z&O-knZ25*eu=>{n11qoXUvS8$Rmt1f|cyLqv##KY``xoz#xB9zIpX$waxsIHyhL2j6V6J(;~+auyNaqk3pqanCGijHy-~+cOiF^HMaZu zg*~4dFdZfI&DK-zeU&2Sw{uW^5c`kE%Q+g7je*f)Q&K#RAGGOrXb`}GmU2blqttYU ztPa!BYr%m*dTt3mI0FZ8lQFnUL|B$A``)FqCr!%m^wdkuC1dKNybH!mnR`Ah!j*Lt z%bDcbXBN&HH-9icuaOI*Ph+fqyy+R4dh3BU$Xmrm_7FaTFyudCD>8rQ?dnfz{crtz z)q|&BVLpS6=gM8a{^Om?<-!SW#X5(=+pPkeR3MjHAN(zTa372L%;u46nMNKiND}>l zA`N?$nzI=+V>zz}OYcXB$r0LF71hBZEj%T?EDY0RaV*D1Z~UpIKWhz)ETpZ4fMRj2slT)re#fe8SVD9DT&v}hRE(jX&&LaVV)3Hv8JSnvI2 zwuZ2Lm7&UB5)dIqLIJ+A7bKh*Cv*G`U@Eto8u&cA_{PsoHBA%TcFL@6sLlnW%iNb0l?Bey6P&!63l!+#3Oz20+1sYg|fj+QLV50yBkNpU(?v5;F-a{FfwFSwU4ylaLrV$HHR>-)8P9(QYL*{Jbn z+Ew>b+Qucyl*-wZFP*1`D)=u5{^Wi~UuKJh|m=-}3zmE;*)YcD`BqF$G4ZV;M96u&K!Y>sc?j>?#yI5yjHFQ6UhA@gGL#6{O`a*i;oCQgHxsC^-8)Am;!7D5I}rt z56e{+BzI^xLS+la*gIm>0#X0Wa?cRn$hbfj*^UKS@XL0DwWhZSw4?H8+1Zw~i1Fro|Q?S+H4)*_0a0CTvNFAHHYy z@ju@X0FYl>Dt=Yjp_@kx1DSEbwiNuvh>UX@9J@kw-mfi;tX#3A4Rx8#D6#%sg-(L2 zivypblm8s5n8vmfq`e_7z#m}K>X|l~Sz}N>o7>y-iL+e5vZYTMh};#?2mhvu=4A^2 zKH#08i4t5)wdWZhaP%_TXOp$5n9p6h_~t_{ZqLX&PZ>-KOg!b`L#uB7+qHcDZ4wY` z{x&b}NJTkC@hfA-3=d6EFs3QH`VrA`w9&d3kg~$gisO|lRs9QPZMB_Mdi9ZPRrN$T zcoukoEUoaXkO}-*t5lry@{I>ZcGKK?`kccktLA3cu5OKj2eCFECqU@n=^qeLA zuThzYK|rIN8hijCqm}VX>;kG5*4UPaiVAPtb5zT%f1}u9&;Yp(TV{8l>}D(r1K04;FCchpaim5)H;-UzOO743;Qg& z^UIrjWw*DV^VB=b1GVR&`Vip`|3CiYcmOP-I>pqtAxG$#^FlIwiv|Fab&~BPA}Tnp zB)0{30o0~W0st(8IOs?KfOPdzLL31;EMb80QKMXZq8KE6n0eK3g=kpK7rSm;@~wl< z$u|1V)$4)+C>T_6oX6Zk*F?s1;D1s9lEuK$K{32c^02bO5#v zsgveAV)=qqmg4|G7dFvybr@1{_>nBH^aBDa@l^p8WS!iL3vWJnVwCB7tEqF(pj~#I zOKwMwCqR7?B3>TdXnEIbnIMwG6aYxo0{9y*-|uwhlY5d+`x#PTW3bK)l!$25U5$!ZVE5DZ zS6vsu;cuO}98%SRZ+f4=uJ2iJ$;)r{9^V^ZZ4 z7s2cYf2ed+D-}u?Za=W))xW##17wcseAZ_Q>~hXe-%+X9vu(%Old9n5i&#sTwaLZ9 z#czoBAv+`+L}Va?W0r04@-0o_n$x5?IT{rMzyZE0<0t%nePHurd+j=_XAbb5hcMN} zla$*)ZxWpfM|*;R)T&`Qcf#LpK4h7G*SMo+eV}3&9;w;6?Gbp%Nk_bALSTgjNpOVP zJ=rksa1?R<0#BEOV}Zh=#dNKrS3+o@E#}z&cs^MJ_ay)@D78YeYE^SyqbsRB8A38)`+M)9F`#`jOGgT;NvuzFl=>6m8>&O@%gF(bvZkhivKK?A&3fE84H-uu(}6FF zwq=Jw0*}F`^XjrK{31mIWE9Eqmz@E2x10OGt8*v)(SW>}FUhJ^GreH!2b4=MoIFtVTO(U+Fb|) zIBsDM1?PN%P;Chj?-mtNfJuNif-=%btbj&`G3HQZHVptUR-@SeF|5o!*62^%Jz)Tl zCLrRzPXhotFp4Xrso?_@!9|8j>9BB76m+giEJ$gVlzc)x&I`Hk53_UUF8bbQ2IWMs zvGe0l&JT4mmUL}@46Wi-B+y4QUvVI;GIi5W5(&@RGInTb{5Mo{3cCRGdmHu2r2^uWE~?Apicix#}Fx_0Dx)rMR|_^^>%&ItUYWU zMa_h~v&^lPk6(V@@ej1?-Qnj9Ish0ub>2?7TKQMBZrhVzm`^iNQL#xAG(C|;DTe6h z#sL8H^Q6Z>61X9rKKrWI=1e<(uoi1WeJ+83chH`_ih2hel+PEsut&iPFnw#K@0me8 z7Yi4W(i>0mc@jwwwR+9KO_3mG8{Sknhp+RWR=8jg%zm^tV9-R`X^tAE6zK$D+tk4f zy#qiCsxhD>-)-Hw!g(DKumS7{>Lj@RinY@$+r5rfbxflGhBEUq1(Nv5l-CA>D&f<7 zz^Cm4-wYD8Hy=M6nEw?|%l_7}Kq`+P&x3^wMaE!7<{(OT8G>r$Dx*3YwQ_|l0Vwk; z2LT>~Z~G=%Dnes#AMF}th~cgCfazOwA<-F z+O^-V9O*j6%W&*Lc}qF{s7-+%VEV!amaVM*1XXbwVhwMvwCkfOYz_cq_$k07=6jw! z%RD~si;|~6SpWc}3R34u`h(zqb!tR2Euk1rLQhlp)8QQuumS9mdGiY6{%f;?NkBXd z9mXBSRPZ0dq7Wn-^$A!wnI%0w({_X`v(J!m8+a`1W%V1qpW@!1mLiv^j1`~PXQ^BO z+F~q0emH6&y9i)df+{IMFjuKm*frocrJJ}Q{NqX6$4UCfvtFuYqF;Cw59H1|?PBGH z-rFcPhXX)i&YQERPR_E%S+8wQK4yFi)oVVVMA?;+2X1yI^DhP>?XwQFSpX1c>WO0} zW=IsR;EIjz8mbL+{#$d788n|wM$)fem-qA($FF?vyPaC`_hb#=0C=>Cg8GvaG5tiF zSlW3CpZG(toasLVqP}@}cj*EgY(jWl9ry*oLQ#M7> z`m<9mAF<@NL;u!}S$Cc>s1&f?e)f;wTQ29B_j$cZ@k?p+#&Ww279*tJ7nNE>OG260x7@N-x$0VD+g zn#43j9W~?E5QvAkfer+vg7q3{mJctPHFZ(ixLf%?t6pvDU9bXdHHqB7^tTS^h<^}P z)y({wG#GwDtobR%1;EW(vb|djQbb1dn|5$ov#)>mZi~--uBS(AQk_o&1$H|1@sClp zyZb3kYJ0tB*bu7Ac!p8}^#j&N0AM1J6E{50H0Y0x)EGW#0T5BPgbor^z0+CLfi6%S z2&iRQ!QCl;M!o4zdv%+?{yEpvlPN)>! zE%<;Pc0U6AUB%o>ug{t?fyR_gA!Q*vQ*Veq+fKUY zrmCAeg%_e>O1@vnQ715}M54toZZg&4V*s)O0QhYAq>2h}IK#R2AG<7T>f$*w{xU?Q z-5_5x?&Jp!plHC`$cMKRN4cZQBIgQ90UY^wmLJKJ_i?O$f!oc+EI6V$D2W$SJOROV zV)G`1mqqHn%F*E*0nDxuR0otcDI6Q2D4{E-aV-t{Wwn9^G*ta8mwS#X51#SXErOUu}j~BmWNCA2lc!4|4TD42x zoHPAm!#kV4%$O!kzd_x&!=!t5?9W+?AkP{K0VU*WM=_asU`gYs`CdeoMs1oVa>lvL zD?mH}0PY6HCaC;p-<$o+s)3J}DL~hd_9&6!r#cJ# zJu(PL?ESU7kUw?F_rCP>#?Chz!~7T(ir7^>ZqoI0@*48haubn1OjRVj=3iQ!-VWEWdC^dalkZpEDJsS z771^!7u<<&D~Ac!m9-!;bCVbS*nr+7oFi@rYH5BJb6r#xK4LC7YP9^xrDJ3wu5 zT`)*cyqLfnge3i<*#M_VS`0Y=P|*&=msC5B0DzQ7<*ISY0>EvBm30gxKnr2eqev;0 z4wc$w3qn4(+Nutm{OTQ3XRl9d+!;$W1$wCbCf{yD)q0Nhove!32-UJU?n^71DKNu@;y12)7|B8kUZ1*43Zt z<{y^ivK>@Cq`K)PE8{j2P!*d@)E0hsM6`V;?3LjW6OV%7sGmE6Q{7?R_InoHJ^lHi zSi}we9Xp@+!*|m8_hBlUvKv}0kFr^5_d|2M8fOaNj~P-QXqI@Jui z#2secZPHJDL+70hef+ze^x)29|G9yp01l+N3}^mkK36kq;5P&eY8)K2hMCY}{RRLs z1KAagy+Qa(n!A|RwZ`CIko*PB&_D<7G3q@+!Ng=?;h)GlxEzLLU%LxE{$+c_uBTBJD7$aCeN22O$H0+4Fr;f-Q(6d+y*nGoW zL_(UFky;-=^TwR%`(~xlrh5G@r#$pQ3ZcBC>R9jQYF`u>1t#HuX;ys7C(gf>wQZ6%>}aTHxlgd@nc*ks-$y4dB{ zx(m5$U%vII>sy+5=jI`y!0x9#K7MV@KARN5S8Ti1#hEd@s6mJ-r(FqDmiUpz;qi$# z>4dLtii&to3W75sL>AtUe3wEt{@oBaADM>Yd^O)XIn*4H7Kr))F8$4tIR>BC3l1rY zH-_Dr7Xqs52~JZ)`*<|Mqc|U%ls)z)8bndRFZvhesBvTMY08xmIj4 zd&`RYPxbylAn=Pc8bUO^q|-^RaI+s%p=NrW={S-jlEr7N1&6M!L2eX^D?=e66i4Y> zJ*;T`@#XJN-fOTUiB0F!xh|dpJDu>Ov6RhmD1p~oD~@ex*N#9sxPM?0N4yc5NRv`g zzxT_yG#<<<4fSZ_c27HF6Pg{HmIh(UYI%%!00hf&CBe-4z@vakaCngZG6Fk~WH5qs zr0ij-b1AKtoBePRGy(;P@qo!#9d^ilJo(N0C(TttZqT<(D|ByaaN8XDgKNo9emdNn z+BECsZR*N!+VTs+;B@T?`G$p#%>rlw0E8lO%_pc8lUOPo>g0ygU?Erj#cOkq{zOLr zn^O`o0pm~o@yc?gHX5-NWHBP8hS&hmn3TFk{+t@5g5`8f2Qo2`Q(rgvLtvVQ?lg`u zO`!Vk$a1YYHG)^lc~JkqFEt8u0H7woQ&Yg83snTmeL4F3*{)$*9rVJtKV5G2y`B4p zjsm-${P0l~*SeitrNaw2iXy0u0RUW!V$mwNI8_1~2j!v(4>l$6(_#kvrtcO=)zsKx zG-X}-lY*_0E1*U|0A-ldgA1c3U~T~j-)(c}JF;Oi0D$lk3xKv>T8M|EJ?n6p;{syj zroJ_I($8BUW2Rf1rFo{8_%Gh(h&$d($x9ECo}?T{&B9=GIr+;+2{&zvNdN$`0|C=! zogEe^<6*HrM4AiFfFD7vT(Rg@^(CuR-RF(j$G+4w!8XAg$DjS|+iC*?4^fTp50E>c zXgkQ079dC^1jW?Ogje1@asxmC!na148~FsHDz!@{Gb0GmO$2Iqd78N=X^F!utl3k$ ztHc}(1%V?30VO_3NK+w;vIUC#du!gXV&Rm3-EzpAn;<)FSW`Z1USa&U!#_(Q#or>- zyAzayc94p+Br6XGgoK;tG{>)T#Aznps@=SAx^Phe*4_ zZ*&J_85MyvEE!w2sct8m`(@pI9P5VIv0UM%x8_bg)$|SRxGt-TZ26ry;caom z>}QD*pQL<15!P72y6In|EiJ$mmJ7uI7=;8d21uV`TKP(oNsBpFqPGPAP=vNcjjJvD zn%C|<`a+XubguCzfYQNh2b`;kT|P$}ri5Dga^4Z6s5Z%osb69QB=Z-hKKUMqTbtH& zB2e04#v4Iae}40zA-wKM9P3#CaF+xQVUBDj25odPCD=;3~Bc0cs_ zo;@lZK3mTz(9@IO{*CwSP1!JWh_koRwIC!cR`-NZX>Yz0OS=?sGs<66G(J|UefuN4 zdhq}NCw@5xA{bB?3Bq9lpN6ao4_&jIX^o!n_sizwcHi|_B~}w^w@OTaje=ge;u;z& zRgoRM&VNx{pROGTVXq)1uxvYvsO16i8cZN)f&#G(L5_wG68Oia6A-X2?tS7p!^qPZ zy0wL7R$|kf4l?0NZt%yVk9*F!KiBUbyY$gx)(iqEH|j_3aMBOAEI5U`D^BiUs(V{M z*@|CZ=q~Pk*wk}7rj$E#f+^IM)5E$mUfmSqy3dI7{$P%El0%8F`bHfPTC0Yxepe3G7 zf|*%b;b(Sf!o`h@00Joa;-B)}m5(p|!O-dnvz2WNLA-~+3b5@FcfCagOtu69Dv;nJ zS1+Y^ zchX&LCgUdYIPl7jCoZ^!A^|4RmKp(Cqu3JiM|d+S6SxoqKtQoHM-VE`F+cVznl=Lf zOvPkt%N7IxS_yFGsoE#njV5Md{6Es7T&fjdQTaeBk@|ctKkVb3CPJ;P!%*G5+nEct zTHELRm5j(+krJ_LC^W`qWyzZIN!85p%UR}Nnl<28s%h4MEbouHHVJTO<*&gF|6Pv< zAP}IkC3s%-!egzD$h+U~IuHO5{Eo-NdP@L8p-_72joC-;-@Xx;J!zc)01WMIhkk!A zr&xT}M*bs5d(#OIX@Rf^umu3o%p%Ywsyq5brl%R_5=cA!*Y8(I(Tr^BDqdI-y{P7< zgB9yK2o@j!gM9vuQN`jJFU*;|I@9wz7c&L+y!E%G*Z%nW@wV%pNjqj|-ZvcVh6P~! ztZIBqN}WWIc>I!G{|mn{@0bQSwUB8Lwag~jEmHUdOr~bc6UDq`TkHH|uCPr1<|a#M zT$Rs1vsuA8?jPU#5}htPpY@#r<4=6(ebf^7`kLc>)GFq?xvM(w0X1?{9!;32UzwW9 z%p|%+Juk`9VEU|9)`~4ClonX4qF;b&8Wa>2%{@LsHL=x!1r_Hdv7S(?Cgpw+kcc2> z1dY?_ci6DuJ1?1a_@d?p(EMHN3;^sk{mxRqtW6PRHs9n_yt|U{KHNR{O1-+rFSfzJL#XzFV&`f=Z=TX z8=f0m_@ZkSuck8JJD^gSoYRR{fD_S5n3b^9(w23Bax{wrNu%yynKxqznUDg-=cJm?2{y%$P0w7sgom+RQs$OQ_ zcV^Itk;Itr5|^j}H#R|0hD{lU8D>~S5e0c}agrc$!-dsBV33_@b`_0FB#FMn=MtaM zBpQ&}85U(xnC_~&Rqy-G`Twe0Rk!NiTV37LJyRFk>8`rVfB*md=X__6d-vY=dw&KP z6EiaM+=l_*))X08CiO9z+4oq`saRP@32^N_x|uqdW>u;hH{PR+tN;Q51__4euu*HT z-d`9^dj&K+7JZg-e#!<~iNgx4aa3w%2hPbkl_wv)^&NB5yid2z-D?1V6uj`{>)%!? zSMIEUpcw~HAtE9GU?g{0q9WlNv3cCd7eGK=2XEF108kiig0bYe1^|%Z8ebh#*wDK5 zUmv@D&8xb#aQowZ4&Crwf5)Sb9~o4#cNZ(ZA8>xTxuie12L4gVNhG|WZ<>}87TSrK z&{zg2SRjIKSTyyTuxPYg$o0m8)^146@dU;iDIGgC&z~7ge3k^hV_%}w z88>KUU?BIxZP)J|Yg`9nvV)aramm7yHoc})E`7ss`~enu;iS+XKt}EX05HN^@+bvS zO-ukFOxoz85)VM^XAq#oqEY)I>O_ghsrlmKtv8?fX!mAt|Gd)+*4%Pf$?dzg;A9VE z17?6LD75f#ix4zHqaoDYEg~Narqyl*RkN=@tlv=Mh(iZXRtty$BFrroXR-O4;({87 z;b;g`g)smuDC<9(_51z;bpm$mpVTzD-kLEn2cCWB#l?(w7O>o`uy7sgH&LLW6vZRy zv%>%-={0HJB?>Hu0f3BJ;wH!=z>i@8D8drJu7OrXh}z#GxFc;XI>J^w!CDsBC00QQ ziviIV%$ng=unCq$lpkx67{WoczVzj_0?W^UYrNbCT;21&>Q;%*AYN1?cfieg`)!WjNQF!3V z&1W5*<~4ffM$f>CcYW;uv{JnhTllrew2+#AQs@JVASpZ$hy-L7oW;$f0s4lybz)jo zheWzV;bYWcwV5XRHDFje2?~wZTmp(eLj{72`s134n(Venkj?WvXhC!vNS3*m{YfU1 zU9)rJG5;^!_^N#=0M-c${w^h0y?Xt{@7jT^n$PAC^NzL^VZ+< z0-ScE>v^w|u7M^iN)2rq94JLLOlPqgD!1T3!vqM}Xtfb{g0bT0V(NlM0mf!`QFj4= zC8cHnYoBArCWK}q|HZy(X0Cb%GY?uYh#};vE!BjDdMwNT;X2-N+pjt9;RI9PJ7q7= z!1C4K?F;fx9S#V0Ggf^{nL*QBSAt;jO50~eEMat!8U8ei%9zzxHp*4Er=WcxV#NNE zSBk6jVp4^xJl|L^sGz|Gz$$@dSOF9ibnlJquwB#<){N}; zaVFf>`dGV3O~&|5jyO`Y%R^7zwf@9(%hWr&)eKM@8p%(41p8@$=0~yU4JfIEdN&LV z%%X>YblRegK*2sYCHqW>Nf4V-E31)dqHcp&oET)qPpn|AfdC3*6`+kHN=66uSEZ*o z8EJ}O6~3ba(dMnrcah?y^JTn06;&l-(Q-cqd>NkLqHO)wH*V+&D`0oqUDmA z>5>NAW_;`~&OOVNaWz=p9JK)c?(rc1H<_UmM%S&ZlL;`_jGh`s@o;`^dlwj9Jfn6ID&`2}{*fu!Ib6w_0y>n{b{rWGiI^p*{0-N|Vz?QB1X+Ui&tDTLaA` zxfmb-;KZ@}6rsPJWCMV0stT7Gf@Zs{5bm(bRsgsHfhkJSS9 z8U}7?NUc#VtN}^cqTE`MdEIF0uJ24iZn~dDW!FAcdm*avn`S}bfoD5H+IKARxk$5MyGBW5Tt_SqddH-4*u*zyu5(AIo9 z{s5qH4&qa_6iOS9hq7M0E3|&Ch9(Ql$m?%@EoxVIMG#``o%kq%Ast@(22@o{yz{f3v@tOVf< z48}tsU;qn1nE`?3Fu6oJPpv>sn+X!dLimdIDls$8yJ6nlO4bR6c5Pm}*ImIA0swGw z=AXFf703kqS7EclY)y~k>Vm|PWBvCkYiq9;=l`!?pycp1vEL|kqQiEcpViuL#0@_e~;l9z=+6q3w?ML<(DsROZqkj4ID_!l3YJ*0nFgEmtC%vR2* z+4GXUTKy(S&ctOfZ3RUmr?tC@pTi&R z_?5?oPKAU@O0o%GzjvC%1S~uA&Z|c&(2@Sl z^Sw1&uRZC%dgL|nXW)hJejxvRq3~X;>ASIhi`5iOX2tcVMyf}9cc>b!<-AVGwCz-d z`MH|Tqth0X@_n-_L#Ic^0ff-A1Oc0!%+kDtVWi@Vo1hy2z+~A-VKVX?bpuGYQO5oL z6GNxHdLmHLm@I9lFE;n28{QR^y(?T+D?_d%2^OVajnOuVA1G`pYOP&0j?WT`MwBKa zxK^8|W!(WI=lQ)fIl{Xk-0@StxpVbJoz7S9y4Evr$oh@h?e45K*w7!q)E`Kp=A&jX zg9FvNPk%UTO^Dbt=v<40#P^ z`o-gWZmY3ez%JdJAYf#;cwD&>Tngd8NU*N?X(#-xI#TCO>bjJu-z(yF;OK-XJ2&^I zojMBu6y-1$U_@L26azIIVcNUa&R47fJ}=EU7>9vu0DP8p-4|}ZWA%hcx9$4Uc0OI1 z%$yUy{37@w9|RL#NLoPi7ic7?mL$lj6#y7L!6b7J)ZQ%a{6-KU=bN2HpA#dlN$?}E zJ^$v;HQAmOU^Gp08?e-p(MwvC=#ApZB*kLhwjg`yFSlQRaxXA& zREs!17ay|zN7>(0wjVrPaeu;kbRLS5IZP8YT;K9B6@)EBfk}G}k2nrID$%ss3*)p; zT1~M*LUk?xL*Sli^N#U% z@8FDuZ@=y=c&@I3@JBkUmM$f7YHcZ>cmTk@cAYjxvr;vOoPk$PrT}CJMEH-p?_B@- z4yLMiNx~VROJM%GyLZ9gy@390)W8S2ENFK;3HL+FsqiZ@LKYY1(SB<*0RSKc#f zVYQ`H4~YN(5ez!a*d_l4!lH=x@jb+>5IkXaz{D!EX69%8^z+BTgowfbo8y4oqXM^_Y^Z< z0xNwniA{}-#FSN=htnV`fyYM05nU3%6{gQ{o@|HYfY~@;22UHLBP^8 z@BP+DF?hYy=BN|}m#f(k06;z@b2I=z(gthWqkW_X&uy*Qv<~PSy~Q9I;D~TpuwopU zR4Wc3F#(9gVJrZCW4r4t8G8xy=D9oloO9f-zjV?M$8gDdx9;K$ELwZtpJtrmO^6FP zIO?`(06-HjY@{LC3atohZ25S2Y*CIn_GJn0x^T7+=YSRf0swZ+v;pZF5tvR?$}{Nc z6)>c6N7zYUoRZI8G?CiEr+cd|5@fqu%{k%AH^Kb)PWoefpTSz3#As$2$pF*F)d^s= z!XVvCwu=R*`z{m%AZb=KGkMY%x&Wm4H&5KT?viv*?wy@>23~OL-ShTjD_4}9U}YH* z7@nB9Y3zfBE9QJKCv>A!7ST}rr>(5EroP&Uk_qOtZ=mO=-?UQd$AFZoH%bkZrguQS z(pI$*OGzZsaaKSR(<)Ki1omV!VEQF0DxSUL+LIsb>@9j%jq40-*x)YP@sd9+RWjFs zl>fv&Tm0`4w4IoKK`Kp`N2bi$vs&=+@MN@$!VR6*8gfS$j;r!xWBt&*R2vWHfl3(x zKn3oAuxq59+at>5%QzxFMta$?3m_W*;D+zoedlRcjqAF{JS;sg8Hdr&JNef6<t&dwE!?UCtEF*%j^@)m#*hDvQccKoraRC64NP4LbB}?8K{@= zrJ}T&xJxyMrZ%>^<|(1(K{f5j7)HT}a~}F}0EnyEm~EE;B?w?)LBPL{BGvMZ+rD)C zFXG0~`+j1~zya&;T39L-e-7*FETIXJqA8TCh}US&-ixZ4(N0|JP1Bb3O$z|{j2e%w zWxd!}(l8zZT&)hMfv~!7;zUDa4GyV5%5vM%*XI5KC%@{~Lnk~lF(|>z`9vCw9ShC1 z^NzpnXW%h^M5ZGp8i~%Ti=o9@)Ms10D)hb7zG~3nYHw-_LDcd1hE32Y%=H=}h3aM1 z&qM;GFl|Zd6~&JYY~)t-&Uoyl+c)j4u22(^4#sLsq^~7wZ~3>N;v9m|D9={w@*(WX z=n&>2FaxDQq(^{mf7B7sgkkwhf;b5rOsQ44_ta<71GAzT5x^owAnQ5>-^;(~k?Y>Rb*$E_ci-;L0O^0(8MkeN`muywNXC0e8Yp6} zBt;hME3pDn=*L!7jT%F%ni%cI8_g$WpC#1%M>iYwdye~7`(%*6GZmN`dnHpG9uWY5 zYJIfQR(Du?kRRTOI&(66L+&VAb#kI#6yp-R~X zWT;P;nE{&5s^*(80N^J|UKIb-P+}j`G8Z<9k6-RCOrK9n4geG%E2ycs3Ie$CT)%SQ zV?*m6i63?EjBd=p(lc(mwpjMwftBmCI>D^=OXJGj`n->)J1e+n{UqivGPAqA=Cj3*BE9)ML98RaOGlEZ==SMw8Toef{ zYsqFUw1cW!j|yB30B}o|P!vd9(8ft1yFGRs4FU&ygl~)V<41PgzWN0dG21JFh)g!E zV{z83xzW@Lr07*naRE<(> zqJ_VuwRVD%T6W_RrrWgintt9I_gwAiA~Q^uO;9XJr$A}19J9Bh#$W-tWPVi&pV@Wi zSr?`s>)2m0p#i{xw_kHGQsw@G7FL>9tEL*M*KSRpmOw*h8v0yJALg`EI2r`jMbWnO?2`7hh(LAvmj3qcbvx3IyLWzPGr(NwCkqds3aI~?kwRgniopiRDSnaGo+9#b1}&z-9Q7w$Pr!~O?CT#50H|Y-W;{`E+YLsV!~&oIfTm*lIF-g3 zJmt9VbJ=|Un61~m{kxs5M(?Weo`HitaNpGDf3xSi$bCNqmK*`Uk_9j2Az3twysDdG z!lWUFUNp|#6t8)wnYGpcK<{F#A$acqRshxpAlNm!TJ1qGK>?gGUWVILRyb1z|8?ku zJ!wWcUgvgmWxGD+7o2+Iyl0-<^JA>Z5(@xy`Dy@wQOUxTnch*27z8V{+&kr{IspK! zuZaQx#xq0{vj6}+=ye9kVXx)?d-~!%FMH_n_n?w(?-;KcSbXY@t1H>;#{u{k(F7?gn`Lj-OvBYVYsubBf?OMqGOD5ljMD5R0Xafj8nNM~|;b5SGRHCh1b zgn5exwWIe|767)K6@gF9ND9kfwrCN+;K=Z@Uino!Z+Pdw#l2VW`-w3Fj0sq=_T~o= z(eWCTVjmPtXX#RH-(4JNJphOk{_P&z888R~fL3k{t%6xZAYgzW)&ppo0^Nv_!;`y; z>jJ-c-eoZVpV!3+?CPz$xw2gynA{AhE3km(kRGP!s7-U9wg$9^Oz6glT|1APf&fRs_y4$)xp}jk{n}H=~3>}Kj zV1I*!c&&t-3INdbKoS1(Lz6!|g8%_)g<>-y1pwM|xJGpG3@Vumpq&LEOoN?-WVM=) zYHQPo6Zl>h0MKm8-!$gS^_ zIs^6%Qsw@PPVJoMFOLEmLe9!v!u43|TtRv)zA;~2Eb1wN3V?JPuc%umXKfPkF4Wg+ zWm1>2O5#%s!lyGD*6KgG#`*p&BPu<|p#uZ7wo?{&E@R5eEEb+!CbDncB79JdCFSZS zRs}P?tjN>7$W+*^TnPv=*rGKH%K}?sKGVAb7qkg37IGo>%0JrM(NFKgejB(vgsZeZ zIyI;X{A&F}nm5osk@(l}_#*i~1y*nWqKz92=7QXg#ZR)j5jkR=FfWN2Af%S5* zP=M0&qRUxs4w$|Ac8ed|1oK6_O6Z15*Pfd||3Aw88TBj{%4#^e?)8A|8=mn?A6k_^ zndq{;^CJ()R7gw;WOFi*FmWgueu~|2^l=hBPELOz9+2-@~;CL{eCFKzTdH@VQ)X*2t zF0bpA$gPW{>HJI?tY85z%W_MBRS=jvkO-@(T{8hiUUqAOvFUl_x9iw1QEeZh7da3R z3CS!G81|Gu>pSpfMsLDVj#FVo9>C?Yb3S3irMO3t{RjZ{&4(#dZ`v~>$bo2I$A#(Q zM+&WE9t|goF$|2nYGK}ShEnFx^aN&(`*zNiDVRU~=tLYc6Ruz$%)O@ij2@qG#%*g< z5=UqoLc2siR|auujVtK;B~DvbY}GdjeWytp?w+XVjfUgaf~oV&W)BPSt&qc6rcmg# zPievcN6_RfZiGl^#POoldY*AHRPl~NIf0Y!eAYLI-0&vk!OUyAMKE(AsKQoeT!Nz-N0jU2=_JO+~Y|mGJ&os6F&Ho`k2coN0~U5&y7?M9+J$S(qpgdID^34vU~HD__!? zg;?dMLd-#cDZS+_H;!?D7`gI3jZ|ZrtP9E+{>MllCo(~}@@T7_s(}~_xd{*l{_rDT zymOn(O|CdCJ^#61-J$TkEC2x!zgM`6cQA-7hB4_hN|~DOliZ-h8`2yh;Z%aDD`kGZ4oC8ggBah;BUZG=CH9`%J!IFHz(NcrG?+Ma?%nD- zK(}U+XA1NqP3oX)Y}2`fF+uBnq}U_eEMtdp=Mn%Ys6?~93CgrU2~l%el`V(uvpidY zVRTJ0joN3Fei<Fk~N2V)m@8l(u|5ZL$mqq@0 zgCHmAzds0xamtjIRV`vCkeHi*a*;VRK|n7`A$dgNS*+6Z$Ib5gJL5C;bhSy9{N@8C ztMKQEvf_|$1fc*6I)6hxq^6RX5|l|_NGj`aq!g@KC|c-bM3bqLTXw^XMW0`pMD(qr z;>WK#9c?}<0ifp3Zy-zqvJ+bu?nY>uiG|)$PcGkH;dsbxz4p*He0?9)KCx8kD8DCpS7qu%ar|Z0?SS2q{qmdN0Kz@thSSP z7ys1LPZ~FB0f}DVZ9gIc^8wNlJ?Km8<5vO#KP-6Cw;3cj6sk)wZb-p^@)1SwXT8%d zTz|s%s=(3cYdf(sFlPh0f;MjXL;ZuDCTz|^y&bNRJg_V(#p$R-=HBpK=HH03Qmf-b zWw|}hiO11K7av=V>BPQbV$gM{iDQ)iRB_};

^aCTczsd26xPAoGF@$tk? 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 Xq@mnO;XN~-0PwN5aoo$crbYY*pUcN( literal 0 HcmV?d00001 diff --git a/beta/apple-touch-icon.png b/beta/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0849f4865ca7f2c4ef2fe4c72ad5fa717f92b967 GIT binary patch literal 31149 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 Q!~g&Q07*qoM6N<$f~7hHH~;_u literal 0 HcmV?d00001 diff --git a/beta/compare.html b/beta/compare.html new file mode 100644 index 00000000..3131c674 --- /dev/null +++ b/beta/compare.html @@ -0,0 +1,435 @@ + + + + + + + + Compare SnapRAID + + + + + + + + + + + + + + + + +

+ + +
+

Comparison

+ +
+

+ SnapRAID is one of many RAID-like solutions available for disk arrays. +

+ +

Some well-known alternatives include:

+ +
    +
  • + unRAID + - A commercial solution (only the RAID core is GPL2). It uses a modified Linux XFS filesystem with real-time redundancy. Integrity checksums are not natively supported. +
  • + +
  • + ZFS + - An open-source (GPL-incompatible) filesystem with real-time redundancy and integrity checksums. +
  • +
  • + Btrfs + - An open-source (GPL2) Linux filesystem with real-time redundancy. Since Linux 3.9, it supports RAID5/6 redundancy and integrity checksums. + Issues have been identified, and the official wiki as of 2026 warns: + "There are some implementation and design deficiencies that make it unreliable for some corner cases and the feature should not be used in production, only for evaluation or testing." +
  • +
  • + Storage Spaces + - Microsoft’s solution, integrated into Windows 8 and later. Proprietary, with real-time redundancy but no checksum support. It also has several limitations. +
  • +
+ +
+ +
+

Key Takeaways

+
+
+

Real-time vs Snapshot

+

+ +The primary factor for categorizing storage solutions is when redundancy information is updated. This timing determines whether the system acts as a live mirror or a point-in-time recovery tool. +In real-time solutions, parity is updated immediately during every write operation without user action. While this ensures the array is constantly protected against hardware failure, it does not allow for the restoration of an earlier state, meaning accidental deletions are propagated instantly. +In snapshot solutions, parity is updated only upon an explicit request, similar to a backup. This creates a fixed point in time that allows to recover files that were accidentally deleted or modified since the last sync. +

+
+
+

Integrity & Bitrot

+

+Silent data corruption, or bitrot, is a major threat where storage devices return corrupted data without reporting hardware errors. Unlike traditional disk failures, this bit-level degradation remains invisible until the data is accessed or an array reconstruction is attempted. +A primary factor in categorizing storage solutions is their support for integrity checksums to detect and repair this corruption. Advanced systems use hashing to verify data blocks, allowing them to identify silent changes even if timestamps remain unaltered and use parity data to reconstruct the original, uncorrupted information. +

+
+
+
+ + +
+

Features comparison

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureSnapRAIDUnraidZFSBtrfsStorage Spaces
+ Redundancy Model +
Real-time computes parity in real-time like RAID; snapshot computes parity on request, like backups.
+
SnapshotReal-timeReal-time
Snapshot
Real-time
Snapshot
Real-time
+ Integrity +
Whether data is validated with a checksum, and the default checksum type.
+
Yes
SpookyHash
128-bit
+ No +
+ + +
+
Yes
Fletcher4
256-bit
Yes
CRC32C
32-bit
+ No +
+ + +
+
+ Fix Silent Errors +
Whether silent errors are detected and fixed before propagating to parity.
+
Yes + No +
+ + +
+
+ Yes +
+ + +
+
+ Yes +
+ + +
+
No
Number of Failures +
How many disk failures are supported? 1 for RAID5, 2 for RAID6.
+
1-61-2 + 1-3 +
+ + +
+
1-21-2
+ More disk failures +
If more disks fail than the supported redundancy model, can data on non-failed disks be recovered?
+
YesYesNoNoNo
+ Power/Noise +
How many disks spin when reading a single file?
+
OneOneAllAllAll
Filled Disks +
Can you start with disks that already contain data?
+
YesYesNoNoNo
Add Filled Disks +
Can data disks that already contain data be added later?
+
Yes + No +
+ + +
+
NoNoNo
Operating System +
Which operating systems are supported?
+
Linux, Win, macOS, BSDLinux + Linux, BSD, macOS +
+ + +
+
LinuxWindows
Stable Since +
Year of the first official release supporting at least RAID5 redundancy.
+
201120052005 + Unstable +
+ + +
+
2012
License / Price +
Software license and cost.
+
GPL3 / FreeProprietary / SubscriptionCDDL / FreeGPL2 / FreeProprietary / Windows
Interface +
Which interface is provided? GUI or command line?
+
CLI / GUI / APIGUI / CLI / API + CLI / GUI +
+ + +
+
+ CLI / GUI +
+ + +
+
GUI
+
+ +
+ + +
+
+
+
+
+ + + + + + + diff --git a/beta/dashboard.png b/beta/dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..f6faaa6ad1ad7435f94b94215963da6cd948e8d9 GIT binary patch literal 133005 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 literal 0 HcmV?d00001 diff --git a/beta/design.html b/beta/design.html new file mode 100644 index 00000000..ef4d4421 --- /dev/null +++ b/beta/design.html @@ -0,0 +1,163 @@ + + + + + + + + SnapRAID Design + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+

Design Philosophy

+
+ Simplicity is prerequisite for reliability +
+ + Edsger W. Dijkstra + +
+ + +
+

+ SnapRAID was created following the Unix philosophy: + Write programs that do one thing and do it well. +

+
+ +
+ +
+

Reliability

+

+ The first design principle was reliability. + The result is a simple architecture and an easy to understand implementation. +

+

+ Extensive and automated tests with the runtime checker Valgrind + and with the Google Sanitizers + are done to ensure the correctness of the final application. + The test has a code coverage of over 90%, measured with lcov. +

+

+ SnapRAID is also verified with the + Coverity Scan + and clang static analyzers, + and with the American Fuzzy Lop fuzzy tester. +

+
+ + +
+

Robustness

+

+ The second design principle was robustness. + It supports any kind of problem. Even on kernel panics, power-downs + or any other hard failure at runtime, your redundancy data is in safe hands. +

+

+ It uses all the possible storage techniques to ensure to always keep consistent + redundancy even after critical interruptions. +

+
+ + +
+

Efficiency

+

+ The third design principle was efficiency. + It's a native C application highly optimized to ensure maximum throughput of your disk array. +

+

+ Integrity checks use the highly efficient murmur3 + and SpookyHash hashes at 128 bits. +

+

+ Redundancy computations use a custom RAID library + (based on Linux Kernel RAID) supporting up to six parity levels. + Internal structures use TommyDS. +

+
+
+
+ + + + + + + diff --git a/beta/differences.png b/beta/differences.png new file mode 100644 index 0000000000000000000000000000000000000000..eeda09698977c3afc12115e65e91690dfd3a8f05 GIT binary patch literal 88371 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 z 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 MG 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 z + + + + + + + Download SnapRAID + + + + + + + + + + + + + + + + +

+ + +
+

Download SnapRAID

+ +
+

+ The latest stable release is v12.4 (Released January 2026). +

+

+ See the ChangeLog for the detailed list of changes, + and CheckSums for the SHA256 checksums. +

+

+ SnapRAID is a Free Software + application released with the GPLv3 license. +

+
+ +
+ +
+

SnapRAID CLI

+

The classic command line tool.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
PlatformVersionDownload
Windows (64-bit)12.4snapraid-12.4-windows-x64.zip
Linux (x86_64)12.4snapraid-12.4-linux.tar.gz
Source Code12.4snapraid-12.4.tar.gz
+

+ Old versions are available on GitHub. +

+
+ + +
+

SnapRAID Daemon

+

Includes background service and Web UI.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
PlatformVersionDownload
Linux (Deb/Ubuntu)2.0snapraid-daemon-2.0.deb
Docker Compose2.0docker-compose.yml
Source Code2.0daemon-src-2.0.tar.gz
+

+ Requires SnapRAID CLI v14+ installed. +

+
+
+ + +
+

Support the Project

+

+ If you want to show your appreciation, + you can donate, + or you can star it on GitHub. +

+

+ Donations are used to support SnapRAID development, covering costs such as new hardware, internet services, and AI subscriptions +

+ Donate via PayPal +
+
+ + + + + + + diff --git a/beta/faq.html b/beta/faq.html new file mode 100644 index 00000000..d2981e3a --- /dev/null +++ b/beta/faq.html @@ -0,0 +1,1961 @@ + + + + + + + + SnapRAID FAQ + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + + + +
+

Frequently Asked Questions

+

Common questions about configuration, recovery, and usage.

+ + + + + +
+
+

+General +

+
+

+What is SnapRAID? +

+
+

+SnapRAID is an application that creates a partial backup of your disk array. +If some disks in your array fail, even if they are completely broken, you can recover their contents. +It provides only a partial backup because it does not allow recovery from a failure of the entire array, +but only if the number of failed disks is below a predefined limit. +

+
+
+
+

+How is it different from RAID? +

+
+

+RAID solutions mirror data and propagate changes immediately to the parity data. +In this sense, RAID systems are not backups because they do not allow restoration of an earlier state of the array. +

+

+SnapRAID, however, is more akin to a backup solution, allowing you to restore the state of the last backup. +For example, with SnapRAID, if you accidentally delete a file, you can easily recover it. +

+

+Other advantages over traditional RAID5/6 solutions include: +

+
    +
  • +All your data is hashed to ensure data integrity and prevent silent corruption. +
  • +
  • +If too many disks fail to allow recovery, you lose data only on the failed disks; data on other disks remains safe. +
  • +
  • +If you accidentally delete files on a disk, you can recover them. +
  • +
  • +You can start with already filled disks. +
  • +
  • +Disks can have different sizes. +
  • +
  • +You can add disks at any time. +
  • +
  • +It does not lock in your data. You can stop using SnapRAID at any time without needing to reformat or move data. +
  • +
  • +To access a file, only a single disk needs to spin, saving power and reducing noise. +
  • +
  • +You can have up to six parity levels, compared to one for RAID5 and two for RAID6. +
  • +
+

+RAID has advantages, such as better speed due to data striping. +The best choice depends on your specific use case. +

+
+
+
+

+How is it different from ZFS/Btrfs snapshots and NTFS Shadow Copy? +

+
+

+SnapRAID creates a file-system snapshot conceptually similar to other snapshot solutions. +However, its primary purpose is to recover a disk to its saved state after a complete disk failure. +

+

+SnapRAID is more akin to the RAID-Z/RAID functionality of ZFS/Btrfs. +Compared to them, SnapRAID offers the following advantages: +

+
    +
  • +If too many disks fail to allow recovery, you lose data only on the failed disks; data on other disks remains safe. +
  • +
  • +You can start with already filled disks. +
  • +
  • +You can add disks at any time (not possible with ZFS, but possible with Btrfs). +
  • +
  • +It does not lock in your data. You can stop using SnapRAID at any time without needing to reformat or move data. +
  • +
  • +To access a file, only a single disk needs to spin, saving power and reducing noise. +
  • +
  • +You can have up to six parity levels, compared to three for ZFS RAID-Z and two for Btrfs RAID-5/6. +
  • +
+

+ZFS and Btrfs have advantages, such as being real-time solutions. +The best choice depends on your specific use case. +

+
+
+
+

+How is it different from other backup solutions? +

+
+

+With a typical backup solution, you need as much space as the entire disk array for the backup. +With SnapRAID, you need only one additional parity disk to recover from the most common case of a single disk failure. +Adding more parity disks allows recovery from additional disk failures. +

+

+Note that only a full backup allows recovery from a complete failure of the disk array, +making it the preferred solution if you can afford it. +SnapRAID is a good option when a full backup is not feasible. +

+
+
+
+

+What are the advantages of SnapRAID compared to similar solutions like unRAID, and Windows Storage Spaces? +

+
+

+Visit the + +Compare + +page to see a comparison with other similar solutions. +

+

+A key advantage of SnapRAID is its + +integrity and silent error management + +, which is at the same level as (or better than) +ZFS and Btrfs file systems. In contrast, unRAID and Windows Storage Spaces lack integrity checks. +

+
+
+
+

+How much does it cost? +

+
+

+Nothing. SnapRAID is a + +free software + +application released under the GPLv3 license. +

+
+
+
+

+How can I get support? +

+
+

+Visit the + +Support + +page. +

+
+
+
+

+Does SnapRAID have a GUI? +

+
+

+No, SnapRAID is a command-line application. +However, there is an external GUI called + +Elucidate + +, +and a plugin for + +OpenMediaVault + +. +

+
+
+
+

+Does SnapRAID provide encryption, virtual views/storage pooling, SMART monitoring, or power control? +

+
+

+SnapRAID provides a basic virtual views/storage pooling solution but is also compatible with other pooling solutions. +

+

+For encryption, SMART monitoring, power control, and data recovery, you can use other tools. +Here are some suggestions: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +Linux + +Windows + +Mac OS X +
+Encryption + + + dm-crypt/LUKS + +
+( + + tutorial + +) +
+ + VeraCrypt + + +
+Virtual views/storage pooling + + + mergerfs + +( + + tutorial + +), + + Greyhole + + + + DrivePool ($) + + +
+SMART monitoring + + + smartmontools + +, + + GSmartControl + + + + smartmontools + +, + + GSmartControl + +, + + CrystalDiskInfo + + + + smartmontools + +, + + GSmartControl + +, + + SMARTReporter + +
+Power control + + + hdparm + + + + hdparm + + +
+Data recovery + + + ddrescue + +, + + safecopy + +, + + dd_rescue + + + +
+
+
+
+

+Is SnapRAID suitable for backing up the home/My Documents directory? +

+
+

+No. If you have a limited amount of data that can be easily saved to an external USB drive +or an online backup service, using SnapRAID is unnecessary. +SnapRAID is best suited for backing up a + +very large + +amount of data, +such as many terabytes, where a full backup copy is not feasible. +

+
+
+
+

+Is SnapRAID suitable for backing up the boot OS disk? +

+
+

+No. For the disk used to boot your machine and containing the OS files, +it’s better to use another solution, such as RAID1 or a mirror copy. +SnapRAID requires an operating system to run and cannot recover the OS if it is missing. +

+
+
+
+

+Can SnapRAID hash files without parity computation? +

+
+

+No, SnapRAID cannot be used solely to hash files. Its hashing is designed to work in combination with parity computation +and is not optimized for hashing alone. +

+

+For a list of file verification tools, see: + +Wikipedia: Comparison of file verification software + +. +

+

+For a setup example in Ubuntu 14.04, see + +Zack's SnapRAID tutorial + +. +

+
+
+
+
+

+Setup +

+
+

+Do I need one or more parity disks? +

+
+

+As a rule of thumb, use one parity disk (RAID5) for up to four data disks, +and then add one parity disk for each group of seven data disks, as shown in the table: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Parities + +Data disks +
+1/Single Parity/RAID5 + +2–4 +
+2/Double Parity/RAID6 + +5–14 +
+3/Triple Parity + +15–21 +
+4/Quad Parity + +22–28 +
+5/Penta Parity + +29–35 +
+6/Hexa Parity + +36–42 +
+

+This table accounts for the fact that more parity levels help recover from an unsynced array +and that disk failures may be correlated if all disks are in the same environment. +

+

+Multiple failures can occur. The worst case reported in SnapRAID’s history +is a + +four-disk failure, successfully recovered using four parities + +. +

+

+For more information on parity levels and disk failure rates, see: + +Why RAID 5 stops working in 2009 + +, + +Why RAID 6 stops working in 2019 + +, + +Does RAID 6 stop working in 2019? + +, + +Triple-Parity RAID and Beyond + +, + +How long do disk drives last? + +. +

+
+
+
+

+Which file system is recommended for SnapRAID? +

+
+

+For data disks, consider these suggestions: +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+Data + +Result +
+Any + +OK. You can generally use any file system you prefer, with some exceptions noted below. +
+Btrfs + +OK. Ensure SnapRAID is built with the libblkid library for UUID support. +You will be warned at each run if this is not the case. +Note that multiple Btrfs snapshots are not supported. +
+ZFS + +Partial. UUID support is unavailable, but core SnapRAID functionalities remain usable. +Note that multiple ZFS snapshots are not supported. +
+FAT + +Uncertain. There are + + reports + +of duplicate inode cases. NTFS is significantly faster and recommended instead. +
+ReFS + +No. ReFS uses + + 128-bit inodes + +, +which SnapRAID does not yet support. +
+

+For parity disks, consider these suggestions: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Parity + +Result +
+ext4 + +OK if disks are not larger than 16 TB. The parity is stored in a single large file, and ext4 has a 16 TB file size limit. +
+XFS + +OK +
+Btrfs + +OK. Ensure SnapRAID is built with the libblkid library for UUID support. +You will be warned at each run if this is not the case. +
+JFS + +No. It does not support the + + fallocate() + +command needed to allocate parity files. +It also does not optimally implement the + + posix_fadvise() + +command. +
+NTFS + +OK in Windows. Not supported in Linux, as it does not support the + + fallocate() + +command needed to allocate parity files. +You can use it if the parity disk contains only the parity file. +
+FAT + +No. Files larger than 4 GB cannot be stored. It is also not journaled. Use NTFS instead. +
+HFS+ + +OK +
+

+In Linux, to maximize space for the parity file system, format it with the + +-m 0 -T largefile4 + +options, like: +

+
mkfs.ext4 -m 0 -T largefile4 DEVICE
+

+On an 8 TB disk, this can save about 400 GB. It is also expected to be as fast as, or faster than, the default. +

+
+
+
+

+Which hardware configuration is recommended? +

+
+

+For optimal performance, connect all disks via SATA, not USB. +

+

+See + +Raj's Prototype Builds + +for examples of hardware setups. +

+

+For choosing hard drives, refer to + +Backblaze's What Hard Drive Should I Buy? + +and + +Backblaze's Enterprise Drives: Fact or Fiction? + +. +

+
+
+
+

+Is a multi-core CPU recommended? +

+
+

+No. SnapRAID is typically not CPU-bound; the limiting factor is disk read performance. +A single-core CPU is usually sufficient. +

+

+For example, in my system, I achieve a combined read speed of 400 MiB/s, +but SnapRAID can hash at 12,000 MiB/s on a single core. +

+
+
+
+

+Is a 64-bit operating system recommended? +

+
+

+Yes. SnapRAID performs better on a 64-bit operating system, as it can access more than 4 GiB of memory +and use faster hashing and parity algorithms. +However, for less than 30 TB of data, it performs well on a 32-bit operating system too. +

+
+
+
+

+How much memory does SnapRAID require to run? +

+
+

+Approximately, SnapRAID requires 1 GiB of memory for every 16 TB of data. +

+

+If you have insufficient memory, the recommended solution is to install more memory. +

+

+Alternatively, increase the blocksize option in the configuration file. +Memory usage is inversely proportional to the selected block size. +For example, using "blocksize 512" instead of the default 256 halves memory usage. +However, a larger block size increases wasted space in parity files. +

+

+Running with memory swapped to disk is not recommended, as it significantly slows performance. +

+
+
+
+

+Should I check the SMART attributes of my disks? +

+
+

+Yes. Approximately 20% of disks fail within four years, as +reported by + +Backblaze's How long do disk drives last? + +. +Monitoring SMART attributes can help anticipate failures and prevent data loss. +

+

+If any of the SMART attributes + +Reallocated_Sector_Ct (5) + +, + +Reported_Uncorrect (187) + +, + +Command_Timeout (188) + +, + +Current_Pending_Sector (197) + +, +or + +Offline_Uncorrectable (198) + +are non-zero, replace the disk, as recommended by + +Backblaze's Hard Drive SMART Stats + +. +

+

+See also + +Google's Failure trends in a large disk drive population + +, +which found: +

+
After the first reallocation, drives are
+over 14 times more likely to fail within
+60 days than drives without reallocation
+counts.
+
After the first probational event, drives
+are 16 times more likely to fail within
+60 days than drives with zero probational
+counts.
+
After the first offline reallocation, drives have over
+21 times higher chances of failure within 60 days than
+drives without offline reallocations.
+

+These findings recommend replacing a disk after the first error in the SMART attributes + +Reallocated_Sector_Ct (5) + +, + +Current_Pending_Sector (197) + +, or + +Offline_Uncorrectable (198) + +. +

+
+
+
+

+Is it possible to use SnapRAID in a dual-boot configuration, such as Windows and Linux? +

+
+

+Yes, SnapRAID can be used in a dual-boot configuration, regardless of the OS combination. +

+

+It is recommended to run SnapRAID from only one OS. +While it may work if run from both OSes, this scenario is not thoroughly tested and risks issues +due to different SnapRAID versions, configurations, or content files. +

+
+
+
+
+

+Configuration +

+
+

+What is the SnapRAID 'content' file? +

+
+

+The content file stores the list of all files in your array, including their checksums, timestamps, and other necessary information. +

+

+This file will be approximately a few GiB in size, depending on the array’s size. +For 10 TB of data, the content file will be about 500 MiB. +

+
+
+
+

+What are the SnapRAID 'parity' and 'N-parity' files? +

+
+

+These files store the parity data used for recovery. +

+

+Their size grows to match the largest amount of data stored on any single disk in the array. +

+
+
+
+

+How do I configure SAMBA to share the pool directory? +

+
+

+To configure SAMBA to share the pool directory (e.g., /pool), add the following options to +your /etc/samba/smb.conf: +

+
+# In the global section of smb.conf
+unix extensions = no
+
+# In the share section of smb.conf
+[pool]
+comment = Pool
+path = /pool
+read only = yes
+guest ok = yes
+wide links = yes
+
+
+
+
+

+How can I use more disks than available drive letters in Windows? +

+
+

+Use + +Volume Mount Points + +to mount a disk in a directory without +using a drive letter, similar to Linux. +

+
+
+
+
+

+Use +

+
+

+What are the most important steps to prevent data loss? +

+
+

+To minimize the risk of data loss, follow these steps: +

+
    +
  • +Before running the first "sync", test your RAM with a program +like + +MemTest86 + +. +Faulty RAM is the most common cause of data loss with SnapRAID. +
  • +
  • +Run the "sync" command frequently, from once a day to once a week. +
  • +
  • +Run the "scrub" command weekly. +
  • +
  • +Use + +smartmontools + +or a similar utility +to monitor SMART attributes. +Replace a disk at the first sign of + +Reallocated_Sector_Ct + +, + +Current_Pending_Sector + +, or + +Offline_Uncorrectable + +, +even if it still functions. +
  • +
+
+
+
+

+How can I add a data disk to an existing array? +

+
+

+To add a new data disk to the array, add the new "disk" option in the configuration file, +then run a "sync" command: +

+
+snapraid sync
+
+

+If the disk is empty, the "sync" command will complete immediately. +

+
+
+
+

+How can I remove a data disk from an existing array? +

+
+

+To remove a data disk from the array, follow these steps: +

+
    +
  • +Change the related "disk" option in the configuration file to point to an empty directory. +
  • +
  • +Remove any "content" option pointing to that disk from the configuration file. +
  • +
  • +Run a "sync" command with the "-E, --force-empty" option: +
    +snapraid sync -E
    +
    +The "-E" option allows SnapRAID to proceed even when detecting an empty disk. +
  • +
  • +After the "sync" command completes, remove the "disk" option from the configuration file. +
  • +
+

+The array will then have no reference to the removed disk. +

+
+
+
+

+How can I add or remove a parity disk in an existing array? +

+
+

+To add a new parity level, add the appropriate "N-parity" option in the configuration file, then run the "sync" command +with the "-F, --force-full" option: +

+
+snapraid -F sync
+
+

+The "-F" option instructs SnapRAID to recompute the full parity. +

+

+During this process, your existing parity remains unmodified, ensuring continued protection +(note that this applies only from version 11.0). +

+

+To remove a parity level, remove the highest "N-parity" option from the configuration file and delete the parity file. +

+

+Note that after removing a parity file, it cannot be reused, as it becomes outdated after the next "sync" command. +

+
+
+
+

+How can I verify a single data disk? +

+
+

+The "scrub" command verifies the entire array and cannot be limited to a single data disk. +To verify only one data disk, use the "check" audit command with the disk specified: +

+
+snapraid check -a -d DISK_NAME
+
+

+This command verifies the checksums of all files on the specified disk. +Other data and parity disks are not read or verified. +

+
+
+
+

+How can I replace a data disk? +

+
+

+If the disk is lost, refer to the recovery section in the manual. +Otherwise, copy all files to the new disk, maintaining the same directory structure and names. +

+

+In Linux, use the command: +

+
+cp -av /from_dir/. /to_dir
+
+

+WARNING: If using 'rsync' or 'mc' commands, ensure they are recent versions. +'rsync' must be at least version 3.1.0 (2013), and 'mc' at least version 4.8.19 (2017). +Older versions may not copy sub-second timestamps. +

+

+In Windows, use the command: +

+
+robocopy F:\from_dir T:\to_dir /e /copyall
+
+

+Update the SnapRAID configuration to point to the new mount point, then run a "diff" command to ensure everything is correct: +

+
+snapraid diff
+
+

+If "diff" reports "added" or "removed" files, you may have copied files with a different directory structure. +Correct this until "diff" reports only "equal", "restored", or "copied" files. +

+

+To verify that files were copied correctly, run a "check" audit command on the replaced disk to verify checksums: +

+
+snapraid check -a -d DISK_NAME
+
+

+Finally, run "sync" to update the SnapRAID state. This command will complete almost immediately: +

+
+snapraid sync
+
+
+
+
+

+How can I replace a parity disk? +

+
+

+If the disk is still accessible, ensure the array is synced by running: +

+
+snapraid sync
+
+

+Copy the parity file to the new disk and update the parity location in the configuration file. +

+

+Run "sync" again to make SnapRAID recognize the new disk. This command will complete almost immediately: +

+
+snapraid sync
+
+

+In Linux, a good copy command is + +ddrescue + +. For example: +

+
+ddrescue /OLD_DISK/parity /NEW_DISK/parity /tmp/copy.log
+
+

+This copies the parity file from the old to the new location, continuing despite errors. +To retry problematic sections, repeat the same command. +

+

+A partial parity file is still useful, as it allows recovery using the valid parts. +

+

+If the parity file is partially damaged or lost, use the "fix" command with the -d option to recreate it, targeting only the affected parity: +

+
+snapraid fix -d PARITY_NAME
+
+
+
+
+

+How can I safely move files from one disk to another? +

+
+

+To safely move files between data disks in the array, follow these steps: +

+
    +
  • +Copy the files to the new location. +
  • +
  • +Run a 'diff' command to verify that the copied files are identified as 'copy'. +
  • +
  • +Run a 'sync' command. +
  • +
  • +Delete the files from the original location. +
  • +
  • +Run another 'sync' command. +
  • +
+

+This process ensures that, even if disks fail during the sync process, +you can recover all data. It also verifies that the hashes of moved files match the originals. +

+
+
+
+

+Can I defragment data and parity disks? +

+
+

+Yes, defragmentation does not affect SnapRAID. +

+
+
+
+

+How can I make SnapRAID less resource-intensive for other processes? +

+
+

+In Linux, use the + +ionice + +command with idle priority, like: +

+
+ionice -c 3 snapraid sync
+
+
+
+
+

+How can I upgrade to a newer version of SnapRAID? +

+
+

+To upgrade, replace the old SnapRAID executable with the new one. +The new version will use your existing configuration, content, and parity files. +

+

+Occasionally, the content file format changes, but newer SnapRAID versions can read all older formats. +The content file is updated to the new format the next time it is written, if necessary. +

+

+Downgrading to an older SnapRAID version is generally not possible. +If the old version cannot read the new content file, you will receive an appropriate message. +

+
+
+
+
+

+Recover +

+
+

+How can I undelete a recently deleted file? +

+
+

+Run the "fix" command with a filter for the specified file, like: +

+
+snapraid fix -f my_just_deleted_file
+
+

+To undelete a directory, use: +

+
+snapraid fix -f my_just_deleted_dir/
+
+

+To undelete all missing files, use: +

+
+snapraid fix -m
+
+
+
+
+

+What happens if I add files and a disk fails before updating parity with "sync"? +

+
+

+Files added to the failed disk after the last "sync" command are lost. +All other data is safe and can be recovered. +

+
+
+
+

+What happens if I delete files and a disk fails before updating parity with "sync"? +

+
+

+In the worst case, files deleted or modified on non-failed disks may prevent recovery of an equivalent amount of data on the failed disk. +For example, deleting 10 GB of data may prevent recovery of 10 GB from the failed disk. +The exact data loss depends on how much the deleted and failed data overlap in the parity. +

+

+Using two parity disks significantly improves recovery chances. +

+

+To ensure safety, avoid deleting files directly. Instead, move them to another directory on the same disk, +outside the SnapRAID-checked directory tree. Run the "sync" command, then delete the files. +If a disk fails during the "sync", run the "fix" command, specifying the location of the deleted files: +

+
+snapraid fix -i dir_of_deleted_files
+
+
+
+
+

+What happens if a disk fails during a "sync"? +

+
+

+You can still recover data. In the worst case, you can recover as much data as if the disk failed before the "sync". +If the "sync" process has progressed, SnapRAID uses the partially synced data to recover more. +Using the "autosave" configuration option saves intermediate content files during the sync process, improving recovery. +

+
+
+
+

+What are "data errors" in "sync", and how do I fix them? +

+
+
+Syncing...
+309505: Data error for file d4/data/index.db at position 40960
+WARNING! Unexpected data error in a data disk! The block is now marked as bad!
+Try with 'snapraid -e fix' to recover!
+
+

+Data errors occur when SnapRAID detects that a file’s content has changed without an updated write timestamp. +This should not happen and may indicate a silent disk error or a file system issue, such as an improper shutdown. +

+

+If a data error is found, the "sync" process continues, marking erroneous blocks as bad. +These can be fixed with the "-e fix" command, which typically takes only a few seconds: +

+
+snapraid -e fix
+
+

+If errors occur in multiple files, check for hardware issues. +Test your PC’s memory with a tool like + +MemTest86 + +. +Also, check disk cabling and CPU temperature. +

+

+Another possibility is that a program modified files without updating their timestamps. +In Linux, this is rare, except for memory-mapped files not yet closed. +In Windows, timestamps are guaranteed to update only after closing a file. +See + +MSDN WriteFile() + +: +

+
+When writing to a file, the last write time is not fully updated until
+all handles used for writing have been closed. Therefore, to ensure an
+accurate last write time, close the file handle immediately after writing
+to the file.
+
+

+For memory-mapped files in Windows, the program must manually update the timestamp, +as Windows does not do so automatically. +See + +MSDN CreateFileMapping() + +: +

+
+When modifying a file through a mapped view, the last modification timestamp
+may not be updated automatically. If required, the caller should use SetFileTime
+to set the timestamp.
+
+

+To avoid these issues in Windows, run "sync" when no programs are accessing files in the array. +

+
+
+
+

+How can I store all messages from a check or fix command in a file? +

+
+

+Use the "-l" option to generate a log file: +

+
+snapraid check -l mylog.log
+
+

+These log files can be large, potentially several GB. If too large for your editor, +use + +HxD + +. +

+
+
+
+

+How can I recover the snapraid.conf file? +

+
+

+Use the "-C, --gen-conf" command to generate a template configuration file +compatible with your content file. +Manual adjustments are needed to set disk mount points, but comments in the file provide guidance: +

+
+snapraid -C snapraid.content > snapraid.conf.new
+
+
+
+
+
+

+Tech +

+
+

+If the SnapRAID "check" command reports everything is OK, is it really OK? +

+
+

+Yes. SnapRAID verifies all files with a 128-bit checksum. +If it reports they are correct, they are. +

+
+
+
+

+What integrity checksum does SnapRAID use? +

+
+

+SnapRAID uses + +Murmur3 + +and + +SpookyHash + +128-bit hashes. +Murmur3 is the default on 32-bit platforms, and SpookyHash is the default on 64-bit platforms. +

+
+
+
+

+Why are integrity checksums important? +

+
+

+Integrity checksums detect silent errors when a hard drive returns corrupt data without reporting an error. +

+

+For an introduction to this issue, see: + +Data corruption is worse than you know + +. +

+

+For a detailed analysis, see: + +An Analysis of Data Corruption in the Storage Stack + +: +

+
+A significant number (8% on average) of corruptions
+are detected during RAID reconstruction, creating the
+possibility of data loss. In this case, protection against
+double disk failures is necessary to prevent data loss.
+
+
+
+
+

+How can SnapRAID recover if a disk fails during a 'sync'? +

+
+

+Before starting a sync, SnapRAID saves a special content file describing both the pre- and post-sync states. +This allows SnapRAID to attempt two recovery strategies. +

+

+For each block to recover, it first assumes the parity was correctly computed, as if the "sync" completed successfully. +If this fails, it assumes the parity was not yet updated, ignoring any new files added to the array. +

+

+Using double parity improves recovery when there are overlapping changes in the array. +

+
+
+
+

+Can I access data disks during a 'sync'? +

+
+

+Yes, you can safely read from data disks during a 'sync'. +

+

+You can also write, and if this interferes with the 'sync', +the process continues, skipping the written part. +

+

+This may affect potential recovery, but it is equivalent to writing just after the 'sync' completes. +

+
+
+
+

+Does SnapRAID retry reads or writes if a disk fails? +

+
+

+No, SnapRAID does not retry disk operations. It reports errors and attempts to continue. +After 100 errors, it stops execution. +

+

+In such cases, it’s better to allow manual data recovery before the disk fails completely. +Automatic retries could further damage the disk. +To retry, repeat the command manually. +

+

+You can adjust the 100-error limit using the "-L, --error-limit" option. +

+

+For "fix" and "check" commands, you can resume from the point of interruption using the "-s, --start" option, specifying the block number that caused the error. +

+

+For the "sync" command, the latest state is saved before termination, so restarting it will continue from where it stopped. +

+
+
+
+

+What is the snapraid.content.lock file? +

+
+

+This file is used by SnapRAID to check if another instance is running. +It is created where the first content file is stored. +

+
+
+
+

+What does the notice about zero sub-second timestamps mean? +

+
+

+In the 'status' command, you may see: +

+
+You have XXXXX files with zero sub-second timestamp.
+Run the 'touch' command to set it to a non-zero value.
+
+

+This indicates that some files have timestamps rounded to the nearest second, +even though your file system supports sub-second precision. +

+

+While not a problem, this may limit SnapRAID’s ability to detect moved or copied files between disks. +

+

+You can set sub-second timestamps to a random value using the 'touch' command, which does not modify the second part of the timestamp. +

+
+
+
+
+

+Performance +

+
+

+What is the optimal hardware configuration for the best performance? +

+
+

+The most critical factor is using (E)SATA connections for all disks to avoid controller slowdowns. +Avoid USB disks. +

+

+The second factor is using disks with similar performance, as the array’s read/write speed is limited by the slowest disk. +After a sync, SnapRAID displays statistics with wait times for each disk, helping identify bottlenecks. +

+

+Finally, a fast CPU can improve performance with many disks. +Check CPU usage during sync operations to determine if it’s a limiting factor. +

+
+
+
+

+What is the optimal block size for the best performance? +

+
+

+The default block size is typically optimal. +

+

+Increasing it may not improve performance and could reduce it in some cases. +

+
+
+
+

+What is the optimal Linux read-ahead size for the best performance? +

+
+

+The default Linux read-ahead size of 128 KiB is optimal for SnapRAID’s default block size of 256 KiB. +If using a larger block size, set the read-ahead size to at least half the SnapRAID block size. +

+

+For example, with a SnapRAID block size of 512 KiB, configure a read-ahead size of 256 KiB for sdX using: +

+
+echo 256 > /sys/block/sdX/queue/read_ahead_kb
+
+

+For a SnapRAID block size smaller than 256 KiB, use the default read-ahead size. +

+
+
+
+

+How fast are the hash and parity computations? +

+
+

+Murmur3 hash is very fast on 32-bit systems, and SpookyHash is even faster on 64-bit systems. +Parity computation is efficient up to double parity, even without SSE support. +Beyond double parity, a CPU with SSSE3 support is recommended. +For low-end CPUs without SSE, a special, incompatible triple-parity option is available. +See 'z-parity' in the manual for details. +

+

+The following results are from a Intel Core i7-10700 CPU @ 2.90GHz. +Check your values with the -T option: +

+
+root@redstar:/root# snapraid -T
+snapraid v13.0 by Andrea Mazzoleni, http://www.snapraid.it
+Compiler gcc 15.2.0
+CPU GenuineIntel, family 6, model 165, flags sse2 ssse3 crc32 avx2
+Memory is little-endian 64-bit
+Support nanosecond timestamps with futimens()
+
+Speed test using 8 data buffers of 262144 bytes, for a total of 2048 KiB.
+Memory blocks have a displacement of 1792 bytes to improve cache performance.
+The reported values are the aggregate bandwidth of all data blocks in MB/s,
+not counting parity blocks.
+
+Memory write speed using the C memset() function:
+memset   61914
+
+CRC used to check the content file integrity:
+table    1866
+intel   12741
+
+Hash used to check the data blocks integrity:
+     best murmur3 spooky2   metro
+hash spooky2    6285   17813   20684
+
+RAID functions used for computing the parity with 'sync':
+     best    int8   int32   int64    sse2   sse2e   ssse3  ssse3e    avx2   avx2e
+gen1    avx2           24995   46562   62683                           77069
+gen2    avx2            8243   15879   25788   27292                   44907
+genz   avx2e            5509   10588   14485   13920                           25175
+gen3   avx2e    1190                                   13201   14307           27268
+gen4   avx2e     914                                   10061   11006           21328
+gen5   avx2e     746                                    7970    8828           17040
+gen6   avx2e     630                                    6627    7516           14584
+
+RAID functions used for recovering with 'fix':
+     best    int8   ssse3    avx2
+rec1    avx2    1626    3949    4331
+rec2    avx2     709    1738    2231
+rec3    avx2     170     922    1414
+rec4    avx2     110     614     981
+rec5    avx2      79     426     705
+rec6    avx2      58     316     539
+
+
+
+
+
+

+Known Problems +

+
+

+Why does my machine reboot or crash while SnapRAID is running? +

+
+

+SnapRAID pushes the system to extreme conditions, which may expose latent hardware or driver issues, +resulting in a system crash or reboot. +

+

+Although the issue occurs only when SnapRAID is running, it is undoubtedly a hardware or driver problem, +as SnapRAID is a standard user application that cannot crash or reboot the system. +

+

+Check the following: +

    +
  • +Test system memory with + + MemTest86 + +. +
  • +
  • +Verify hard drive cabling. +
  • +
  • +Ensure the power supply can support all hard drives spinning simultaneously. +
  • +
  • +Check that the system temperature is not too high. +
  • +
  • +Update storage-related system drivers. +
  • +
  • +Review system logs or Event Viewer for clues about the issue. +
  • +
+

+
+
+
+

+Why does SnapRAID abort without an error message in Linux? +

+
+

+This is likely due to insufficient free memory, causing the Linux out-of-memory (OOM) killer +to terminate SnapRAID for using too much memory. +Check available memory with: +

+
+free -m
+
+

+If memory is low, install more memory in the machine. +

+
+
+
+

+Why do I get the error 'Failed to grow parity file 'xxx' to size xxx due to lack of space' during 'sync'? +

+
+

+This error indicates that SnapRAID needs to expand the parity file to a size that exceeds the available space on the parity disk. +

+

+Ensure no other data is stored on the parity disk, reserving it exclusively for the parity file. +Alternatively, move files mentioned in the output to another data disk to reduce the required parity size. +

+

+In Linux, you can reformat the parity disk to increase available space using: +

+
+mkfs.ext4 -m 0 -T largefile4 DEVICE
+
+

+The '-T largefile4' and '-m 0' options provide more space for the parity file. +

+
+
+
+

+Why do I get the error 'Internal inode xxx inconsistency...'? +

+
+

+This error occurs when SnapRAID detects two different files using the same inode, +a condition that should theoretically never happen but can occur in specific cases. +

+

+Ensure the mentioned files were not modified while SnapRAID was running. +Renaming, deleting, or recreating files during SnapRAID operation can cause inode reuse, triggering this error. +

+

+If using a FAT file system in Windows, convert to NTFS. +Although inodes (FileIndex) are theoretically + +unique in FAT + +, +this issue has been observed in practice. +

+
+
+
+

+Why do I get the error 'Data change at file...' with .xls files? +

+
+

+Excel modifies .xls files upon opening, even without saving, to store the name of the last user who accessed the file. +This allows it to warn if another user tries to open the file simultaneously. +Excel restores the original timestamp, but SnapRAID detects the modification, reporting a data error: +

+
+Data change at file '/xxx/xxx.xls' at position '0'
+WARNING! Unexpected data modification of a file without parity!
+
+

+To work around this, see + +How to prevent Excel from modifying the file on exit? + +, +or switch to the .xlsx format. +

+
+
+
+

+Why are VeraCrypt containers never saved? +

+
+

+VeraCrypt (a fork of TrueCrypt) has a default option, + +Preserve modification timestamp of file containers + +, +that prevents SnapRAID and other backup programs from detecting changes to file containers. +Disable this option in VeraCrypt. +

+
+
+
+
+ + +
+
+ + + + + + + diff --git a/beta/favicon-16x16.png b/beta/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..afc73828ddfc6df2094a941b6be1cee9454a006c GIT binary patch literal 926 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 literal 0 HcmV?d00001 diff --git a/beta/howitworks.html b/beta/howitworks.html new file mode 100644 index 00000000..ce47c8d6 --- /dev/null +++ b/beta/howitworks.html @@ -0,0 +1,295 @@ + + + + + + + + How SnapRAID Works + + + + + + + + + + + + + + + + +
+ +
+ + +
+

How SnapRAID Works

+ + +
+

Understanding Data Parity

+
+

+ Parity is a mathematical "summary" of data that allows for the reconstruction of lost information without requiring a full 1:1 copy of every file. +

+

+ Traditional mirroring (copying) requires 100% extra space. Parity allows for protection using significantly less overhead by storing a mathematical relationship between files instead. +

+
+ +
+ +
+

The Basic Logic

+

"Filling in the Blanks"

+

Imagine three boxes: two for data (numbers) and one for Parity (the sum of the first two).

+ +
+
+
+
Disk 1
+
10
+
+
+
+
+
Disk 2
+
15
+
+
=
+
+
Parity
+
25
+
+
+
+ +

+ If Disk 1 is destroyed, the system solves the remaining equation: + [?] + 15 = 25. + The system identifies the missing value (10) and restores it to a new disk. +

+
+ + +
+

Single Parity

+

RAID 5 Logic

+

+ The most common form of protection, allowing an array to survive the loss of any single disk. +

+

+ Mechanism: It uses the XOR (Exclusive OR) operation. XOR compares bits across multiple disks to create a "map" that can reverse-engineer any single missing piece of the puzzle. +

+
+

+ Limitation: Single parity can only solve for one unknown variable. If two disks fail simultaneously, the mathematical equation becomes unsolvable (e.g., X + Y = 25 has too many possibilities). +

+
+
+
+ +
+ +
+

Multiple Parity Levels

+

Used to survive multiple simultaneous disk failures by employing more complex mathematical formulas.

+ +
    +
  • + Dual Parity (RAID 6) +

    Survives 2 simultaneous failures.

    +

    Requires two separate equations: an addition-based sum (XOR) and a polynomial-based formula (Reed-Solomon) where disks are treated as coordinates on a geometric curve.

    +
  • +
  • + Triple to Hexa Parity +

    Survives 3 to 6 failures.

    +

    Essential for large arrays (20+ disks) where the statistical risk of multiple failures during a rebuild is higher.

    +
  • +
+
+ + +
+
+

The "Largest Disk" Rule

+

+ The Parity Disk must be at least as large as the largest Data Disk in the array. +

+

+ Reason: Parity is calculated on a "sector-by-sector" basis. To protect the 1,000th gigabyte of a data drive, the parity drive must have a 1,000th gigabyte available to store that specific calculation. Without that space, the data is left unprotected. +

+
+
+
+
+ + +
+

The Role of Integrity Checksums in Data Repair

+ + +
+

The "Silent Error" Problem

+

+ Physical disk failure is obvious: the drive disappears. However, "Silent Corruption" (bit-rot) is invisible. + A single bit flips from a 0 to a 1, but the disk still appears "healthy" to the computer. +

+
+ +
+ + +
+

Why Parity Alone is Not Enough

+

"Parity can fix a hole, but it cannot find a lie."

+ +

Recall our simple math: Disk A (5) + Disk B (3) = Parity (8).

+ +
+

Scenario: Bit-Rot on Disk A

+
+
Original: 5 + 3 = 8 ✓
+
Rotten:  9 + 3 = 12 ✗
+
+ Mismatch! 12 ≠ 8 (Parity) +
+
+
+ +

The system sees a mismatch, but faces a dilemma:

+
    +
  • + ? Is Disk A wrong (the 9)? +
  • +
  • + ? Is Disk B wrong (the 3)? +
  • +
  • + ? Or is the Parity disk itself wrong (the 8)? +
  • +
+ +

+ Without knowing the culprit, parity is useless. If you try to "fix" the array blindly, you might overwrite good data with bad data. +

+
+ + +
+

The Solution: Integrity Checksums

+

"Digital Fingerprints"

+ +

A checksum is a mathematical fingerprint for a specific file or block of data.

+ +
+

The Repair Workflow

+ +
+ +
+
1
+
+
Check Fingerprint A
+
"Does not match." (Culprit Found!)
+
+
+ + +
+
2
+
+
Check Fingerprint B
+
"Matches." (Data is safe.)
+
+
+ + +
+
3
+
+
Check Parity
+
"Matches." (Parity is safe.)
+
+
+
+
+ +

+ Result: We know with 100% certainty that Disk A is the liar. We can now safely use the math (Parity 8 - Disk B 3) to recalculate the original 5 and repair the corruption. +

+
+
+ + +
+

+ "Integrity checksums provide the Identity of the error, while Parity provides the Medicine. You need both to perform a successful surgery on your data." +

+
+
+
+ + + + + + + diff --git a/beta/index.html b/beta/index.html new file mode 100644 index 00000000..832e9243 --- /dev/null +++ b/beta/index.html @@ -0,0 +1,333 @@ + + + + + + + + SnapRAID + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

Intelligent Redundancy
for Your Disk Array

+

+ SnapRAID combines the safety of RAID with the with the convenience of backups. + Now with real-time health monitoring and automation via the new SnapRAID Daemon. +

+ +
+
+ + +
+
+
+
+

What is SnapRAID?

+

+ SnapRAID is a powerful backup and redundancy program designed for disk arrays. It stores parity information (a special type of mathematical backup) that allows you to fully recover all your data even if you experience up to six simultaneous disk failures. +

+

+ It is primarily intended for home media centers and large storage arrays containing files that don't change frequently (like movies, music, and photo archives). It offers the high-end protection of a professional server but with the simplicity and flexibility of a home computer. +

+
+ +
+
+
+
+
+
+
+
Loading state from /db/snapraid.content...
+
Scanning...
+
Initializing...
+
Resizing...
+
Syncing...
+
+
+
+
+
+ + + +
+
+

Why Choose SnapRAID?

+

+ SnapRAID provides a unique approach to data protection that prioritizes safety, flexibility, and energy efficiency. + It is designed to sit on top of your files as a safety net, ensuring your data is protected without requiring complex + changes to your hardware or operating system. +

+ +
+ +
+

The "Safety Net" Philosophy

+

SnapRAID acts as a transparent layer of security that protects your data without ever + taking it hostage. It treats your array as a collection of individual assets, providing a + safety net that is both powerful and precise.

+ +
    +
  • +
    + +
    +
    + Disaster-Proof Recovery +

    The primary goal is total data reconstruction. Should a hard drive fail, SnapRAID uses its parity data to rebuild the entire contents of the lost disk onto a new one. Because it can handle up to six simultaneous failures, it provides a level of resilience that scales with your needs, ensuring that a hardware crash doesn't mean a data catastrophe.

    +
    +
  • +
  • +
    + +
    +
    + Defense Against the Invisible +

    Physical disk failure isn't the only threat; "bit-rot" or silent errors can corrupt files without warning. SnapRAID proactively defends your archive by hashing every file. It doesn't just wait for a disk to die; it constantly verifies that your data is exactly as you left it, identifying and repairing invisible corruption before it can spread.

    +
    +
  • +
+ +
+ + +
+

Maximum Freedom, Minimum Risk

+

SnapRAID is designed for the "real world" of home hardware. Most users don't buy ten identical 20TB drives at once.

+ +
    +
  • +
    + +
    +
    + Grow as you go +

    You can mix a 4TB drive with a 12TB drive and add a new one whenever you find a sale.

    +
    +
  • +
  • +
    + +
    +
    + No Reformatting +

    You can start protecting disks that are already full of your movies and photos without moving them.

    +
    +
  • +
  • +
    + +
    +
    + Zero Lock-in +

    Your data is never trapped. If you decide to stop using SnapRAID, your disks remain standard drives that can be read by any computer.

    +
    +
  • +
+
+
+
+
+ + + + +
+
+
+
+

INTRODUCING THE DAEMON

+

Real-Time Monitoring & Web API

+

+ The new SnapRAID Daemon bridges the gap between raw parity and proactive protection. + Move from a manual terminal workflow to an "always-on" background intelligence. +

+
    +
  • + + Background scrubbing and health checks +
  • +
  • + + Modern Web UI for dashboard and tasks +
  • +
  • + + REST API for 3rd party integration +
  • +
+ See Daemon Features → +
+ +
+ SnapRAID Daemon Dashboard +
+
+
+
+ + +
+
+

Feature Spotlight

+ + +
+

Resilient Recovery

+
+ +
+

Full Recovery

+

Total data reconstruction

+

If your hard disks die, SnapRAID can fully recover all the data from the failed drives, up to the number of parity disks you have assigned (protecting you from up to 6 simultaneous failures).

+
+ +
+

Silent Corruption Protection

+

Total data integrity

+

All your data is hashed to ensure integrity and prevent "bit-rot." If a file suffers from silent corruption, SnapRAID detects it and repairs it using your parity information.

+
+ +
+

Surgical Recovery

+

Undelete and restore

+

If you accidentally delete files on a disk, recovery is possible. SnapRAID can reconstruct missing data and even undelete specific folders without affecting the rest of the array.

+
+ +
+

Fault Isolation

+

Confined data loss

+

When the number of failed disks exceeds the parity count, data loss is confined only to the affected disks. Data on all other healthy disks remains fully accessible and untouched.

+
+
+
+ + +
+

Hardware Freedom

+
+ +
+

Maximum Flexibility

+

Mix, match, and grow

+

Disks can have different sizes and different brands. You can add new disks to the array at any time as your storage needs grow, without the need for complex migrations.

+
+ +
+

Eco-Friendly Efficiency

+

Power-saving by design

+

To access a file, only a single disk needs to spin. This reduces noise, saves power, and extends the lifespan of your hardware compared to traditional RAID systems that spin every disk for every read.

+
+
+
+ + +
+

Data Sovereignty

+
+ +
+

Non-Locking Integration

+

Access your data, your way

+

You can utilize disks already filled with files without the need to reformat them. Access your files as usual, even without the program running. SnapRAID doesn't lock in your data; you can stop using it anytime without moving a single byte.

+
+ +
+

Open Source & Free

+

Transparent, Community-Driven, and Cost-Free

+

SnapRAID is released under the GPLv3 license, ensuring the code remains open for inspection and improvement. There are no licensing fees, no subscriptions, and no hidden "Pro" tiers. You have full ownership of your data protection engine.

+
+
+
+ +
+
+ + + + + + + diff --git a/beta/manual-de.html b/beta/manual-de.html new file mode 100644 index 00000000..e6e15ebd --- /dev/null +++ b/beta/manual-de.html @@ -0,0 +1,2107 @@ + + + + + + + + SnapRAID Manual + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + +
+ +
+ +
+

+Synopsis +

+
+snapraid [-c, --conf CONFIG]
+    [-f, --filter PATTERN] [-d, --filter-disk NAME]
+    [-m, --filter-missing] [-e, --filter-error]
+    [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR]
+    [-p, --plan PERC|bad|new|full]
+    [-o, --older-than DAYS] [-l, --log FILE]
+    [-s, --spin-down-on-error] [-w, --bw-limit RATE]
+    [-Z, --force-zero] [-E, --force-empty]
+    [-U, --force-uuid] [-D, --force-device]
+    [-N, --force-nocopy] [-F, --force-full]
+    [-R, --force-realloc]
+    [-S, --start BLKSTART] [-B, --count BLKCOUNT]
+    [-L, --error-limit NUMBER]
+    [-A, --stats]
+    [-v, --verbose] [-q, --quiet]
+    status|smart|probe|up|down|diff|sync|scrub|fix|check
+    |list|dup|pool|devices|touch|rehash
+
+
+snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT]
+
+
+
+

+Description +

+

SnapRAID ist ein Sicherungsprogramm, das für Festplatten-Arrays +entwickelt wurde und Paritätsinformationen zur Datenwiederherstellung +bei Ausfall von bis zu sechs Festplatten speichert. +

SnapRAID ist hauptsächlich für Home-Media-Center mit großen, +selten geänderten Dateien konzipiert und bietet folgende Funktionen: +

    +
  • +Sie können bereits mit Dateien gefüllte Festplatten verwenden, +ohne sie neu formatieren zu müssen, und wie gewohnt darauf zugreifen. +
  • +
  • +Alle Ihre Daten werden gehasht, um die Datenintegrität zu +gewährleisten und stille Beschädigung (silent corruption) zu verhindern. +
  • +
  • +Wenn die Anzahl der ausgefallenen Festplatten die Paritätsanzahl +überschreitet, beschränkt sich der Datenverlust auf die betroffenen +Festplatten; Daten auf anderen Festplatten bleiben zugänglich. +
  • +
  • +Wenn Sie versehentlich Dateien auf einer Festplatte löschen, +ist eine Wiederherstellung möglich. +
  • +
  • +Festplatten können unterschiedliche Größen haben. +
  • +
  • +Sie können jederzeit Festplatten hinzufügen. +
  • +
  • +SnapRAID sperrt Ihre Daten nicht ein; Sie können die Verwendung +jederzeit beenden, ohne neu formatieren oder Daten verschieben zu müssen. +
  • +
  • +Um auf eine Datei zuzugreifen, muss nur eine einzige Festplatte +drehen (spinnen), was Strom spart und Geräusche reduziert. +
  • +
+

Für weitere Informationen besuchen Sie bitte die offizielle SnapRAID-Website: +

+https://www.snapraid.it/
+
+
+
+

+Limitations +

+

SnapRAID ist ein Hybrid aus einem RAID- und einem Sicherungsprogramm, +das darauf abzielt, die besten Vorteile beider zu kombinieren. +Es hat jedoch einige Einschränkungen, die Sie vor der Verwendung +berücksichtigen sollten. +

Die Haupteinschränkung besteht darin, dass wenn eine Festplatte +ausfällt und Sie in letzter Zeit keine Synchronisierung durchgeführt haben, +Sie möglicherweise nicht vollständig wiederherstellen können. +Genauer gesagt können Sie möglicherweise nicht bis zur Größe der +geänderten oder gelöschten Dateien seit der letzten `sync`-Operation +wiederherstellen. Dies tritt auch dann auf, wenn die geänderten oder +gelöschten Dateien sich nicht auf der ausgefallenen Festplatte befinden. +Aus diesem Grund ist SnapRAID besser für Daten geeignet, die sich +selten ändern. +

Andererseits verhindern neu hinzugefügte Dateien die Wiederherstellung +von bereits vorhandenen Dateien nicht. Sie verlieren nur die +kürzlich hinzugefügten Dateien, wenn diese sich auf der ausgefallenen +Festplatte befinden. +

Weitere Einschränkungen von SnapRAID sind: +

    +
  • +Mit SnapRAID haben Sie immer noch separate Dateisysteme für jede +Festplatte. Mit RAID erhalten Sie ein einziges großes Dateisystem. +
  • +
  • +SnapRAID streift (stripes) keine Daten. +Mit RAID erhalten Sie einen Geschwindigkeitsvorteil durch Striping. +
  • +
  • +SnapRAID unterstützt keine Echtzeit-Wiederherstellung. +Mit RAID müssen Sie die Arbeit nicht unterbrechen, wenn eine +Festplatte ausfällt. +
  • +
  • +SnapRAID kann Daten nur von einer begrenzten Anzahl von Festplattenausfällen +wiederherstellen. Mit einer Sicherung können Sie von einem +vollständigen Ausfall des gesamten Festplatten-Arrays wiederherstellen. +
  • +
  • +Nur Dateinamen, Zeitstempel, symbolische Links (symlinks) und +Hardlinks werden gespeichert. Berechtigungen, Eigentümerschaft +und erweiterte Attribute werden nicht gespeichert. +
  • +
+
+
+

+Getting Started +

+

Um SnapRAID zu verwenden, müssen Sie zuerst eine Festplatte in Ihrem +Festplatten-Array auswählen, die für `parity`-Informationen +reserviert wird. Mit einer Festplatte für Parität können Sie von +einem einzelnen Festplattenausfall wiederherstellen, ähnlich wie bei RAID5. +

Wenn Sie von mehr Festplattenausfällen wiederherstellen möchten, +ähnlich wie bei RAID6, müssen Sie zusätzliche Festplatten für Parität +reservieren. Jede zusätzliche Paritätsfestplatte ermöglicht die +Wiederherstellung von einem weiteren Festplattenausfall. +

Als Paritätsfestplatten müssen Sie die größten Festplatten im Array +auswählen, da die Paritätsinformationen auf die Größe der größten +Datenfestplatte im Array anwachsen können. +

Diese Festplatten werden zum Speichern der `parity`-Dateien +reserviert. Sie sollten Ihre Daten nicht darauf speichern. +

Anschließend müssen Sie die `data`-Festplatten definieren, die Sie +mit SnapRAID schützen möchten. Der Schutz ist effektiver, wenn diese +Festplatten Daten enthalten, die sich selten ändern. Aus diesem Grund +ist es besser, die Windows C:\-Festplatte oder die Unix-Verzeichnisse +/home, /var und /tmp NICHT einzuschließen. +

Die Liste der Dateien wird in den `content`-Dateien gespeichert, +die normalerweise auf den Daten-, Paritäts- oder Boot-Festplatten +gespeichert werden. Diese Datei enthält die Details Ihrer Sicherung, +einschließlich aller Prüfsummen zur Überprüfung ihrer Integrität. +Die `content`-Datei wird in mehreren Kopien gespeichert, und jede Kopie +muss sich auf einer anderen Festplatte befinden, um sicherzustellen, +dass selbst bei mehreren Festplattenausfällen mindestens eine Kopie +verfügbar ist. +

Angenommen, Sie sind nur an einer Paritätsstufe des Schutzes interessiert +und Ihre Festplatten befinden sich unter: +

+/mnt/diskp <- ausgewählte Festplatte für Parität
+/mnt/disk1 <- erste zu schützende Festplatte
+/mnt/disk2 <- zweite zu schützende Festplatte
+/mnt/disk3 <- dritte zu schützende Festplatte
+
+

Sie müssen die Konfigurationsdatei /etc/snapraid.conf mit den +folgenden Optionen erstellen: +

+parity /mnt/diskp/snapraid.parity
+content /var/snapraid/snapraid.content
+content /mnt/disk1/snapraid.content
+content /mnt/disk2/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+
+

Wenn Sie Windows verwenden, sollten Sie das Windows-Pfadformat mit +Laufwerksbuchstaben und Backslashes anstelle von Slashes verwenden. +

+parity E:\snapraid.parity
+content C:\snapraid\snapraid.content
+content F:\array\snapraid.content
+content G:\array\snapraid.content
+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+
+

Wenn Sie viele Festplatten haben und keine Laufwerksbuchstaben mehr +verfügbar sind, können Sie Festplatten direkt in Unterordnern +einhängen (mounten). Siehe: +

+https://www.google.com/search?q=Windows+mount+point
+
+

Zu diesem Zeitpunkt sind Sie bereit, den Befehl `sync` auszuführen, +um die Paritätsinformationen zu erstellen. +

+snapraid sync
+
+

Dieser Vorgang kann beim ersten Mal mehrere Stunden dauern, abhängig +von der Größe der bereits auf den Festplatten vorhandenen Daten. +Wenn die Festplatten leer sind, ist der Vorgang sofort abgeschlossen. +

Sie können ihn jederzeit durch Drücken von Strg+C anhalten, und beim +nächsten Lauf wird er dort fortgesetzt, wo er unterbrochen wurde. +

Wenn dieser Befehl abgeschlossen ist, sind Ihre Daten SICHER. +

Jetzt können Sie Ihr Array nach Belieben verwenden und die Paritätsinformationen +regelmäßig durch Ausführen des `sync`-Befehls aktualisieren. +

+

+Scrubbing +

+

Um die Daten und die Parität regelmäßig auf Fehler zu überprüfen, +können Sie den Befehl `scrub` ausführen. +

+snapraid scrub
+
+

Dieser Befehl vergleicht die Daten in Ihrem Array mit dem Hash, +der während des `sync`-Befehls berechnet wurde, um die Integrität +zu überprüfen. +

Jeder Lauf des Befehls überprüft ungefähr 8% des Arrays, +ausgenommen Daten, die bereits in den letzten 10 Tagen gescrubbed wurden. +Sie können die Option -p, --plan verwenden, um eine andere Menge +anzugeben, und die Option -o, --older-than, um ein anderes Alter +in Tagen anzugeben. Zum Beispiel, um 5% des Arrays auf Blöcke zu +überprüfen, die älter als 20 Tage sind, verwenden Sie: +

+snapraid -p 5 -o 20 scrub
+
+

Wenn während des Vorgangs stille oder Eingabe-/Ausgabefehler +gefunden werden, werden die entsprechenden Blöcke in der +`content`-Datei als fehlerhaft (bad) markiert und im Befehl +`status` aufgelistet. +

+snapraid status
+
+

Um sie zu beheben, können Sie den Befehl `fix` verwenden und dabei +nach fehlerhaften Blöcken mit der Option -e, --filter-error +filtern: +

+snapraid -e fix
+
+

Beim nächsten `scrub` verschwinden die Fehler aus dem `status`-Bericht, +wenn sie tatsächlich behoben sind. Um es schneller zu machen, +können Sie -p bad verwenden, um nur als fehlerhaft markierte Blöcke +zu scrubben. +

+snapraid -p bad scrub
+
+

Das Ausführen von `scrub` auf einem nicht synchronisierten Array +kann Fehler melden, die durch entfernte oder geänderte Dateien +verursacht wurden. Diese Fehler werden in der `scrub`-Ausgabe +gemeldet, aber die zugehörigen Blöcke werden nicht als fehlerhaft +markiert. +

+
+

+Pooling +

+

Hinweis: Die unten beschriebene Pooling-Funktion wurde durch das +Tool mergefs ersetzt, das jetzt die empfohlene Option für Linux-Benutzer +in der SnapRAID-Community ist. Mergefs bietet eine flexiblere +und effizientere Möglichkeit, mehrere Laufwerke zu einem einzigen, +vereinheitlichten Einhängepunkt (Mount Point) zusammenzufassen, +was einen nahtlosen Zugriff auf Dateien über Ihr gesamtes Array +hinweg ermöglicht, ohne auf symbolische Links angewiesen zu sein. +Es lässt sich gut mit SnapRAID zum Paritätsschutz integrieren und +wird häufig in Setups wie OpenMediaVault (OMV) oder benutzerdefinierten +NAS-Konfigurationen verwendet. +

Um alle Dateien in Ihrem Array im selben Verzeichnisbaum anzuzeigen, +können Sie die `pooling`-Funktion aktivieren. Sie erstellt eine +schreibgeschützte virtuelle Ansicht aller Dateien in Ihrem Array +mithilfe symbolischer Links. +

Sie können das `pooling`-Verzeichnis in der Konfigurationsdatei +mit folgender Option konfigurieren: +

+pool /pool
+
+

oder, wenn Sie Windows verwenden, mit: +

+pool C:\pool
+
+

und anschließend den Befehl `pool` ausführen, um die virtuelle +Ansicht zu erstellen oder zu aktualisieren. +

+snapraid pool
+
+

Wenn Sie eine Unix-Plattform verwenden und dieses Verzeichnis über +das Netzwerk für Windows- oder Unix-Maschinen freigeben möchten, +sollten Sie die folgenden Optionen zu Ihrer /etc/samba/smb.conf +hinzufügen: +

+# Im globalen Abschnitt von smb.conf
+unix extensions = no
+
+
+# Im Freigabe-Abschnitt von smb.conf
+[pool]
+comment = Pool
+path = /pool
+read only = yes
+guest ok = yes
+wide links = yes
+follow symlinks = yes
+
+

In Windows erfordert die Freigabe symbolischer Links über ein Netzwerk, +dass Clients diese remote auflösen. Um dies zu ermöglichen, +müssen Sie neben der Freigabe des Pool-Verzeichnisses auch alle +Festplatten unabhängig freigeben, indem Sie die in der Konfigurationsdatei +definierten Festplattennamen als Freigabepunkte verwenden. +Sie müssen auch in der Option `share` der Konfigurationsdatei +den Windows UNC-Pfad angeben, den Remote-Clients benötigen, um +auf diese freigegebenen Festplatten zuzugreifen. +

Zum Beispiel, wenn Sie von einem Server namens `darkstar` aus +arbeiten, können Sie die Optionen verwenden: +

+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+pool C:\pool
+share \\darkstar
+
+

und die folgenden Verzeichnisse über das Netzwerk freigeben: +

+\\darkstar\pool -> C:\pool
+\\darkstar\d1 -> F:\array
+\\darkstar\d2 -> G:\array
+\\darkstar\d3 -> H:\array
+
+

um Remote-Clients den Zugriff auf alle Dateien unter \\darkstar\pool +zu ermöglichen. +

Möglicherweise müssen Sie auch Remote-Clients konfigurieren, um +den Zugriff auf Remote-Symlinks mit dem Befehl zu aktivieren: +

+fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
+
+
+
+

+Undeleting +

+

SnapRAID funktioniert eher wie ein Sicherungsprogramm als ein RAID-System +und kann verwendet werden, um Dateien in ihren vorherigen Zustand +wiederherzustellen oder das Löschen rückgängig zu machen, indem die +Option -f, --filter verwendet wird: +

+snapraid fix -f DATEI
+
+

oder für ein Verzeichnis: +

+snapraid fix -f VERZEICHNIS/
+
+

Sie können es auch verwenden, um nur versehentlich gelöschte Dateien +innerhalb eines Verzeichnisses wiederherzustellen, indem Sie die +Option -m, --filter-missing verwenden, die nur fehlende Dateien +wiederherstellt und alle anderen unberührt lässt. +

+snapraid fix -m -f VERZEICHNIS/
+
+

Oder um alle gelöschten Dateien auf allen Laufwerken wiederherzustellen mit: +

+snapraid fix -m
+
+
+
+

+Recovering +

+

Das Schlimmste ist passiert, und Sie haben eine oder mehrere Festplatten +verloren! +

KEINE PANIK! Sie werden in der Lage sein, sie wiederherzustellen! +

Das erste, was Sie tun müssen, ist, weitere Änderungen an Ihrem +Festplatten-Array zu vermeiden. Deaktivieren Sie alle Remote-Verbindungen +dazu und alle geplanten Prozesse, einschließlich geplanter SnapRAID-nächtlicher +`sync`- oder `scrub`-Läufe. +

Fahren Sie dann mit den folgenden Schritten fort. +

+

+STEP 1 -> Reconfigure +

+

Sie benötigen etwas Platz zur Wiederherstellung, idealerweise auf +zusätzlichen Ersatzfestplatten, aber eine externe USB-Festplatte oder +eine Remote-Festplatte ist ausreichend. +

Ändern Sie die SnapRAID-Konfigurationsdatei so, dass die `data`- +oder `parity`-Option der ausgefallenen Festplatte auf einen Ort mit +genügend leerem Speicherplatz zur Wiederherstellung der Dateien zeigt. +

Wenn zum Beispiel die Festplatte `d1` ausgefallen ist, ändern Sie von: +

+data d1 /mnt/disk1/
+
+

zu: +

+data d1 /mnt/new_spare_disk/
+
+

Wenn die wiederherzustellende Festplatte eine Paritätsfestplatte ist, +aktualisieren Sie die entsprechende `parity`-Option. +Wenn Sie mehrere ausgefallene Festplatten haben, aktualisieren Sie +alle ihre Konfigurationsoptionen. +

+
+

+STEP 2 -> Fix +

+

Führen Sie den `fix`-Befehl aus und speichern Sie das Protokoll +in einer externen Datei mit: +

+snapraid -d NAME -l fix.log fix
+
+

Wobei NAME der Name der Festplatte ist, wie z.B. `d1` in unserem +vorherigen Beispiel. Wenn die wiederherzustellende Festplatte eine +Paritätsfestplatte ist, verwenden Sie die Namen `parity`, `2-parity`, +usw. Wenn Sie mehrere ausgefallene Festplatten haben, verwenden Sie +mehrere -d-Optionen, um alle anzugeben. +

Dieser Befehl wird lange dauern. +

Stellen Sie sicher, dass Sie einige Gigabyte frei haben, um die +Datei fix.log zu speichern. Führen Sie ihn von einer Festplatte +mit ausreichend freiem Speicherplatz aus. +

Jetzt haben Sie alles wiederhergestellt, was wiederherstellbar ist. +Wenn einige Dateien teilweise oder vollständig nicht wiederherstellbar +sind, werden sie umbenannt, indem die Erweiterung `.unrecoverable` +hinzugefügt wird. +

Sie finden eine detaillierte Liste aller nicht wiederherstellbaren +Blöcke in der Datei fix.log, indem Sie alle Zeilen überprüfen, +die mit `unrecoverable:` beginnen. +

Wenn Sie mit der Wiederherstellung nicht zufrieden sind, können Sie +sie so oft wie gewünscht wiederholen. +

Wenn Sie zum Beispiel Dateien nach dem letzten `sync` aus dem Array +entfernt haben, kann dies dazu führen, dass einige Dateien nicht +wiederhergestellt werden. In diesem Fall können Sie den `fix` +mithilfe der Option -i, --import wiederholen, wobei Sie angeben, +wo sich diese Dateien jetzt befinden, um sie erneut in den +Wiederherstellungsprozess einzubeziehen. +

Wenn Sie mit der Wiederherstellung zufrieden sind, können Sie +fortfahren, aber beachten Sie, dass Sie nach der Synchronisierung +den `fix`-Befehl nicht mehr wiederholen können! +

+
+

+STEP 3 -> Check +

+

Als vorsichtige Überprüfung können Sie jetzt einen `check`-Befehl +ausführen, um sicherzustellen, dass auf der wiederhergestellten +Festplatte alles korrekt ist. +

+snapraid -d NAME -a check
+
+

Wobei NAME der Name der Festplatte ist, wie z.B. `d1` in unserem +vorherigen Beispiel. +

Die Optionen -d und -a weisen SnapRAID an, nur die angegebene +Festplatte zu überprüfen und alle Paritätsdaten zu ignorieren. +

Dieser Befehl wird lange dauern, aber wenn Sie nicht übermäßig +vorsichtig sind, können Sie ihn überspringen. +

+
+

+STEP 4 -> Sync +

+

Führen Sie den `sync`-Befehl aus, um das Array mit der neuen +Festplatte zu resynchronisieren. +

+snapraid sync
+
+

Wenn alles wiederhergestellt ist, ist dieser Befehl sofort. +

+
+
+
+

+Commands +

+

SnapRAID bietet einige einfache Befehle, mit denen Sie: +

    +
  • +Den Status des Arrays ausgeben -> `status` +
  • +
  • +Die Festplatten steuern -> `smart`, `probe`, `up`, `down` +
  • +
  • +Eine Sicherung/einen Snapshot erstellen -> `sync` +
  • +
  • +Daten regelmäßig überprüfen -> `scrub` +
  • +
  • +Die letzte Sicherung/den letzten Snapshot wiederherstellen -> `fix`. +
  • +
+

Befehle müssen in Kleinbuchstaben geschrieben werden. +

+

+status +

+

Gibt eine Zusammenfassung des Zustands des Festplatten-Arrays aus. +

Es enthält Informationen zur Paritätsfragmentierung, wie alt +die Blöcke sind, ohne Überprüfung, und alle aufgezeichneten +stillen Fehler, die beim Scrubbing aufgetreten sind. +

Die präsentierten Informationen beziehen sich auf den letzten Zeitpunkt, +zu dem Sie `sync` ausgeführt haben. Spätere Änderungen werden +nicht berücksichtigt. +

Wenn fehlerhafte Blöcke erkannt wurden, werden deren Blocknummern +aufgelistet. Um sie zu beheben, können Sie den Befehl `fix -e` +verwenden. +

Es zeigt auch ein Diagramm an, das den letzten Zeitpunkt darstellt, +zu dem jeder Block gescrubbed oder synchronisiert wurde. Gescrubbed +Blöcke werden mit '*', Blöcke, die synchronisiert, aber noch nicht +gescrubbed wurden, mit 'o' angezeigt. +

Es wird nichts geändert. +

+
+

+smart +

+

Gibt einen SMART-Bericht aller Festplatten im System aus. +

Es enthält eine Schätzung der Ausfallwahrscheinlichkeit im nächsten +Jahr, sodass Sie die Wartungsersetzung von Festplatten planen können, +die verdächtige Attribute aufweisen. +

Diese Wahrscheinlichkeitsschätzung wird durch Korrelation der SMART-Attribute +der Festplatten mit den Backblaze-Daten erhalten, die unter +folgender Adresse verfügbar sind: +

+https://www.backblaze.com/hard-drive-test-data.html
+
+

Wenn SMART meldet, dass eine Festplatte ausfällt, wird `FAIL` +oder `PREFAIL` für diese Festplatte gedruckt, und SnapRAID +endet mit einem Fehler. In diesem Fall wird ein sofortiger +Austausch der Festplatte dringend empfohlen. +

Weitere mögliche Statuszeichenfolgen sind: +

+
+
+logfail +
+In der Vergangenheit lagen einige Attribute unter +dem Schwellenwert. +
+
+
+
+logerr +
+Das Gerätefehlerprotokoll enthält Fehler. +
+
+
+
+selferr +
+Das Geräte-Selbsttestprotokoll enthält Fehler. +
+
+
+

Wenn die Option -v, --verbose angegeben ist, wird eine tiefere +statistische Analyse bereitgestellt. Diese Analyse kann Ihnen bei +der Entscheidung helfen, ob Sie mehr oder weniger Parität benötigen. +

Dieser Befehl verwendet das `smartctl`-Tool und entspricht dem +Ausführen von `smartctl -a` auf allen Geräten. +

Wenn Ihre Geräte nicht korrekt automatisch erkannt werden, können Sie +einen benutzerdefinierten Befehl mithilfe der `smartctl`-Option +in der Konfigurationsdatei angeben. +

Es wird nichts geändert. +

+
+

+probe +

+

Gibt den POWER-Zustand aller Festplatten im System aus. +

`Standby` bedeutet, dass die Festplatte nicht dreht. `Active` +bedeutet, dass die Festplatte dreht. +

Dieser Befehl verwendet das `smartctl`-Tool und entspricht dem +Ausführen von `smartctl -n standby -i` auf allen Geräten. +

Wenn Ihre Geräte nicht korrekt automatisch erkannt werden, können Sie +einen benutzerdefinierten Befehl mithilfe der `smartctl`-Option +in der Konfigurationsdatei angeben. +

Es wird nichts geändert. +

+
+

+up +

+

Dreht alle Festplatten des Arrays hoch (spins up). +

Sie können nur bestimmte Festplatten mithilfe der Option -d, --filter-disk +hochdrehen. +

Das gleichzeitige Hochdrehen aller Festplatten erfordert viel Strom. +Stellen Sie sicher, dass Ihr Netzteil dies aushalten kann. +

Es wird nichts geändert. +

+
+

+down +

+

Dreht alle Festplatten des Arrays herunter (spins down). +

Dieser Befehl verwendet das `smartctl`-Tool und entspricht dem +Ausführen von `smartctl -s standby,now` auf allen Geräten. +

Sie können nur bestimmte Festplatten mithilfe der Option -d, --filter-disk +herunterdrehen. +

Um automatisch bei einem Fehler herunterzufahren, können Sie die Option +-s, --spin-down-on-error mit jedem anderen Befehl verwenden, was dem +manuellen Ausführen von `down` bei Auftreten eines Fehlers +entspricht. +

Es wird nichts geändert. +

+
+

+diff +

+

Listet alle Dateien auf, die seit dem letzten `sync` geändert wurden +und deren Paritätsdaten neu berechnet werden müssen. +

Dieser Befehl überprüft nicht die Dateidaten, sondern nur den +Dateizeitstempel, die Größe und die Inode. +

Nach dem Auflisten aller geänderten Dateien wird eine Zusammenfassung +der Änderungen präsentiert, gruppiert nach: +

+
+
+equal +
+Dateien, die sich seitdem nicht geändert haben. +
+
+
+
+added +
+Neu hinzugefügte Dateien, die vorher nicht vorhanden waren. +
+
+
+
+removed +
+Entfernte Dateien. +
+
+
+
+updated +
+Dateien mit einer anderen Größe oder einem anderen +Zeitstempel, was bedeutet, dass sie geändert wurden. +
+
+
+
+moved +
+Auf derselben Festplatte in ein anderes Verzeichnis +verschobene Dateien. Sie werden durch denselben Namen, +dieselbe Größe, denselben Zeitstempel und dieselbe Inode, +aber ein anderes Verzeichnis identifiziert. +
+
+
+
+copied +
+Auf dieselbe oder eine andere Festplatte kopierte +Dateien. Beachten Sie, dass wenn sie tatsächlich auf eine +andere Festplatte verschoben werden, sie auch unter `removed` +gezählt werden. Sie werden durch denselben Namen, dieselbe +Größe und denselben Zeitstempel identifiziert. Wenn der +Untersekunden-Zeitstempel Null ist, muss der vollständige +Pfad übereinstimmen, nicht nur der Name. +
+
+
+
+restored +
+Dateien mit einer anderen Inode, aber übereinstimmendem +Namen, Größe und Zeitstempel. Dies sind normalerweise +Dateien, die nach dem Löschen wiederhergestellt wurden. +
+
+
+

Wenn ein `sync` erforderlich ist, ist der Rückgabecode des Prozesses 2 +anstelle des Standardwerts 0. Der Rückgabecode 1 wird für eine +allgemeine Fehlerbedingung verwendet. +

Es wird nichts geändert. +

+
+

+sync +

+

Aktualisiert die Paritätsinformationen. Alle geänderten Dateien +im Festplatten-Array werden gelesen, und die entsprechenden +Paritätsdaten werden aktualisiert. +

Sie können diesen Vorgang jederzeit durch Drücken von Strg+C +anhalten, ohne die bereits geleistete Arbeit zu verlieren. +Beim nächsten Lauf wird der `sync`-Vorgang dort fortgesetzt, +wo er unterbrochen wurde. +

Wenn während des Vorgangs stille oder Eingabe-/Ausgabefehler +gefunden werden, werden die entsprechenden Blöcke als fehlerhaft +markiert. +

Dateien werden durch Pfad und/oder Inode identifiziert und anhand +von Größe und Zeitstempel überprüft. +Wenn die Dateigröße oder der Zeitstempel abweicht, werden die Paritätsdaten +für die gesamte Datei neu berechnet. +Wenn die Datei auf derselben Festplatte verschoben oder umbenannt +wird und dieselbe Inode beibehält, wird die Parität nicht neu +berechnet. +Wenn die Datei auf eine andere Festplatte verschoben wird, wird die +Parität neu berechnet, aber die zuvor berechneten Hash-Informationen +werden beibehalten. +

Die `content`- und `parity`-Dateien werden bei Bedarf geändert. +Die Dateien im Array werden NICHT geändert. +

+
+

+scrub +

+

Scrubbt das Array und überprüft auf stille oder Eingabe-/Ausgabefehler +auf Daten- und Paritätsfestplatten. +

Jede Ausführung überprüft ungefähr 8% des Arrays, ausgenommen Daten, +die bereits in den letzten 10 Tagen gescrubbed wurden. +Dies bedeutet, dass Scrubbing einmal pro Woche sicherstellt, dass +jedes Bit an Daten mindestens einmal alle drei Monate überprüft wird. +

Sie können einen anderen Scrub-Plan oder eine andere Menge mithilfe +der Option -p, --plan definieren, die Folgendes akzeptiert: +bad - Scrubbt als fehlerhaft markierte Blöcke. +new - Scrubbt gerade synchronisierte Blöcke, die noch nicht gescrubbed +

wurden. +

+
+
+full +
+Scrubbt alles. +
+
+
+
+0-100 +
+Scrubbt den angegebenen Prozentsatz der Blöcke. +
+
+
+

Wenn Sie einen Prozentsatz angeben, können Sie auch die Option +-o, --older-than verwenden, um festzulegen, wie alt der Block sein +soll. Die ältesten Blöcke werden zuerst gescrubbed, um eine optimale +Überprüfung zu gewährleisten. Wenn Sie nur die gerade synchronisierten +Blöcke scrubben möchten, die noch nicht gescrubbed wurden, +verwenden Sie die Option `-p new`. +

Um Details zum Scrub-Status zu erhalten, verwenden Sie den Befehl +`status`. +

Für jeden gefundenen stillen oder Eingabe-/Ausgabefehler werden die +entsprechenden Blöcke in der `content`-Datei als fehlerhaft (bad) +markiert. Diese fehlerhaften Blöcke werden in `status` aufgelistet +und können mit `fix -e` behoben werden. Nach der Behebung werden +sie beim nächsten Scrub erneut überprüft, und wenn sie als korrigiert +befunden werden, wird die fehlerhafte Markierung entfernt. +Um nur die fehlerhaften Blöcke zu scrubben, können Sie den Befehl +`scrub -p bad` verwenden. +

Es wird empfohlen, `scrub` nur auf einem synchronisierten Array +auszuführen, um gemeldete Fehler zu vermeiden, die durch nicht +synchronisierte Daten verursacht werden. Diese Fehler werden als +keine stillen Fehler erkannt, und die Blöcke werden nicht als fehlerhaft +markiert, aber solche Fehler werden in der Ausgabe des Befehls +gemeldet. +

Die `content`-Datei wird geändert, um die Zeit der letzten +Überprüfung für jeden Block zu aktualisieren und fehlerhafte +Blöcke zu markieren. +Die `parity`-Dateien werden NICHT geändert. +Die Dateien im Array werden NICHT geändert. +

+
+

+fix +

+

Behebt alle Dateien und die Paritätsdaten. +

Alle Dateien und Paritätsdaten werden mit dem Snapshot-Zustand +verglichen, der beim letzten `sync` gespeichert wurde. +Wenn eine Abweichung gefunden wird, wird sie auf den gespeicherten +Snapshot zurückgesetzt. +

WARNUNG! Der Befehl `fix` unterscheidet nicht zwischen Fehlern und +beabsichtigten Änderungen. Er setzt den Dateizustand bedingungslos +auf den letzten `sync` zurück. +

Wenn keine andere Option angegeben ist, wird das gesamte Array verarbeitet. +Verwenden Sie die Filteroptionen, um eine Teilmenge von Dateien +oder Festplatten für die Operation auszuwählen. +

Um nur die Blöcke zu beheben, die während `sync` und `scrub` als +fehlerhaft markiert wurden, verwenden Sie die Option -e, --filter-error. +Im Gegensatz zu anderen Filteroptionen wendet diese Behebungen nur +auf Dateien an, die seit dem letzten `sync` unverändert sind. +

SnapRAID benennt alle Dateien, die nicht behoben werden können, +durch Hinzufügen der Erweiterung `.unrecoverable` um. +

Vor dem Beheben wird das gesamte Array gescannt, um alle Dateien +zu finden, die seit der letzten `sync`-Operation verschoben wurden. +Diese Dateien werden anhand ihres Zeitstempels identifiziert, wobei +Name und Verzeichnis ignoriert werden, und werden bei Bedarf im +Wiederherstellungsprozess verwendet. Wenn Sie einige davon außerhalb +des Arrays verschoben haben, können Sie die Option -i, --import +verwenden, um zusätzliche Verzeichnisse zum Scannen anzugeben. +

Dateien werden nur anhand des Pfads identifiziert, nicht anhand +der Inode. +

Die `content`-Datei wird NICHT geändert. +Die `parity`-Dateien werden bei Bedarf geändert. +Die Dateien im Array werden bei Bedarf geändert. +

+
+

+check +

+

Überprüft alle Dateien und die Paritätsdaten. +

Es funktioniert wie `fix`, simuliert jedoch nur eine Wiederherstellung, +und es werden keine Änderungen in das Array geschrieben. +

Dieser Befehl ist primär für manuelle Überprüfung gedacht, wie z.B. +nach einem Wiederherstellungsprozess oder unter anderen speziellen +Bedingungen. Für regelmäßige und geplante Überprüfungen verwenden +Sie `scrub`. +

Wenn Sie die Option -a, --audit-only verwenden, wird nur der Hash +der Dateien überprüft, und die Paritätsdaten werden für einen +schnelleren Lauf ignoriert. +

Dateien werden nur anhand des Pfads identifiziert, nicht anhand +der Inode. +

Es wird nichts geändert. +

+
+

+list +

+

Listet alle Dateien auf, die sich zum Zeitpunkt des letzten `sync` +im Array befanden. +

Mit -v oder --verbose wird auch die Untersekundenzeit angezeigt. +

Es wird nichts geändert. +

+
+

+dup +

+

Listet alle doppelten Dateien auf. Zwei Dateien gelten als gleich, +wenn ihre Hashes übereinstimmen. Die Dateidaten werden nicht gelesen; +es werden nur die vorab berechneten Hashes verwendet. +

Es wird nichts geändert. +

+
+

+pool +

+

Erstellt oder aktualisiert eine virtuelle Ansicht aller +Dateien in Ihrem Festplatten-Array im `pooling`-Verzeichnis. +

Die Dateien werden nicht kopiert, sondern mithilfe symbolischer +Links verknüpft. +

Beim Aktualisieren werden alle vorhandenen symbolischen Links und +leeren Unterverzeichnisse gelöscht und durch die neue Ansicht des +Arrays ersetzt. Alle anderen regulären Dateien bleiben erhalten. +

Außerhalb des Pool-Verzeichnisses wird nichts geändert. +

+
+

+devices +

+

Gibt die Low-Level-Geräte aus, die vom Array verwendet werden. +

Dieser Befehl zeigt die Gerätezuordnungen im Array an und ist +hauptsächlich als Skriptschnittstelle gedacht. +

Die ersten beiden Spalten sind die Low-Level-Geräte-ID und der Pfad. +Die nächsten beiden Spalten sind die High-Level-Geräte-ID und der Pfad. +Die letzte Spalte ist der Festplattenname im Array. +

In den meisten Fällen haben Sie ein Low-Level-Gerät für jede +Festplatte im Array, aber in einigen komplexeren Konfigurationen +können mehrere Low-Level-Geräte von einer einzigen Festplatte +im Array verwendet werden. +

Es wird nichts geändert. +

+
+

+touch +

+

Setzt einen beliebigen Untersekunden-Zeitstempel für alle Dateien, +deren Untersekunden-Zeitstempel auf Null gesetzt ist. +

Dies verbessert die Fähigkeit von SnapRAID, verschobene und +kopierte Dateien zu erkennen, da es den Zeitstempel fast +eindeutig macht und mögliche Duplikate reduziert. +

Genauer gesagt, wenn der Untersekunden-Zeitstempel nicht Null ist, +wird eine verschobene oder kopierte Datei als solche identifiziert, +wenn sie mit Name, Größe und Zeitstempel übereinstimmt. Wenn der +Untersekunden-Zeitstempel Null ist, wird sie nur als Kopie betrachtet, +wenn der vollständige Pfad, die Größe und der Zeitstempel alle +übereinstimmen. +

Der Zeitstempel mit Sekundenpräzision wird nicht geändert, +sodass alle Daten und Zeiten Ihrer Dateien erhalten bleiben. +

+
+

+rehash +

+

Plant eine Neu-Hash-Berechnung (rehash) des gesamten Arrays. +

Dieser Befehl ändert die verwendete Hash-Art, typischerweise beim +Upgrade von einem 32-Bit-System auf ein 64-Bit-System, um von +MurmurHash3 auf den schnelleren SpookyHash umzuschalten. +

Wenn Sie bereits den optimalen Hash verwenden, tut dieser Befehl +nichts und informiert Sie darüber, dass keine Aktion erforderlich ist. +

Die Neu-Hash-Berechnung wird nicht sofort durchgeführt, sondern +findet schrittweise während `sync` und `scrub` statt. +

Sie können den Neu-Hash-Zustand mithilfe von `status` überprüfen. +

Während der Neu-Hash-Berechnung behält SnapRAID die volle +Funktionalität bei, mit der einzigen Ausnahme, dass `dup` keine +doppelten Dateien mit einem anderen Hash erkennen kann. +

+
+
+

+Options +

+

SnapRAID bietet die folgenden Optionen: +

+
+
+-c, --conf CONFIG +
+Wählt die zu verwendende Konfigurationsdatei aus. Wenn nicht +angegeben, wird unter Unix die Datei `/usr/local/etc/snapraid.conf` +verwendet, falls sie existiert, andernfalls `/etc/snapraid.conf`. +Unter Windows wird die Datei `snapraid.conf` im selben +Verzeichnis wie `snapraid.exe` verwendet. +
+
+
+
+
+
+-f, --filter PATTERN +
+Filtert die zu verarbeitenden Dateien in `check` und `fix`. +Nur die Dateien, die dem angegebenen Muster entsprechen, werden +verarbeitet. Diese Option kann mehrmals verwendet werden. +Weitere Details zu Musterspezifikationen finden Sie im +Abschnitt PATTERN. Unter Unix stellen Sie sicher, dass Globbing-Zeichen +in Anführungszeichen gesetzt werden, wenn sie verwendet werden. +Diese Option kann nur mit `check` und `fix` verwendet werden. +Sie kann nicht mit `sync` und `scrub` verwendet werden, da +diese immer das gesamte Array verarbeiten. +
+
+
+
+
+
+-d, --filter-disk NAME +
+Filtert die zu verarbeitenden Festplatten in `check`, `fix`, `up` +und `down`. Sie müssen einen Festplattennamen angeben, wie +in der Konfigurationsdatei definiert. Sie können auch Paritätsfestplatten +mit den Namen `parity`, `2-parity`, `3-parity`, usw. angeben, +um Vorgänge auf eine bestimmte Paritätsfestplatte zu beschränken. +Wenn Sie mehrere --filter, --filter-disk und --filter-missing +Optionen kombinieren, werden nur Dateien ausgewählt, die allen +Filtern entsprechen. Diese Option kann mehrmals verwendet werden. +Diese Option kann nur mit `check`, `fix`, `up` und `down` verwendet +werden. Sie kann nicht mit `sync` und `scrub` verwendet werden, +da diese immer das gesamte Array verarbeiten. +
+
+
+
+
+
+-m, --filter-missing +
+Filtert die zu verarbeitenden Dateien in `check` und `fix`. +Nur die Dateien, die im Array fehlen oder gelöscht wurden, werden +verarbeitet. Bei Verwendung mit `fix` fungiert dies als +`undelete`-Befehl (Wiederherstellung von Gelöschtem). +Wenn Sie mehrere --filter, --filter-disk und --filter-missing +Optionen kombinieren, werden nur Dateien ausgewählt, die allen +Filtern entsprechen. Diese Option kann nur mit `check` und `fix` +verwendet werden. Sie kann nicht mit `sync` und `scrub` +verwendet werden, da diese immer das gesamte Array verarbeiten. +
+
+
+
+
+
+-e, --filter-error +
+Verarbeitet die Dateien mit Fehlern in `check` und `fix`. +Es verarbeitet nur Dateien, deren Blöcke während `sync` +und `scrub` als mit stillen oder Eingabe-/Ausgabefehlern +markiert wurden, wie in `status` aufgelistet. +Diese Option kann nur mit `check` und `fix` verwendet werden. +
+
+
+
+
+
+-p, --plan PERC|bad|new|full +
+Wählt den Scrub-Plan aus. Wenn PERC ein numerischer Wert +von 0 bis 100 ist, wird er als Prozentsatz der zu scrubbenden +Blöcke interpretiert. Anstelle eines Prozentsatzes können Sie +einen Plan angeben: `bad` scrubbt fehlerhafte Blöcke, +`new` scrubbt Blöcke, die noch nicht gescrubbed wurden, +und `full` scrubbt alles. +Diese Option kann nur mit `scrub` verwendet werden. +
+
+
+
+
+
+-o, --older-than DAYS +
+Wählt den ältesten Teil des Arrays aus, der in `scrub` +verarbeitet werden soll. DAYS ist das Mindestalter in Tagen, +damit ein Block gescrubbed werden kann; der Standardwert +ist 10. Blöcke, die als fehlerhaft markiert sind, werden +immer gescrubbed, unabhängig von dieser Option. +Diese Option kann nur mit `scrub` verwendet werden. +
+
+
+
+
+
+-a, --audit-only +
+Überprüft in `check` den Hash der Dateien, ohne die Paritätsdaten +zu überprüfen. Wenn Sie nur an der Überprüfung der Dateidaten +interessiert sind, kann diese Option den Überprüfungsprozess +erheblich beschleunigen. +Diese Option kann nur mit `check` verwendet werden. +
+
+
+
+
+
+-h, --pre-hash +
+Führt in `sync` eine vorläufige Hash-Phase aller neuen Daten +zur zusätzlichen Überprüfung vor der Paritätsberechnung durch. +Normalerweise wird in `sync` keine vorläufige Hash-Berechnung +durchgeführt, und die neuen Daten werden unmittelbar vor der +Paritätsberechnung gehasht, wenn sie zum ersten Mal gelesen werden. +Dieser Vorgang tritt auf, wenn das System unter starker Last +steht, wobei alle Festplatten drehen und eine ausgelastete CPU +vorliegt. Dies ist ein Extremzustand für die Maschine, und wenn +sie ein latentes Hardwareproblem hat, können stille Fehler +unentdeckt bleiben, da die Daten noch nicht gehasht sind. +Um dieses Risiko zu vermeiden, können Sie den `pre-hash`-Modus +aktivieren, um alle Daten zweimal lesen zu lassen und so ihre +Integrität sicherzustellen. Diese Option überprüft auch im Array +verschobene Dateien, um sicherzustellen, dass die Verschiebeoperation +erfolgreich war, und ermöglicht es Ihnen, bei Bedarf eine +`fix`-Operation durchzuführen, bevor Sie fortfahren. +Diese Option kann nur mit `sync` verwendet werden. +
+
+
+
+
+
+-i, --import DIR +
+Importiert aus dem angegebenen Verzeichnis alle Dateien, die +nach dem letzten `sync` aus dem Array gelöscht wurden. +Wenn Sie solche Dateien noch haben, können sie von `check` und +`fix` verwendet werden, um den Wiederherstellungsprozess zu +verbessern. Die Dateien werden gelesen, auch in Unterverzeichnissen, +und unabhängig von ihrem Namen identifiziert. +Diese Option kann nur mit `check` und `fix` verwendet werden. +
+
+
+
+
+
+-s, --spin-down-on-error +
+Dreht bei jedem Fehler alle verwalteten Festplatten herunter, +bevor mit einem von Null verschiedenen Statuscode beendet wird. +Dies verhindert, dass die Laufwerke nach einem abgebrochenen +Vorgang aktiv bleiben und drehen, was unnötige Hitzeentwicklung +und Stromverbrauch vermeiden hilft. Verwenden Sie diese Option, +um sicherzustellen, dass die Festplatten auch bei einem +Befehlsfehler sicher gestoppt werden. +
+
+
+
+
+
+-w, --bw-limit RATE +
+Wendet eine globale Bandbreitenbegrenzung für alle Festplatten +an. RATE ist die Anzahl der Bytes pro Sekunde. Sie können +einen Multiplikator wie K, M oder G angeben (z.B. --bw-limit 1G). +
+
+
+
+
+
+-A, --stats +
+Aktiviert eine erweiterte Statusansicht, die zusätzliche +Informationen anzeigt. Der Bildschirm zeigt zwei Diagramme an: +Das erste Diagramm zeigt die Anzahl der gepufferten Stripes für jede +Festplatte sowie den Dateipfad der Datei, auf die derzeit auf dieser +Festplatte zugegriffen wird. Typischerweise hat die langsamste Festplatte +keinen verfügbaren Puffer, was die maximal erreichbare Bandbreite bestimmt. +Das zweite Diagramm zeigt den Prozentsatz der Wartezeit über die +letzten 100 Sekunden. Es wird erwartet, dass die langsamste Festplatte +die meiste Wartezeit verursacht, während andere Festplatten wenig +oder keine Wartezeit haben sollten, da sie ihre gepufferten Stripes +verwenden können. Dieses Diagramm zeigt auch die Zeit an, die +mit Warten auf Hash-Berechnungen und RAID-Berechnungen verbracht +wurde. Alle Berechnungen laufen parallel zu den Festplattenoperationen. +Solange für mindestens eine Festplatte eine messbare Wartezeit +vorhanden ist, deutet dies daher darauf hin, dass die CPU schnell +genug ist, um mit der Arbeitslast Schritt zu halten. +
+
+
+
+
+
+-Z, --force-zero +
+Erzwingt den unsicheren Vorgang der Synchronisierung einer Datei +mit Nullgröße, die zuvor nicht Null war. Wenn SnapRAID eine +solche Bedingung erkennt, stoppt es den Vorgang, es sei denn, +Sie geben diese Option an. Dies ermöglicht es Ihnen, leicht zu +erkennen, wann nach einem Systemabsturz einige zugegriffene Dateien +abgeschnitten (truncated) wurden. Dies ist eine mögliche Bedingung +unter Linux mit den ext3/ext4-Dateisystemen. +Diese Option kann nur mit `sync` verwendet werden. +
+
+
+
+
+
+-E, --force-empty +
+Erzwingt den unsicheren Vorgang der Synchronisierung einer +Festplatte, bei der alle ursprünglichen Dateien fehlen. +Wenn SnapRAID erkennt, dass alle ursprünglich auf der Festplatte +vorhandenen Dateien fehlen oder überschrieben wurden, stoppt es +den Vorgang, es sei denn, Sie geben diese Option an. +Dies ermöglicht es Ihnen, leicht zu erkennen, wann ein Daten-Dateisystem +nicht gemountet (eingehängt) ist. +Diese Option kann nur mit `sync` verwendet werden. +
+
+
+
+
+
+-U, --force-uuid +
+Erzwingt den unsicheren Vorgang der Synchronisierung, Überprüfung +und Behebung mit Festplatten, deren UUID geändert wurde. +Wenn SnapRAID erkennt, dass einige Festplatten ihre UUID +geändert haben, stoppt es den Vorgang, es sei denn, Sie geben +diese Option an. Dies ermöglicht es Ihnen, zu erkennen, wann +Ihre Festplatten an den falschen Einhängepunkten gemountet sind. +Es ist jedoch erlaubt, eine einzelne UUID-Änderung mit einfacher +Parität zu haben und mehr mit mehrfacher Parität, da dies +der normale Fall beim Austausch von Festplatten nach einer +Wiederherstellung ist. +Diese Option kann nur mit `sync`, `check` oder `fix` verwendet +werden. +
+
+
+
+
+
+-D, --force-device +
+Erzwingt den unsicheren Vorgang der Behebung mit unzugänglichen +Festplatten oder mit Festplatten auf demselben physischen Gerät. +Wenn Sie beispielsweise zwei Datenfestplatten verloren haben und +eine Ersatzfestplatte haben, um nur die erste wiederherzustellen, +können Sie die zweite unzugängliche Festplatte ignorieren. +Oder wenn Sie eine Festplatte in dem auf einer bereits +verwendeten Festplatte verbleibenden freien Speicherplatz +wiederherstellen möchten, wobei sie dasselbe physische Gerät +gemeinsam nutzen. +Diese Option kann nur mit `fix` verwendet werden. +
+
+
+
+
+
+-N, --force-nocopy +
+Deaktiviert in `sync`, `check` und `fix` die Kopiererkennungsheuristik. +Ohne diese Option geht SnapRAID davon aus, dass Dateien mit den +gleichen Attributen, wie Name, Größe und Zeitstempel, Kopien mit +denselben Daten sind. Dies ermöglicht die Identifizierung von +kopierten oder von einer Festplatte auf eine andere verschobenen +Dateien und die Wiederverwendung der bereits berechneten Hash-Informationen, +um stille Fehler zu erkennen oder fehlende Dateien wiederherzustellen. +In einigen seltenen Fällen kann dieses Verhalten zu falsch positiven +Ergebnissen oder einem langsamen Vorgang aufgrund vieler Hash-Überprüfungen +führen, und diese Option ermöglicht es Ihnen, solche Probleme +zu beheben. +Diese Option kann nur mit `sync`, `check` und `fix` verwendet +werden. +
+
+
+
+
+
+-F, --force-full +
+Erzwingt in `sync` eine vollständige Neuberechnung der Parität. +Diese Option kann verwendet werden, wenn Sie eine neue Paritätsstufe +hinzufügen oder wenn Sie zu einer alten Content-Datei mit +neueren Paritätsdaten zurückgekehrt sind. Anstatt die Parität +von Grund auf neu zu erstellen, ermöglicht dies die Wiederverwendung +der in der Content-Datei vorhandenen Hashes zur Validierung +von Daten und zur Aufrechterhaltung des Datenschutzes während +des `sync`-Vorgangs unter Verwendung der vorhandenen Paritätsdaten. +Diese Option kann nur mit `sync` verwendet werden. +
+
+
+
+
+
+-R, --force-realloc +
+Erzwingt in `sync` eine vollständige Neuallokation von Dateien +und eine Wiederherstellung der Parität. +Diese Option kann verwendet werden, um alle Dateien vollständig +neu zuzuweisen und die Fragmentierung zu entfernen, während +die in der Content-Datei vorhandenen Hashes zur Validierung +von Daten wiederverwendet werden. +Diese Option kann nur mit `sync` verwendet werden. +WARNUNG! Diese Option ist nur für Experten gedacht, und es wird +dringend empfohlen, sie nicht zu verwenden. +Sie haben während der `sync`-Operation KEINEN Datenschutz. +
+
+
+
+
+
+-l, --log FILE +
+Schreibt ein detailliertes Protokoll in die angegebene Datei. +Wenn diese Option nicht angegeben ist, werden unerwartete Fehler +auf dem Bildschirm ausgegeben, was bei vielen Fehlern möglicherweise +zu einer übermäßigen Ausgabe führt. Wenn -l, --log angegeben +ist, werden nur schwerwiegende Fehler, die SnapRAID zum Stoppen +bringen, auf dem Bildschirm ausgegeben. +Wenn der Pfad mit '>>' beginnt, wird die Datei im Anhängemodus +(append mode) geöffnet. Vorkommen von '%D' und '%T' im Namen +werden durch Datum und Uhrzeit im Format YYYYMMDD bzw. HHMMSS +ersetzt. In Windows-Batch-Dateien müssen Sie das '%'-Zeichen +verdoppeln, z.B. result-%%D.log. Um '>>' zu verwenden, müssen +Sie den Namen in Anführungszeichen setzen, z.B. `">>result.log"`. +Um das Protokoll an die Standardausgabe oder den Standardfehler +auszugeben, können Sie `">&1"` bzw. `">&2"` verwenden. +Beschreibungen der Protokoll-Tags finden Sie in der Datei +snapraid_log.txt oder in der Manpage. +
+
+
+
+
+
+-L, --error-limit NUMBER +
+Legt ein neues Fehlerlimit fest, bevor die Ausführung gestoppt +wird. Standardmäßig stoppt SnapRAID, wenn es mehr als 100 +Eingabe-/Ausgabefehler feststellt, was darauf hindeutet, dass +eine Festplatte wahrscheinlich ausfällt. Diese Option wirkt sich +auf `sync` und `scrub` aus, denen es gestattet ist, nach dem +ersten Satz von Festplattenfehlern fortzufahren, um ihre Vorgänge +abzuschließen. `check` und `fix` stoppen jedoch immer beim +ersten Fehler. +
+
+
+
+
+
+-S, --start BLKSTART +
+Startet die Verarbeitung ab der angegebenen Blocknummer. +Dies kann nützlich sein, um die Überprüfung oder Behebung +spezifischer Blöcke im Falle einer beschädigten Festplatte +zu wiederholen. Diese Option ist hauptsächlich für die erweiterte +manuelle Wiederherstellung gedacht. +
+
+
+
+
+
+-B, --count BLKCOUNT +
+Verarbeitet nur die angegebene Anzahl von Blöcken. +Diese Option ist hauptsächlich für die erweiterte manuelle +Wiederherstellung gedacht. +
+
+
+
+
+
+-C, --gen-conf CONTENT +
+Generiert eine Dummy-Konfigurationsdatei aus einer vorhandenen +Content-Datei. Die Konfigurationsdatei wird in die Standardausgabe +geschrieben und überschreibt keine vorhandene. +Diese Konfigurationsdatei enthält auch die Informationen, +die zur Rekonstruktion der Festplatten-Einhängepunkte erforderlich +sind, falls Sie das gesamte System verlieren. +
+
+
+
+
+
+-v, --verbose +
+Gibt mehr Informationen auf dem Bildschirm aus. +Wenn einmal angegeben, werden ausgeschlossene Dateien +und zusätzliche Statistiken gedruckt. +Diese Option hat keine Auswirkung auf die Protokolldateien. +
+
+
+
+
+
+-q, --quiet +
+Gibt weniger Informationen auf dem Bildschirm aus. +Wenn einmal angegeben, wird die Fortschrittsleiste entfernt; +zweimal, die laufenden Operationen; dreimal, die Info-Meldungen; +viermal, die Statusmeldungen. +Schwerwiegende Fehler werden immer auf dem Bildschirm ausgegeben. +Diese Option hat keine Auswirkung auf die Protokolldateien. +
+
+
+
+
+
+-H, --help +
+Gibt eine kurze Hilfeanzeige aus. +
+
+
+
+
+
+-V, --version +
+Gibt die Programmversion aus. +
+
+
+
+
+

+Configuration +

+

SnapRAID benötigt eine Konfigurationsdatei, um zu wissen, wo sich +Ihr Festplatten-Array befindet und wo die Paritätsinformationen +gespeichert werden sollen. +

Unter Unix wird die Datei `/usr/local/etc/snapraid.conf` verwendet, +falls sie existiert, andernfalls `/etc/snapraid.conf`. +Unter Windows wird die Datei `snapraid.conf` im selben +Verzeichnis wie `snapraid.exe` verwendet. +

Sie muss die folgenden Optionen (Groß- und Kleinschreibung beachten) +enthalten: +

+

+parity FILE [,FILE] ... +

+

Definiert die Dateien, die zum Speichern der Paritätsinformationen +verwendet werden sollen. Die Parität ermöglicht den Schutz +vor einem einzelnen Festplattenausfall, ähnlich wie bei RAID5. +

Sie können mehrere Dateien angeben, die sich auf unterschiedlichen +Festplatten befinden müssen. Wenn eine Datei nicht mehr wachsen +kann, wird die nächste verwendet. Der gesamte verfügbare Platz +muss mindestens so groß sein wie die größte Datenfestplatte im +Array. +

Sie können später zusätzliche Paritätsdateien hinzufügen, aber Sie +können sie nicht neu anordnen oder entfernen. +

Das Reservieren der Paritätsfestplatten für Parität stellt sicher, +dass sie nicht fragmentiert werden, was die Leistung verbessert. +

Unter Windows werden 256 MB auf jeder Festplatte ungenutzt gelassen, +um die Warnung vor vollen Festplatten zu vermeiden. +

Diese Option ist obligatorisch und kann nur einmal verwendet werden. +

+
+

+(2,3,4,5,6)-parity FILE [,FILE] ... +

+

Definiert die Dateien, die zum Speichern zusätzlicher Paritätsinformationen +verwendet werden sollen. +

Für jede angegebene Paritätsstufe wird eine zusätzliche Schutzstufe +aktiviert: +

    +
  • +2-parity aktiviert RAID6 Dual-Parität. +
  • +
  • +3-parity aktiviert Triple-Parität. +
  • +
  • +4-parity aktiviert Quad- (vierfache) Parität. +
  • +
  • +5-parity aktiviert Penta- (fünffache) Parität. +
  • +
  • +6-parity aktiviert Hexa- (sechsfache) Parität. +
  • +
+

Jede Paritätsstufe erfordert die Anwesenheit aller vorherigen +Paritätsstufen. +

Die gleichen Überlegungen wie bei der Option 'parity' gelten. +

Diese Optionen sind optional und können nur einmal verwendet werden. +

+
+

+z-parity FILE [,FILE] ... +

+

Definiert eine alternative Datei und ein alternatives Format zum +Speichern von Triple-Parität. +

Diese Option ist eine Alternative zu '3-parity', die primär für +Low-End-CPUs wie ARM oder AMD Phenom, Athlon und Opteron gedacht +ist, die den SSSE3-Befehlssatz nicht unterstützen. In solchen Fällen +bietet sie eine bessere Leistung. +

Dieses Format ähnelt dem von ZFS RAIDZ3, ist aber schneller. +Wie ZFS funktioniert es nicht jenseits der Triple-Parität. +

Bei Verwendung von '3-parity' werden Sie gewarnt, wenn das +'z-parity'-Format zur Leistungsverbesserung empfohlen wird. +

Es ist möglich, von einem Format in ein anderes zu konvertieren, +indem die Konfigurationsdatei mit der gewünschten z-parity- oder +3-parity-Datei angepasst und `fix` zur Neuerstellung verwendet wird. +

+
+

+content FILE +

+

Definiert die Datei, die zum Speichern der Liste und Prüfsummen +aller im Festplatten-Array vorhandenen Dateien verwendet werden soll. +

Sie kann auf einer für Daten, Parität oder einer anderen +verfügbaren Festplatte platziert werden. +Wenn Sie eine Datenfestplatte verwenden, wird diese Datei automatisch +vom `sync`-Vorgang ausgeschlossen. +

Diese Option ist obligatorisch und kann mehrmals verwendet werden, +um mehrere Kopien derselben Datei zu speichern. +

Sie müssen mindestens eine Kopie für jede verwendete Paritätsfestplatte +plus eine speichern. Die Verwendung zusätzlicher Kopien schadet nicht. +

+
+

+data NAME DIR +

+

Definiert den Namen und den Einhängepunkt (Mount Point) der +Datenfestplatten im Array. NAME wird zur Identifizierung der +Festplatte verwendet und muss eindeutig sein. DIR ist der +Einhängepunkt der Festplatte im Dateisystem. +

Sie können den Einhängepunkt nach Bedarf ändern, solange Sie +den NAME unverändert lassen. +

Sie sollten eine Option für jede Datenfestplatte im Array verwenden. +

Sie können eine Festplatte später umbenennen, indem Sie den NAME +direkt in der Konfigurationsdatei ändern und dann einen `sync`-Befehl +ausführen. Im Falle einer Umbenennung erfolgt die Zuordnung +mithilfe der gespeicherten UUID der Festplatten. +

+
+

+nohidden +

+

Schließt alle versteckten Dateien und Verzeichnisse aus. +Unter Unix sind versteckte Dateien solche, die mit `.` beginnen. +Unter Windows sind es solche mit dem versteckten Attribut. +

+
+

+exclude/include PATTERN +

+

Definiert die Datei- oder Verzeichnismuster, die im `sync`-Vorgang +ausgeschlossen oder eingeschlossen werden sollen. +Alle Muster werden in der angegebenen Reihenfolge verarbeitet. +

Wenn das erste übereinstimmende Muster ein `exclude`-Muster ist, +wird die Datei ausgeschlossen. Wenn es ein `include`-Muster ist, +wird die Datei eingeschlossen. Wenn kein Muster übereinstimmt, +wird die Datei ausgeschlossen, wenn das zuletzt angegebene Muster +ein `include` ist, oder eingeschlossen, wenn das zuletzt angegebene +Muster ein `exclude` ist. +

Weitere Details zu Musterspezifikationen finden Sie im Abschnitt +PATTERN. +

Diese Option kann mehrmals verwendet werden. +

+
+

+blocksize SIZE_IN_KIBIBYTES +

+

Definiert die grundlegende Blockgröße in Kibibytes für die Parität. +Ein Kibibyte entspricht 1024 Bytes. +

Die Standard-Blockgröße ist 256, was für die meisten Fälle +ausreichen sollte. +

WARNUNG! Diese Option ist nur für Experten gedacht, und es wird +dringend empfohlen, diesen Wert nicht zu ändern. Um diesen Wert +zukünftig zu ändern, müssen Sie die gesamte Parität neu erstellen! +

Ein Grund für die Verwendung einer anderen Blockgröße ist, wenn Sie +viele kleine Dateien in der Größenordnung von Millionen haben. +

Für jede Datei, auch wenn sie nur wenige Bytes groß ist, wird ein +ganzer Block Parität zugewiesen, und bei vielen Dateien kann dies +zu erheblichem ungenutztem Paritätsplatz führen. Wenn Sie die +Paritätsfestplatte vollständig füllen, dürfen Sie keine weiteren +Dateien zu den Datenfestplatten hinzufügen. +Der verschwendete Paritätsplatz akkumuliert sich jedoch nicht über +die Datenfestplatten hinweg. Verschwendeter Platz, der durch eine +hohe Anzahl von Dateien auf einer Datenfestplatte entsteht, begrenzt +nur die Datenmenge auf dieser Datenfestplatte, nicht auf anderen. +

Als Annäherung können Sie davon ausgehen, dass die Hälfte der +Blockgröße für jede Datei verschwendet wird. Mit beispielsweise +100.000 Dateien und einer Blockgröße von 256 KiB verschwenden +Sie 12,8 GB Parität, was zu 12,8 GB weniger verfügbarem Speicherplatz +auf der Datenfestplatte führen kann. +

Sie können die Menge des verschwendeten Platzes auf jeder Festplatte +mithilfe von `status` überprüfen. Dies ist die Menge an Platz, die Sie +auf den Datenfestplatten freilassen oder für Dateien verwenden müssen, +die nicht im Array enthalten sind. Wenn dieser Wert negativ ist, +bedeutet dies, dass Sie kurz davor sind, die Parität zu füllen, +und er stellt den Platz dar, den Sie noch verschwenden können. +

Um dieses Problem zu vermeiden, können Sie eine größere Partition +für die Parität verwenden. Wenn die Paritätspartition beispielsweise +12,8 GB größer ist als die Datenfestplatten, haben Sie genügend +zusätzlichen Platz, um bis zu 100.000 Dateien auf jeder Datenfestplatte +ohne verschwendeten Platz zu verarbeiten. +

Ein Trick, um eine größere Paritätspartition unter Linux zu erhalten, +ist die Formatierung mit dem Befehl: +

+mkfs.ext4 -m 0 -T largefile4 DEVICE
+
+

Dies führt zu etwa 1,5% zusätzlichem Speicherplatz, ungefähr 60 GB +für eine 4 TB Festplatte, was etwa 460.000 Dateien auf jeder +Datenfestplatte ohne verschwendeten Platz ermöglicht. +

+
+

+hashsize SIZE_IN_BYTES +

+

Definiert die Hash-Größe in Bytes für die gespeicherten Blöcke. +

Die Standard-Hash-Größe beträgt 16 Bytes (128 Bit), was für die +meisten Fälle ausreichen sollte. +

WARNUNG! Diese Option ist nur für Experten gedacht, und es wird +dringend empfohlen, diesen Wert nicht zu ändern. Um diesen Wert +zukünftig zu ändern, müssen Sie die gesamte Parität neu erstellen! +

Ein Grund für die Verwendung einer anderen Hash-Größe ist, wenn Ihr +System über begrenzten Speicher verfügt. Als Faustregel benötigt +SnapRAID typischerweise 1 GiB RAM für jede 16 TB Daten im Array. +

Genauer gesagt benötigt SnapRAID zum Speichern der Hashes der Daten +ungefähr TS*(1+HS)/BS Bytes RAM, +wobei TS die Gesamtgröße in Bytes Ihres Festplatten-Arrays ist, +BS die Blockgröße in Bytes und HS die Hash-Größe in Bytes. +

Mit beispielsweise 8 Festplatten à 4 TB, einer Blockgröße von 256 KiB +(1 KiB = 1024 Bytes) und einer Hash-Größe von 16 erhalten Sie: +

+RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB
+
+

Bei einem Wechsel zu einer Hash-Größe von 8 erhalten Sie: +

+RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB
+
+

Bei einem Wechsel zu einer Blockgröße von 512 erhalten Sie: +

+RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB
+
+

Bei einem Wechsel zu einer Hash-Größe von 8 und einer Blockgröße +von 512 erhalten Sie: +

+RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB
+
+
+
+

+autosave SIZE_IN_GIGABYTES +

+

Speichert den Zustand beim Synchronisieren oder Scrubben automatisch +nach der angegebenen Menge an verarbeiteten GB. +Diese Option ist nützlich, um zu vermeiden, dass lange `sync`-Befehle +von vorne gestartet werden müssen, wenn sie durch einen Maschinenabsturz +oder ein anderes Ereignis unterbrochen werden. +

+
+

+temp_limit TEMPERATURE_CELSIUS +

+

Legt die maximal zulässige Festplattentemperatur in Celsius fest. +Wenn angegeben, überprüft SnapRAID regelmäßig die Temperatur aller +Festplatten mithilfe des smartctl-Tools. Die aktuellen Festplattentemperaturen +werden während des Betriebs von SnapRAID angezeigt. Wenn eine Festplatte +diesen Grenzwert überschreitet, werden alle Vorgänge gestoppt, und +die Festplatten werden für die durch die Option `temp_sleep` definierte +Dauer heruntergefahren (in den Standby-Modus versetzt). Nach der +Schlafperiode werden die Vorgänge fortgesetzt und möglicherweise +erneut pausiert, wenn der Temperaturgrenzwert erneut erreicht wird. +

Während des Betriebs analysiert SnapRAID auch die Heizkurve jeder +Festplatte und schätzt die langfristige stationäre Temperatur, die +erwartet wird, wenn die Aktivität fortgesetzt wird. Die Schätzung +wird nur durchgeführt, nachdem die Festplattentemperatur viermal +angestiegen ist, um sicherzustellen, dass genügend Datenpunkte +zur Verfügung stehen, um einen zuverlässigen Trend festzustellen. +Diese vorhergesagte stationäre Temperatur wird in Klammern neben +dem aktuellen Wert angezeigt und hilft bei der Beurteilung, ob die +Kühlung des Systems ausreichend ist. Diese geschätzte Temperatur +dient nur zu Informationszwecken und hat keine Auswirkung auf das +Verhalten von SnapRAID. Die Aktionen des Programms basieren +ausschließlich auf den tatsächlich gemessenen Festplattentemperaturen. +

Um diese Analyse durchzuführen, benötigt SnapRAID eine Referenz für +die Systemtemperatur. Es versucht zunächst, diese von verfügbaren +Hardwaresensoren zu lesen. Wenn kein Systemsensor zugänglich ist, +wird die niedrigste zu Beginn des Laufs gemessene Festplattentemperatur +als Fallback-Referenz verwendet. +

Normalerweise zeigt SnapRAID nur die Temperatur der heißesten +Festplatte an. Um die Temperatur aller Festplatten anzuzeigen, +verwenden Sie die Option -A oder --stats. +

+
+

+temp_sleep TIME_IN_MINUTES +

+

Legt die Standby-Zeit in Minuten fest, wenn der Temperaturgrenzwert +erreicht wird. Während dieser Zeit bleiben die Festplatten heruntergefahren. +Der Standardwert ist 5 Minuten. +

+
+

+pool DIR +

+

Definiert das Pooling-Verzeichnis, in dem die virtuelle Ansicht des +Festplatten-Arrays mithilfe des Befehls `pool` erstellt wird. +

Das Verzeichnis muss bereits existieren. +

+
+

+share UNC_DIR +

+

Definiert den Windows UNC-Pfad, der für den Remote-Zugriff auf die +Festplatten erforderlich ist. +

Wenn diese Option angegeben ist, verwenden die im Pool-Verzeichnis +erstellten symbolischen Links diesen UNC-Pfad, um auf die Festplatten +zuzugreifen. Ohne diese Option verwenden die generierten symbolischen +Links nur lokale Pfade, was die Freigabe des Pool-Verzeichnisses +über das Netzwerk nicht ermöglicht. +

Die symbolischen Links werden unter Verwendung des angegebenen UNC-Pfads +gebildet, wobei der in der `data`-Option angegebene Festplattenname +und schließlich das Dateiverzeichnis und der Name hinzugefügt werden. +

Diese Option ist nur für Windows erforderlich. +

+
+

+smartctl DISK/PARITY OPTIONS... +

+

Definiert benutzerdefinierte smartctl-Optionen, um die SMART-Attribute +für jede Festplatte abzurufen. Dies kann für RAID-Controller und einige +USB-Festplatten erforderlich sein, die nicht automatisch erkannt +werden können. Der Platzhalter %s wird durch den Gerätenamen ersetzt, +ist aber für feste Geräte wie RAID-Controller optional. +

DISK ist derselbe Festplattenname, der in der `data`-Option angegeben +ist. PARITY ist einer der Paritätsnamen: `parity`, `2-parity`, +`3-parity`, `4-parity`, `5-parity`, `6-parity` oder `z-parity`. +

In den angegebenen OPTIONS wird die Zeichenfolge `%s` durch den +Gerätenamen ersetzt. Bei RAID-Controllern ist das Gerät +wahrscheinlich fest, und Sie müssen `%s` möglicherweise nicht verwenden. +

Weitere mögliche Optionen finden Sie in der smartmontools-Dokumentation: +

+https://www.smartmontools.org/wiki/Supported_RAID-Controllers
+https://www.smartmontools.org/wiki/Supported_USB-Devices
+
+

Zum Beispiel: +

+smartctl parity -d sat %s
+
+
+
+

+smartignore DISK/PARITY ATTR [ATTR...] +

+

Ignoriert das angegebene SMART-Attribut bei der Berechnung der +Wahrscheinlichkeit eines Festplattenausfalls. Diese Option ist +nützlich, wenn eine Festplatte ungewöhnliche oder irreführende +Werte für ein bestimmtes Attribut meldet. +

DISK ist derselbe Festplattenname, der in der `data`-Option angegeben +ist. PARITY ist einer der Paritätsnamen: `parity`, `2-parity`, +`3-parity`, `4-parity`, `5-parity`, `6-parity` oder `z-parity`. +Der Sonderwert * kann verwendet werden, um das Attribut auf allen +Festplatten zu ignorieren. +

Um beispielsweise das Attribut `Current Pending Sector Count` auf allen +Festplatten zu ignorieren: +

+smartignore * 197
+
+

Um es nur auf der ersten Paritätsfestplatte zu ignorieren: +

+smartignore parity 197
+
+
+
+

+Examples +

+

Ein Beispiel für eine typische Konfiguration für Unix ist: +

+parity /mnt/diskp/snapraid.parity
+content /mnt/diskp/snapraid.content
+content /var/snapraid/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+exclude /lost+found/
+exclude /tmp/
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/sg0
+smartctl 2-parity -d areca,2/1 /dev/sg0
+
+

Ein Beispiel für eine typische Konfiguration für Windows ist: +

+parity E:\snapraid.parity
+content E:\snapraid.content
+content C:\snapraid\snapraid.content
+data d1 G:\array\
+data d2 H:\array\
+data d3 I:\array\
+exclude Thumbs.db
+exclude \$RECYCLE.BIN
+exclude \System Volume Information
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/arcmsr0
+smartctl 2-parity -d areca,2/1 /dev/arcmsr0
+
+
+
+
+

+Pattern +

+

Muster bieten eine flexible Möglichkeit, Dateien für die Einbeziehung oder +den Ausschluss zu filtern. Durch die Verwendung von Globbing-Zeichen können Sie Regeln definieren, +die mit bestimmten Dateinamen oder ganzen Verzeichnisstrukturen übereinstimmen, ohne +jeden Pfad manuell auflisten zu müssen. +

Das Fragezeichen `?` entspricht einem beliebigen einzelnen Zeichen außer dem +Verzeichnistrennzeichen. Dies macht es nützlich für den Abgleich von Dateinamen mit variablen +Zeichen, während das Muster auf eine einzelne Verzeichnisebene beschränkt bleibt. +

Der einfache Stern `*` entspricht einer beliebigen Folge von Zeichen, aber wie das +Fragezeichen überschreitet er niemals Verzeichnisgrenzen. Er stoppt beim +Schrägstrich, was ihn für den Abgleich innerhalb einer einzelnen Pfadkomponente +geeignet macht. Dies ist das Standardverhalten von Wildcards, das vom Shell- +Globbing bekannt ist. +

Der Doppelstern `**` ist mächtiger; er entspricht jeder Folge von +Zeichen einschließlich Verzeichnistrennzeichen. Dies ermöglicht es Mustern, über +mehrere Verzeichnisebenen hinweg übereinzustimmen. Wenn `**` direkt in +ein Muster eingebettet ist, kann es null oder mehr Zeichen einschließlich Schrägstrichen zwischen +dem umgebenden wörtlichen Text entsprechen. +

Die wichtigste Verwendung von `**` ist in der speziellen Form `/**/`. Dies entspricht +null oder mehr vollständigen Verzeichnisebenen, was es möglich macht, Dateien +in jeder Tiefe eines Verzeichnisbaums abzugleichen, ohne die genaue Pfadstruktur zu kennen. +Zum Beispiel entspricht das Muster `src/**/main.js` dem Pfad `src/main.js` (Überspringen +von null Verzeichnissen), `src/ui/main.js` (Überspringen eines Verzeichnisses) und +`src/ui/components/main.js` (Überspringen von zwei Verzeichnissen). +

Zeichenklassen mit eckigen Klammern `[]` entsprechen einem einzelnen Zeichen aus einer +bestimmten Menge oder einem Bereich. Wie die anderen Einzelzeichenmuster +entsprechen sie nicht den Verzeichnistrennzeichen. Klassen unterstützen Bereiche und Negierung durch +ein Ausrufezeichen. +

Der grundlegende Unterschied, den man sich merken sollte, ist, dass `*`, `?` und Zeichenklassen +alle Verzeichnisgrenzen respektieren und nur innerhalb einer einzelnen Pfadkomponente +übereinstimmen, während `**` das einzige Muster ist, das über Verzeichnistrennzeichen +hinweg übereinstimmen kann. +

Es gibt vier verschiedene Arten von Mustern: +

+
+
+FILE +
+Wählt jede Datei mit dem Namen FILE aus. +Dieses Muster gilt nur für Dateien, nicht für Verzeichnisse. +
+
+
+
+
+
+DIR/ +
+Wählt jedes Verzeichnis mit dem Namen DIR und alles darin aus. +Dieses Muster gilt nur für Verzeichnisse, nicht für Dateien. +
+
+
+
+
+
+/PATH/FILE +
+Wählt den exakt angegebenen Dateipfad aus. Dieses Muster gilt +nur für Dateien, nicht für Verzeichnisse. +
+
+
+
+
+
+/PATH/DIR/ +
+Wählt den exakt angegebenen Verzeichnispfad und alles darin aus. +Dieses Muster gilt nur für Verzeichnisse, nicht für Dateien. +
+
+
+

Wenn Sie einen absoluten Pfad angeben, der mit / beginnt, wird er +auf das Array-Stammverzeichnis angewendet, nicht auf das lokale +Dateisystem-Stammverzeichnis. +

Unter Windows können Sie den Backslash \ anstelle des Forward-Slash / +verwenden. Windows-Systemverzeichnisse, Junctions, Einhängepunkte +(Mount Points) und andere spezielle Windows-Verzeichnisse werden +als Dateien behandelt, was bedeutet, dass Sie zum Ausschließen +eine Dateiregel verwenden müssen, nicht eine Verzeichnisregel. +

Wenn der Dateiname ein Zeichen '*', '?', '[', oder ']' enthält, +müssen Sie es escapen, um zu vermeiden, dass es als Globbing-Zeichen +interpretiert wird. Unter Unix ist das Escape-Zeichen '\'; unter +Windows ist es '^'. Wenn sich das Muster in der Befehlszeile befindet, +müssen Sie das Escape-Zeichen verdoppeln, um zu vermeiden, dass es +von der Befehlsshell interpretiert wird. +

In der Konfigurationsdatei können Sie verschiedene Strategien zum +Filtern der zu verarbeitenden Dateien verwenden. +Der einfachste Ansatz besteht darin, nur `exclude`-Regeln zu verwenden, +um alle Dateien und Verzeichnisse zu entfernen, die Sie nicht +verarbeiten möchten. Zum Beispiel: +

+# Schließt jede Datei namens `*.unrecoverable` aus
+exclude *.unrecoverable
+# Schließt das Stammverzeichnis `/lost+found` aus
+exclude /lost+found/
+# Schließt jedes Unterverzeichnis namens `tmp` aus
+exclude tmp/
+
+

Der gegenteilige Ansatz besteht darin, nur die Dateien zu definieren, +die Sie verarbeiten möchten, indem Sie nur `include`-Regeln verwenden. +Zum Beispiel: +

+# Schließt nur einige Verzeichnisse ein
+include /movies/
+include /musics/
+include /pictures/
+
+

Der letzte Ansatz besteht darin, `exclude`- und `include`-Regeln +zu mischen. In diesem Fall ist die Reihenfolge der Regeln wichtig. +Frühere Regeln haben Vorrang vor späteren. +Zur Vereinfachung können Sie zuerst alle `exclude`-Regeln und +dann alle `include`-Regeln auflisten. Zum Beispiel: +

+# Schließt jede Datei namens `*.unrecoverable` aus
+exclude *.unrecoverable
+# Schließt jedes Unterverzeichnis namens `tmp` aus
+exclude tmp/
+# Schließt nur einige Verzeichnisse ein
+include /movies/
+include /musics/
+include /pictures/
+
+

In der Befehlszeile können Sie mit der Option -f nur `include`-Muster +verwenden. Zum Beispiel: +

+# Überprüft nur die .mp3-Dateien.
+# Unter Unix Anführungszeichen verwenden, um die Globbing-Erweiterung durch die Shell zu vermeiden.
+snapraid -f "*.mp3" check
+
+

Unter Unix müssen Sie Globbing-Zeichen in der Befehlszeile in +Anführungszeichen setzen, um zu verhindern, dass die Shell sie erweitert. +

+
+

+Dateien Ignorieren +

+

Zusätzlich zu den globalen Regeln in der Konfigurationsdatei können Sie +`.snapraidignore`-Dateien in jedem Verzeichnis innerhalb des Arrays platzieren, +um dezentrale Ausschlussregeln zu definieren. +

Regeln, die in `.snapraidignore` definiert sind, werden nach den Regeln in der +Konfigurationsdatei angewendet. Dies bedeutet, dass sie eine höhere Priorität haben +und verwendet werden können, um Dateien auszuschließen, die zuvor durch die globale +Konfiguration eingeschlossen wurden. Effektiv wird eine Datei ausgeschlossen, wenn +eine lokale Regel zutrifft, unabhängig von den globalen Include-Einstellungen. +

Die Musterlogik in `.snapraidignore` spiegelt die globale Konfiguration wider, +verankert die Muster jedoch an dem Verzeichnis, in dem sich die Datei befindet: +

+
+
+FILE +
+Wählt jede Datei namens FILE in diesem Verzeichnis oder darunter aus. +Dies folgt denselben Globbing-Regeln wie das globale Muster. +
+
+
+
+
+
+DIR/ +
+Wählt jedes Verzeichnis namens DIR und alles darin aus, das sich +in diesem Verzeichnis oder darunter befindet. +
+
+
+
+
+
+/PATH/FILE +
+Wählt die exakt angegebene Datei relativ zum Speicherort +der `.snapraidignore`-Datei aus. +
+
+
+
+
+
+/PATH/DIR/ +
+Wählt das exakt angegebene Verzeichnis und alles darin aus, +relativ zum Speicherort der `.snapraidignore`-Datei. +
+
+
+

Im Gegensatz zur globalen Konfiguration unterstützen `.snapraidignore`-Dateien nur +Ausschlussregeln; Sie können keine `include`-Muster oder Negationen (!) verwenden. +

Wenn Sie beispielsweise eine `.snapraidignore` in `/mnt/disk1/projects/` haben: +

+# Schließt NUR /mnt/disk1/projects/output.bin aus
+/output.bin
+# Schließt jedes Verzeichnis namens 'build' innerhalb von projects/ aus
+build/
+# Schließt jede .tmp-Datei innerhalb von projects/ oder deren Unterordnern aus
+*.tmp
+
+
+
+

+Content +

+

SnapRAID speichert die Liste und Prüfsummen Ihrer Dateien in der +Content-Datei. +

Es ist eine Binärdatei, die alle im Festplatten-Array vorhandenen +Dateien auflistet, zusammen mit allen Prüfsummen zur Überprüfung +ihrer Integrität. +

Diese Datei wird von den Befehlen `sync` und `scrub` gelesen und +geschrieben und von den Befehlen `fix`, `check` und `status` gelesen. +

+
+

+Parity +

+

SnapRAID speichert die Paritätsinformationen Ihres Arrays in den +Paritätsdateien. +

Dies sind Binärdateien, die die berechnete Parität aller in der +`content`-Datei definierten Blöcke enthalten. +

Diese Dateien werden von den Befehlen `sync` und `fix` gelesen +und geschrieben und nur von den Befehlen `scrub` und `check` gelesen. +

+
+

+Encoding +

+

SnapRAID ignoriert unter Unix jede Kodierung. Es liest und speichert +die Dateinamen mit derselben Kodierung, die vom Dateisystem +verwendet wird. +

Unter Windows werden alle vom Dateisystem gelesenen Namen konvertiert +und im UTF-8-Format verarbeitet. +

Um Dateinamen korrekt auszugeben, müssen Sie die Windows-Konsole +mit dem Befehl `chcp 65001` auf den UTF-8-Modus einstellen und +eine TrueType-Schriftart wie `Lucida Console` als Konsolenschriftart +verwenden. Dies betrifft nur die gedruckten Dateinamen; wenn Sie +die Konsolenausgabe in eine Datei umleiten, ist die resultierende +Datei immer im UTF-8-Format. +

+ + +
+
+
+ + + + + + + diff --git a/beta/manual-es.html b/beta/manual-es.html new file mode 100644 index 00000000..9f084d07 --- /dev/null +++ b/beta/manual-es.html @@ -0,0 +1,2053 @@ + + + + + + + + SnapRAID Manual + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + +
+ +
+ +
+

+Synopsis +

+
+snapraid [-c, --conf CONFIG]
+    [-f, --filter PATTERN] [-d, --filter-disk NAME]
+    [-m, --filter-missing] [-e, --filter-error]
+    [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR]
+    [-p, --plan PERC|bad|new|full]
+    [-o, --older-than DAYS] [-l, --log FILE]
+    [-s, --spin-down-on-error] [-w, --bw-limit RATE]
+    [-Z, --force-zero] [-E, --force-empty]
+    [-U, --force-uuid] [-D, --force-device]
+    [-N, --force-nocopy] [-F, --force-full]
+    [-R, --force-realloc]
+    [-S, --start BLKSTART] [-B, --count BLKCOUNT]
+    [-L, --error-limit NUMBER]
+    [-A, --stats]
+    [-v, --verbose] [-q, --quiet]
+    status|smart|probe|up|down|diff|sync|scrub|fix|check
+    |list|dup|pool|devices|touch|rehash
+
+
+snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT]
+
+
+
+

+Description +

+

SnapRAID es un programa de copia de seguridad diseñado para arrays +de discos, que almacena información de paridad para la recuperación +de datos en caso de hasta seis fallos de disco. +

Destinado principalmente a centros de medios domésticos con archivos +grandes y que cambian con poca frecuencia, SnapRAID ofrece varias +características: +

    +
  • +Puede utilizar discos ya llenos de archivos sin la necesidad de +reformatearlos, accediendo a ellos como de costumbre. +
  • +
  • +Todos sus datos son hasheados para asegurar la integridad de los datos +y prevenir la corrupción silenciosa. +
  • +
  • +Cuando el número de discos fallidos excede el recuento de paridad, +la pérdida de datos se limita a los discos afectados; los datos en +otros discos siguen siendo accesibles. +
  • +
  • +Si elimina archivos accidentalmente en un disco, la recuperación es +posible. +
  • +
  • +Los discos pueden tener diferentes tamaños. +
  • +
  • +Puede agregar discos en cualquier momento. +
  • +
  • +SnapRAID no bloquea sus datos; puede dejar de usarlo +en cualquier momento sin reformatear ni mover datos. +
  • +
  • +Para acceder a un archivo, solo un único disco necesita girar, +ahorrando energía y reduciendo el ruido. +
  • +
+

Para más información, visite el sitio oficial de SnapRAID: +

+https://www.snapraid.it/
+
+
+
+

+Limitations +

+

SnapRAID es un híbrido entre un programa RAID y un programa de copia +de seguridad, con el objetivo de combinar los mejores beneficios de +ambos. Sin embargo, tiene algunas limitaciones que debe considerar +antes de usarlo. +

La principal limitación es que si un disco falla y no ha sincronizado +recientemente, es posible que no pueda recuperarse por completo. +Más específicamente, es posible que no pueda recuperar hasta el tamaño +de los archivos cambiados o eliminados desde la última operación de +sincronización. Esto ocurre incluso si los archivos cambiados o +eliminados no están en el disco fallido. Esta es la razón por la que +SnapRAID es más adecuado para datos que rara vez cambian. +

Por otro lado, los archivos recién agregados no impiden la recuperación +de los archivos ya existentes. Solo perderá los archivos recién +agregados si están en el disco fallido. +

Otras limitaciones de SnapRAID son: +

    +
  • +Con SnapRAID, aún tiene sistemas de archivos separados para cada disco. +Con RAID, obtiene un único sistema de archivos grande. +
  • +
  • +SnapRAID no distribuye (stripe) los datos. +Con RAID, obtiene un aumento de velocidad con la distribución. +
  • +
  • +SnapRAID no admite la recuperación en tiempo real. +Con RAID, no tiene que dejar de trabajar cuando falla un disco. +
  • +
  • +SnapRAID puede recuperar datos solo de un número limitado de fallos de disco. +Con una copia de seguridad, puede recuperarse de un fallo completo +de todo el array de discos. +
  • +
  • +Solo se guardan nombres de archivo, marcas de tiempo, enlaces simbólicos +y enlaces duros. Los permisos, la propiedad y los atributos +extendidos no se guardan. +
  • +
+
+
+

+Getting Started +

+

Para usar SnapRAID, primero debe seleccionar un disco en su array de +discos para dedicarlo a la información de `parity` (paridad). Con un +disco para paridad, podrá recuperarse de un solo fallo de disco, +similar a RAID5. +

Si desea recuperarse de más fallos de disco, similar a RAID6, +debe reservar discos adicionales para la paridad. Cada disco de +paridad adicional permite la recuperación de un fallo de disco más. +

Como discos de paridad, debe elegir los discos más grandes del array, +ya que la información de paridad puede crecer hasta el tamaño del +disco de datos más grande del array. +

Estos discos estarán dedicados a almacenar los archivos de `parity`. +No debe almacenar sus datos en ellos. +

Luego, debe definir los discos de `data` (datos) que desea proteger +con SnapRAID. La protección es más efectiva si estos discos +contienen datos que rara vez cambian. Por esta razón, es mejor +NO incluir el disco C:\ de Windows o los directorios /home, /var y +/tmp de Unix. +

La lista de archivos se guarda en los archivos de `content` (contenido), +generalmente almacenados en los discos de datos, paridad o de arranque. +Este archivo contiene los detalles de su copia de seguridad, +incluyendo todas las sumas de comprobación para verificar su integridad. +El archivo de `content` se almacena en múltiples copias, y cada copia +debe estar en un disco diferente para asegurar que, incluso en caso +de múltiples fallos de disco, al menos una copia esté disponible. +

Por ejemplo, suponga que solo está interesado en un nivel de paridad +de protección, y sus discos están ubicados en: +

+/mnt/diskp <- disco seleccionado para paridad
+/mnt/disk1 <- primer disco a proteger
+/mnt/disk2 <- segundo disco a proteger
+/mnt/disk3 <- tercer disco a proteger
+
+

Debe crear el archivo de configuración /etc/snapraid.conf con +las siguientes opciones: +

+parity /mnt/diskp/snapraid.parity
+content /var/snapraid/snapraid.content
+content /mnt/disk1/snapraid.content
+content /mnt/disk2/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+
+

Si está en Windows, debe usar el formato de ruta de Windows, con +letras de unidad y barras invertidas en lugar de barras. +

+parity E:\snapraid.parity
+content C:\snapraid\snapraid.content
+content F:\array\snapraid.content
+content G:\array\snapraid.content
+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+
+

Si tiene muchos discos y se queda sin letras de unidad, puede montar +discos directamente en subcarpetas. Consulte: +

+https://www.google.com/search?q=Windows+mount+point
+
+

En este punto, está listo para ejecutar el comando `sync` (sincronizar) +para construir la información de paridad. +

+snapraid sync
+
+

Este proceso puede llevar varias horas la primera vez, dependiendo +del tamaño de los datos ya presentes en los discos. Si los discos +están vacíos, el proceso es inmediato. +

Puede detenerlo en cualquier momento presionando Ctrl+C, y en la +siguiente ejecución, se reanudará donde se interrumpió. +

Cuando este comando se complete, sus datos estarán SEGUROS. +

Ahora puede comenzar a usar su array como desee y periódicamente +actualizar la información de paridad ejecutando el comando `sync`. +

+

+Scrubbing +

+

Para verificar periódicamente los datos y la paridad en busca de +errores, puede ejecutar el comando `scrub` (fregar/limpiar). +

+snapraid scrub
+
+

Este comando compara los datos de su array con el hash calculado +durante el comando `sync` para verificar la integridad. +

Cada ejecución del comando verifica aproximadamente el 8% del array, +excluyendo los datos ya fregados en los 10 días anteriores. +Puede usar la opción -p, --plan para especificar una cantidad +diferente y la opción -o, --older-than para especificar una edad +diferente en días. Por ejemplo, para verificar el 5% del array en +busca de bloques con más de 20 días, use: +

+snapraid -p 5 -o 20 scrub
+
+

Si se encuentran errores silenciosos o de entrada/salida durante el +proceso, los bloques correspondientes se marcan como defectuosos en +el archivo de `content` y se listan en el comando `status`. +

+snapraid status
+
+

Para corregirlos, puede usar el comando `fix` (arreglar), filtrando +por bloques defectuosos con la opción -e, --filter-error: +

+snapraid -e fix
+
+

En el siguiente `scrub`, los errores desaparecerán del informe de +`status` si realmente se han corregido. Para hacerlo más rápido, +puede usar -p bad para fregar solo los bloques marcados como defectuosos. +

+snapraid -p bad scrub
+
+

Ejecutar `scrub` en un array no sincronizado puede reportar errores +causados por archivos eliminados o modificados. Estos errores se +informan en la salida de `scrub`, pero los bloques relacionados no +se marcan como defectuosos. +

+
+

+Pooling +

+

Nota: La función de pooling descrita a continuación ha sido +sustituida por la herramienta mergefs, que ahora es la opción +recomendada para los usuarios de Linux en la comunidad SnapRAID. +Mergefs proporciona una forma más flexible y eficiente de agrupar +múltiples unidades en un único punto de montaje unificado, +permitiendo un acceso sin problemas a los archivos en todo su array +sin depender de enlaces simbólicos. Se integra bien con SnapRAID +para la protección de paridad y se usa comúnmente en configuraciones +como OpenMediaVault (OMV) o configuraciones NAS personalizadas. +

Para que todos los archivos de su array se muestren en el mismo árbol +de directorios, puede habilitar la función de `pooling` (agrupación). +Crea una vista virtual de solo lectura de todos los archivos de su +array utilizando enlaces simbólicos. +

Puede configurar el directorio de `pooling` en el archivo de +configuración con: +

+pool /pool
+
+

o, si está en Windows, con: +

+pool C:\pool
+
+

y luego ejecute el comando `pool` para crear o actualizar la vista virtual. +

+snapraid pool
+
+

Si está utilizando una plataforma Unix y desea compartir este +directorio a través de la red con máquinas Windows o Unix, debe +agregar las siguientes opciones a su /etc/samba/smb.conf: +

+# En la sección global de smb.conf
+unix extensions = no
+
+
+# En la sección de compartir de smb.conf
+[pool]
+comment = Pool
+path = /pool
+read only = yes
+guest ok = yes
+wide links = yes
+follow symlinks = yes
+
+

En Windows, compartir enlaces simbólicos a través de una red requiere +que los clientes los resuelvan de forma remota. Para habilitar esto, +además de compartir el directorio pool, también debe compartir todos +los discos de forma independiente, utilizando los nombres de disco +definidos en el archivo de configuración como puntos de recurso +compartido. También debe especificar en la opción `share` del archivo +de configuración la ruta UNC de Windows que los clientes remotos +necesitan usar para acceder a estos discos compartidos. +

Por ejemplo, operando desde un servidor llamado `darkstar`, puede usar +las opciones: +

+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+pool C:\pool
+share \\darkstar
+
+

y compartir los siguientes directorios a través de la red: +

+\\darkstar\pool -> C:\pool
+\\darkstar\d1 -> F:\array
+\\darkstar\d2 -> G:\array
+\\darkstar\d3 -> H:\array
+
+

para permitir que los clientes remotos accedan a todos los archivos +en \\darkstar\pool. +

También puede que deba configurar los clientes remotos para habilitar +el acceso a enlaces simbólicos remotos con el comando: +

+fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
+
+
+
+

+Undeleting +

+

SnapRAID funciona más como un programa de copia de seguridad que como +un sistema RAID, y se puede usar para restaurar o recuperar archivos +a su estado anterior usando la opción -f, --filter: +

+snapraid fix -f FILE
+
+

o para un directorio: +

+snapraid fix -f DIR/
+
+

También puede usarlo para recuperar solo archivos eliminados +accidentalmente dentro de un directorio usando la opción -m, +--filter-missing, que restaura solo archivos faltantes, dejando +todos los demás intactos. +

+snapraid fix -m -f DIR/
+
+

O para recuperar todos los archivos eliminados en todas las unidades con: +

+snapraid fix -m
+
+
+
+

+Recovering +

+

Ha sucedido lo peor, ¡y ha perdido uno o más discos! +

¡NO ENTRE EN PÁNICO! ¡Podrá recuperarlos! +

Lo primero que debe hacer es evitar más cambios en su array de discos. +Deshabilite cualquier conexión remota a él y cualquier proceso +programado, incluida cualquier sincronización o fregado nocturno +programado de SnapRAID. +

Luego, proceda con los siguientes pasos. +

+

+STEP 1 -> Reconfigure +

+

Necesita algo de espacio para recuperarse, idealmente en discos de +repuesto adicionales, pero un disco USB externo o un disco remoto +serán suficientes. +

Modifique el archivo de configuración de SnapRAID para hacer que la +opción `data` o `parity` del disco fallido apunte a una ubicación +con suficiente espacio vacío para recuperar los archivos. +

Por ejemplo, si el disco `d1` ha fallado, cambie de: +

+data d1 /mnt/disk1/
+
+

a: +

+data d1 /mnt/new_spare_disk/
+
+

Si el disco a recuperar es un disco de paridad, actualice la opción +`parity` apropiada. +Si tiene varios discos fallidos, actualice todas sus opciones de +configuración. +

+
+

+STEP 2 -> Fix +

+

Ejecute el comando fix, almacenando el registro en un archivo externo con: +

+snapraid -d NAME -l fix.log fix
+
+

Donde NAME es el nombre del disco, como `d1` en nuestro ejemplo anterior. +Si el disco a recuperar es un disco de paridad, use los nombres `parity`, +`2-parity`, etc. +Si tiene varios discos fallidos, use varias opciones -d para +especificarlos todos. +

Este comando tardará mucho tiempo. +

Asegúrese de tener unos pocos gigabytes libres para almacenar el archivo +fix.log. Ejecútelo desde un disco con suficiente espacio libre. +

Ahora ha recuperado todo lo que es recuperable. Si algunos archivos son +parcial o totalmente irrecuperables, se les cambiará el nombre agregando +la extensión `.unrecoverable`. +

Puede encontrar una lista detallada de todos los bloques irrecuperables +en el archivo fix.log buscando todas las líneas que comienzan con `unrecoverable:`. +

Si no está satisfecho con la recuperación, puede volver a intentarlo +tantas veces como desee. +

Por ejemplo, si ha eliminado archivos del array después de la última +`sync`, esto puede resultar en que algunos archivos no se recuperen. +En este caso, puede volver a intentar el `fix` usando la opción -i, +--import, especificando dónde están esos archivos ahora para incluirlos +nuevamente en el proceso de recuperación. +

Si está satisfecho con la recuperación, puede continuar, +¡pero tenga en cuenta que después de sincronizar, no puede volver +a intentar el comando `fix`! +

+
+

+STEP 3 -> Check +

+

Como verificación cautelosa, ahora puede ejecutar un comando `check` +(comprobar) para asegurarse de que todo esté correcto en el disco +recuperado. +

+snapraid -d NAME -a check
+
+

Donde NAME es el nombre del disco, como `d1` en nuestro ejemplo anterior. +

Las opciones -d y -a le dicen a SnapRAID que compruebe solo el disco +especificado e ignore todos los datos de paridad. +

Este comando tardará mucho tiempo, pero si no es demasiado cauteloso, +puede omitirlo. +

+
+

+STEP 4 -> Sync +

+

Ejecute el comando `sync` para resincronizar el array con el nuevo disco. +

+snapraid sync
+
+

Si todo se recupera, este comando es inmediato. +

+
+
+
+

+Commands +

+

SnapRAID proporciona algunos comandos simples que le permiten: +

    +
  • +Imprimir el estado del array -> `status` +
  • +
  • +Controlar los discos -> `smart`, `probe`, `up`, `down` +
  • +
  • +Hacer una copia de seguridad/instantánea -> `sync` +
  • +
  • +Comprobar periódicamente los datos -> `scrub` +
  • +
  • +Restaurar la última copia de seguridad/instantánea -> `fix`. +
  • +
+

Los comandos deben escribirse en minúsculas. +

+

+status +

+

Imprime un resumen del estado del array de discos. +

Incluye información sobre la fragmentación de la paridad, la antigüedad +de los bloques sin verificar y todos los errores silenciosos +registrados encontrados durante el fregado. +

La información presentada se refiere a la última vez que ejecutó +`sync`. Las modificaciones posteriores no se tienen en cuenta. +

Si se detectaron bloques defectuosos, se enumeran sus números de bloque. +Para corregirlos, puede usar el comando `fix -e`. +

También muestra un gráfico que representa la última vez que cada +bloque fue fregado o sincronizado. Los bloques fregados se muestran +con '*', los bloques sincronizados pero aún no fregados con 'o'. +

Nada se modifica. +

+
+

+smart +

+

Imprime un informe SMART de todos los discos del sistema. +

Incluye una estimación de la probabilidad de fallo en el próximo +año, lo que le permite planificar reemplazos de mantenimiento de +discos que muestren atributos sospechosos. +

Esta estimación de probabilidad se obtiene correlacionando los +atributos SMART de los discos con los datos de Backblaze disponibles en: +

+https://www.backblaze.com/hard-drive-test-data.html
+
+

Si SMART informa que un disco está fallando, se imprime `FAIL` o +`PREFAIL` para ese disco, y SnapRAID regresa con un error. +En este caso, se recomienda encarecidamente el reemplazo inmediato +del disco. +

Otras posibles cadenas de estado son: +

+
+
+logfail +
+En el pasado, algunos atributos estaban por debajo del +umbral. +
+
+
+
+logerr +
+El registro de errores del dispositivo contiene errores. +
+
+
+
+selferr +
+El registro de autoprueba del dispositivo contiene errores. +
+
+
+

Si se especifica la opción -v, --verbose, se proporciona un análisis +estadístico más profundo. Este análisis puede ayudarle a decidir si +necesita más o menos paridad. +

Este comando utiliza la herramienta `smartctl` y es equivalente a +ejecutar `smartctl -a` en todos los dispositivos. +

Si sus dispositivos no se detectan automáticamente correctamente, puede +especificar un comando personalizado utilizando la opción `smartctl` +en el archivo de configuración. +

Nada se modifica. +

+
+

+probe +

+

Imprime el estado de ENERGÍA de todos los discos del sistema. +

`Standby` significa que el disco no está girando. `Active` significa +que el disco está girando. +

Este comando utiliza la herramienta `smartctl` y es equivalente a +ejecutar `smartctl -n standby -i` en todos los dispositivos. +

Si sus dispositivos no se detectan automáticamente correctamente, puede +especificar un comando personalizado utilizando la opción `smartctl` +en el archivo de configuración. +

Nada se modifica. +

+
+

+up +

+

Pone en marcha (gira) todos los discos del array. +

Puede poner en marcha solo discos específicos usando la opción -d, +--filter-disk. +

Poner en marcha todos los discos al mismo tiempo requiere mucha energía. +Asegúrese de que su fuente de alimentación pueda soportarlo. +

Nada se modifica. +

+
+

+down +

+

Detiene (deja de girar) todos los discos del array. +

Este comando utiliza la herramienta `smartctl` y es equivalente a +ejecutar `smartctl -s standby,now` en todos los dispositivos. +

Puede detener solo discos específicos usando la opción -d, +--filter-disk. +

Para detener automáticamente en caso de error, puede usar la opción -s, +--spin-down-on-error con cualquier otro comando, lo cual es +equivalente a ejecutar `down` manualmente cuando ocurre un error. +

Nada se modifica. +

+
+

+diff +

+

Enumera todos los archivos modificados desde el último `sync` que +necesitan que se vuelva a calcular su información de paridad. +

Este comando no verifica los datos del archivo, sino solo la marca +de tiempo, el tamaño y el inodo del archivo. +

Después de enumerar todos los archivos cambiados, se presenta un +resumen de los cambios, agrupados por: +

+
+
+equal +
+Archivos sin cambios desde antes. +
+
+
+
+added +
+Archivos agregados que no estaban presentes antes. +
+
+
+
+removed +
+Archivos eliminados. +
+
+
+
+updated +
+Archivos con un tamaño o marca de tiempo diferente, +lo que significa que fueron modificados. +
+
+
+
+moved +
+Archivos movidos a un directorio diferente en el mismo +disco. Se identifican por tener el mismo nombre, tamaño, +marca de tiempo e inodo, pero un directorio diferente. +
+
+
+
+copied +
+Archivos copiados en el mismo o un disco diferente. +Tenga en cuenta que si realmente se mueven a un disco +diferente, también se contarán en `removed`. +Se identifican por tener el mismo nombre, tamaño y +marca de tiempo. Si la marca de tiempo de subsegundo es +cero, la ruta completa debe coincidir, no solo el nombre. +
+
+
+
+restored +
+Archivos con un inodo diferente pero que coinciden +en nombre, tamaño y marca de tiempo. +Estos suelen ser archivos restaurados después de ser +eliminados. +
+
+
+

Si se requiere un `sync`, el código de retorno del proceso es 2, en +lugar del valor predeterminado 0. El código de retorno 1 se utiliza +para una condición de error genérico. +

Nada se modifica. +

+
+

+sync +

+

Actualiza la información de paridad. Todos los archivos modificados +en el array de discos se leen y la información de paridad +correspondiente se actualiza. +

Puede detener este proceso en cualquier momento presionando Ctrl+C, +sin perder el trabajo ya realizado. +En la siguiente ejecución, el proceso `sync` se reanudará donde +se interrumpió. +

Si se encuentran errores silenciosos o de entrada/salida durante el +proceso, los bloques correspondientes se marcan como defectuosos. +

Los archivos se identifican por ruta y/o inodo y se verifican por +tamaño y marca de tiempo. +Si el tamaño o la marca de tiempo del archivo difieren, la información +de paridad se vuelve a calcular para todo el archivo. +Si el archivo se mueve o se renombra en el mismo disco, manteniendo el +mismo inodo, la paridad no se vuelve a calcular. +Si el archivo se mueve a otro disco, la paridad se vuelve a calcular, +pero la información de hash calculada previamente se mantiene. +

Los archivos `content` y `parity` se modifican si es necesario. +Los archivos en el array NO se modifican. +

+
+

+scrub +

+

Frota (scrubs) el array, buscando errores silenciosos o de +entrada/salida en los discos de datos y paridad. +

Cada invocación verifica aproximadamente el 8% del array, excluyendo +los datos ya fregados en los últimos 10 días. +Esto significa que fregar una vez a la semana asegura que cada bit de +datos se verifique al menos una vez cada tres meses. +

Puede definir un plan de fregado o una cantidad diferente utilizando +la opción -p, --plan, que acepta: +bad - Fregar bloques marcados como defectuosos. +new - Fregar bloques recién sincronizados que aún no han sido fregados. +full - Fregar todo. +0-100 - Fregar el porcentaje especificado de bloques. +

Si especifica un valor de porcentaje, también puede usar la opción -o, +--older-than para definir la antigüedad del bloque. +Los bloques más antiguos se friegan primero, asegurando una verificación +óptima. +Si desea fregar solo los bloques recién sincronizados que aún no han +sido fregados, use la opción `-p new`. +

Para obtener detalles del estado del fregado, use el comando `status`. +

Para cualquier error silencioso o de entrada/salida encontrado, los +bloques correspondientes se marcan como defectuosos en el archivo +`content`. +Estos bloques defectuosos se enumeran en `status` y se pueden +corregir con `fix -e`. +Después de la corrección, en el siguiente fregado, se volverán a +verificar y, si se encuentran corregidos, se eliminará la marca de defectuoso. +Para fregar solo los bloques defectuosos, puede usar el comando +`scrub -p bad`. +

Se recomienda ejecutar `scrub` solo en un array sincronizado para evitar +errores reportados causados por datos no sincronizados. Estos errores +se reconocen como no siendo errores silenciosos y los bloques no se +marcan como defectuosos, pero tales errores se informan en la salida +del comando. +

El archivo `content` se modifica para actualizar el tiempo de la última +verificación de cada bloque y para marcar bloques defectuosos. +Los archivos `parity` NO se modifican. +Los archivos en el array NO se modifican. +

+
+

+fix +

+

Corrige todos los archivos y la información de paridad. +

Todos los archivos y la información de paridad se comparan con el +estado de instantánea guardado en el último `sync`. +Si se encuentra una diferencia, se revierte a la instantánea almacenada. +

¡ADVERTENCIA! El comando `fix` no diferencia entre errores y +modificaciones intencionales. Revierte incondicionalmente el estado +del archivo al último `sync`. +

Si no se especifica otra opción, se procesa todo el array. +Utilice las opciones de filtro para seleccionar un subconjunto de +archivos o discos para operar. +

Para corregir solo los bloques marcados como defectuosos durante `sync` +y `scrub`, use la opción -e, --filter-error. +A diferencia de otras opciones de filtro, esta aplica correcciones solo +a archivos que no han cambiado desde el último `sync`. +

SnapRAID cambia el nombre de todos los archivos que no se pueden corregir +agregando la extensión `.unrecoverable`. +

Antes de corregir, se escanea todo el array para encontrar cualquier +archivo movido desde la última operación de `sync`. +Estos archivos se identifican por su marca de tiempo, ignorando su +nombre y directorio, y se utilizan en el proceso de recuperación si +es necesario. +Si movió algunos de ellos fuera del array, puede usar la opción -i, +--import para especificar directorios adicionales para escanear. +

Los archivos se identifican solo por ruta, no por inodo. +

El archivo `content` NO se modifica. +Los archivos `parity` se modifican si es necesario. +Los archivos en el array se modifican si es necesario. +

+
+

+check +

+

Verifica todos los archivos y la información de paridad. +

Funciona como `fix`, pero solo simula una recuperación y no se +escriben cambios en el array. +

Este comando está destinado principalmente a la verificación manual, +como después de un proceso de recuperación o en otras condiciones +especiales. Para comprobaciones periódicas y programadas, use `scrub`. +

Si usa la opción -a, --audit-only, solo se verifican los datos del +archivo y se ignora la información de paridad para una ejecución más +rápida. +

Los archivos se identifican solo por ruta, no por inodo. +

Nada se modifica. +

+
+

+list +

+

Enumera todos los archivos contenidos en el array en el momento del +último `sync`. +

Con -v o --verbose, también se muestra el tiempo de subsegundo. +

Nada se modifica. +

+
+

+dup +

+

Enumera todos los archivos duplicados. Se supone que dos archivos son +iguales si sus hashes coinciden. Los datos del archivo no se leen; +solo se utilizan los hashes precalculados. +

Nada se modifica. +

+
+

+pool +

+

Crea o actualiza una vista virtual de todos +los archivos de su array de discos en el directorio de `pooling`. +

Los archivos no se copian sino que se enlazan usando +enlaces simbólicos. +

Al actualizar, todos los enlaces simbólicos existentes y los +subdirectorios vacíos se eliminan y se reemplazan con la nueva +vista del array. Cualquier otro archivo regular se deja en su lugar. +

Nada se modifica fuera del directorio pool. +

+
+

+devices +

+

Imprime los dispositivos de bajo nivel utilizados por el array. +

Este comando muestra las asociaciones de dispositivos en el array +y está destinado principalmente como una interfaz de script. +

Las primeras dos columnas son el ID y la ruta del dispositivo de bajo +nivel. Las siguientes dos columnas son el ID y la ruta del dispositivo +de alto nivel. La última columna es el nombre del disco en el array. +

En la mayoría de los casos, tiene un dispositivo de bajo nivel para +cada disco en el array, pero en algunas configuraciones más complejas, +puede tener múltiples dispositivos de bajo nivel utilizados por un +solo disco en el array. +

Nada se modifica. +

+
+

+touch +

+

Establece una marca de tiempo de subsegundo arbitraria para todos los +archivos que la tienen establecida en cero. +

Esto mejora la capacidad de SnapRAID para reconocer archivos movidos +y copiados, ya que hace que la marca de tiempo sea casi única, +reduciendo posibles duplicados. +

Más específicamente, si la marca de tiempo de subsegundo no es cero, +un archivo movido o copiado se identifica como tal si coincide con +el nombre, el tamaño y la marca de tiempo. Si la marca de tiempo de +subsegundo es cero, se considera una copia solo si la ruta completa, +el tamaño y la marca de tiempo coinciden. +

La marca de tiempo de precisión de segundo no se modifica, +por lo que se conservarán todas las fechas y horas de sus archivos. +

+
+

+rehash +

+

Programa un nuevo cálculo de hash (rehash) de todo el array. +

Este comando cambia el tipo de hash utilizado, típicamente al +actualizar de un sistema de 32 bits a uno de 64 bits, para cambiar +de MurmurHash3 al más rápido SpookyHash. +

Si ya está utilizando el hash óptimo, este comando +no hace nada y le informa que no se necesita ninguna acción. +

El nuevo cálculo de hash no se realiza inmediatamente, sino que +tiene lugar progresivamente durante `sync` y `scrub`. +

Puede verificar el estado del nuevo cálculo de hash usando `status`. +

Durante el nuevo cálculo de hash, SnapRAID mantiene la funcionalidad +completa, con la única excepción de que `dup` no puede detectar +archivos duplicados utilizando un hash diferente. +

+
+
+

+Options +

+

SnapRAID proporciona las siguientes opciones: +

+
+
+-c, --conf CONFIG +
+Selecciona el archivo de configuración a usar. Si no se +especifica, en Unix utiliza el archivo `/usr/local/etc/snapraid.conf` +si existe, de lo contrario `/etc/snapraid.conf`. +En Windows, utiliza el archivo `snapraid.conf` en el mismo +directorio que `snapraid.exe`. +
+
+
+
+
+
+-f, --filter PATTERN +
+Filtra los archivos a procesar en `check` y `fix`. +Solo se procesan los archivos que coinciden con el patrón +especificado. Esta opción se puede usar varias veces. +Consulte la sección PATTERN para obtener más detalles sobre +las especificaciones de patrones. +En Unix, asegúrese de que los caracteres globbing estén +entre comillas si se usan. +Esta opción solo se puede usar con `check` y `fix`. +No se puede usar con `sync` y `scrub`, ya que siempre +procesan todo el array. +
+
+
+
+
+
+-d, --filter-disk NAME +
+Filtra los discos a procesar en `check`, `fix`, `up` y `down`. +Debe especificar un nombre de disco como se define en el archivo +de configuración. +También puede especificar discos de paridad con los nombres: +`parity`, `2-parity`, `3-parity`, etc., para limitar las +operaciones a un disco de paridad específico. +Si combina múltiples opciones --filter, --filter-disk y +--filter-missing, solo se seleccionan los archivos que +coinciden con todos los filtros. +Esta opción se puede usar varias veces. +Esta opción solo se puede usar con `check`, `fix`, `up` y `down`. +No se puede usar con `sync` y `scrub`, ya que siempre +procesan todo el array. +
+
+
+
+
+
+-m, --filter-missing +
+Filtra los archivos a procesar en `check` y `fix`. +Solo se procesan los archivos faltantes o eliminados del array. +Cuando se usa con `fix`, esto actúa como un comando de `undelete` +(recuperación). +Si combina múltiples opciones --filter, --filter-disk y +--filter-missing, solo se seleccionan los archivos que +coinciden con todos los filtros. +Esta opción solo se puede usar con `check` y `fix`. +No se puede usar con `sync` y `scrub`, ya que siempre +procesan todo el array. +
+
+
+
+
+
+-e, --filter-error +
+Procesa los archivos con errores en `check` y `fix`. +Solo procesa archivos que tienen bloques marcados con errores +silenciosos o de entrada/salida durante `sync` y `scrub`, +según se enumeran en `status`. +Esta opción solo se puede usar con `check` y `fix`. +
+
+
+
+
+
+-p, --plan PERC|bad|new|full +
+Selecciona el plan de fregado (scrub). Si PERC es un valor +numérico de 0 a 100, se interpreta como el porcentaje de +bloques a fregar. +En lugar de un porcentaje, puede especificar un plan: +`bad` friega bloques defectuosos, `new` friega bloques aún +no fregados, y `full` friega todo. +Esta opción solo se puede usar con `scrub`. +
+
+
+
+
+
+-o, --older-than DAYS +
+Selecciona la parte más antigua del array para procesar en `scrub`. +DAYS es la edad mínima en días para que un bloque sea fregado; +el valor predeterminado es 10. +Los bloques marcados como defectuosos siempre se friegan +independientemente de esta opción. +Esta opción solo se puede usar con `scrub`. +
+
+
+
+
+
+-a, --audit-only +
+En `check`, verifica el hash de los archivos sin +verificar la información de paridad. +Si solo está interesado en verificar los datos del archivo, +esta opción puede acelerar significativamente el proceso de +verificación. +Esta opción solo se puede usar con `check`. +
+
+
+
+
+
+-h, --pre-hash +
+En `sync`, ejecuta una fase de hash preliminar de todos los +datos nuevos para una verificación adicional antes del +cálculo de paridad. +Normalmente, en `sync`, no se realiza un hash preliminar, +y los nuevos datos se hashean justo antes del cálculo de +paridad cuando se leen por primera vez. +Este proceso ocurre cuando el sistema está bajo +una gran carga, con todos los discos girando y una CPU ocupada. +Esta es una condición extrema para la máquina, y si tiene un +problema de hardware latente, los errores silenciosos pueden +pasar desapercibidos porque los datos aún no están hasheados. +Para evitar este riesgo, puede habilitar el modo `pre-hash` +para que todos los datos se lean dos veces para garantizar +su integridad. +Esta opción también verifica los archivos movidos dentro del +array para asegurar que la operación de movimiento fue exitosa +y, si es necesario, le permite ejecutar una operación de corrección +antes de continuar. +Esta opción solo se puede usar con `sync`. +
+
+
+
+
+
+-i, --import DIR +
+Importa desde el directorio especificado cualquier archivo +eliminado del array después del último `sync`. +Si aún tiene dichos archivos, `check` y `fix` pueden usarlos +para mejorar el proceso de recuperación. +Los archivos se leen, incluso en subdirectorios, y se +identifican independientemente de su nombre. +Esta opción solo se puede usar con `check` y `fix`. +
+
+
+
+
+
+-s, --spin-down-on-error +
+En cualquier error, detiene todos los discos gestionados antes +de salir con un código de estado distinto de cero. Esto evita +que las unidades permanezcan activas y girando después de una +operación abortada, lo que ayuda a evitar la acumulación de calor +innecesaria y el consumo de energía. Use esta opción para +asegurarse de que los discos se detengan de forma segura incluso +cuando un comando falla. +
+
+
+
+
+
+-w, --bw-limit RATE +
+Aplica un límite de ancho de banda global para todos los discos. +RATE es el número de bytes por segundo. Puede especificar un +multiplicador como K, M o G (por ejemplo, --bw-limit 1G). +
+
+
+
+
+
+-A, --stats +
+Habilita una vista de estado extendida que muestra información +adicional. La pantalla muestra dos gráficos: +El primer gráfico muestra el número de franjas (stripes) +almacenadas en búfer para cada disco, junto con la ruta del +archivo al que se está accediendo actualmente en ese disco. +Normalmente, el disco más lento no tendrá búfer disponible, +lo que determina el ancho de banda máximo alcanzable. +El segundo gráfico muestra el porcentaje de tiempo +dedicado a esperar durante los últimos 100 segundos. Se espera +que el disco más lento cause la mayor parte del tiempo de +espera, mientras que otros discos deberían tener poco o ningún +tiempo de espera porque pueden usar sus franjas almacenadas +en búfer. Este gráfico también muestra el tiempo dedicado a +esperar los cálculos de hash y los cálculos RAID. +Todos los cálculos se ejecutan en paralelo con las +operaciones de disco. Por lo tanto, mientras haya un tiempo +de espera medible para al menos un disco, indica que la CPU +es lo suficientemente rápida para mantenerse al día con la +carga de trabajo. +
+
+
+
+
+
+-Z, --force-zero +
+Fuerza la operación insegura de sincronizar un archivo con +tamaño cero que antes no era cero. +Si SnapRAID detecta tal condición, detiene el procedimiento +a menos que especifique esta opción. +Esto le permite detectar fácilmente cuando, después de un +fallo del sistema, algunos archivos accedidos fueron truncados. +Esta es una posible condición en Linux con los sistemas de +archivos ext3/ext4. +Esta opción solo se puede usar con `sync`. +
+
+
+
+
+
+-E, --force-empty +
+Fuerza la operación insegura de sincronizar un disco con todos +los archivos originales faltantes. +Si SnapRAID detecta que todos los archivos originalmente +presentes en el disco faltan o han sido reescritos, detiene +el procedimiento a menos que especifique esta opción. +Esto le permite detectar fácilmente cuando un sistema de archivos +de datos no está montado. +Sin embargo, se permite tener un solo cambio de UUID con +paridad simple, y más con paridad múltiple, porque este es +el caso normal al reemplazar discos después de una recuperación. +Esta opción solo se puede usar con `sync`. +
+
+
+
+
+
+-U, --force-uuid +
+Fuerza la operación insegura de sincronizar, verificar y +corregir con discos que han cambiado su UUID. +Si SnapRAID detecta que algunos discos han cambiado el UUID, +detiene el procedimiento a menos que especifique esta opción. +Esto le permite detectar cuando sus discos están montados en +los puntos de montaje incorrectos. +Esta opción solo se puede usar con `sync`, `check` o `fix`. +
+
+
+
+
+
+-D, --force-device +
+Fuerza la operación insegura de corregir con discos inaccesibles +o con discos en el mismo dispositivo físico. +Por ejemplo, si perdió dos discos de datos y tiene un disco de +repuesto para recuperar solo el primero, puede ignorar el +segundo disco inaccesible. +O, si desea recuperar un disco en el espacio libre que queda +en un disco ya usado, compartiendo el mismo dispositivo físico. +Esta opción solo se puede usar con `fix`. +
+
+
+
+
+
+-N, --force-nocopy +
+En `sync`, `check` y `fix`, deshabilita la heurística de +detección de copias. Sin esta opción, SnapRAID asume que +los archivos con los mismos atributos, como nombre, tamaño y +marca de tiempo, son copias con los mismos datos. +Esto permite la identificación de archivos copiados o movidos +de un disco a otro y reutiliza la información de hash ya +calculada para detectar errores silenciosos o recuperar archivos +faltantes. +En algunos casos raros, este comportamiento puede dar lugar a +falsos positivos o a un proceso lento debido a muchas +verificaciones de hash, y esta opción le permite resolver +tales problemas. +Esta opción solo se puede usar con `sync`, `check` y `fix`. +
+
+
+
+
+
+-F, --force-full +
+En `sync`, fuerza un recálculo completo de la paridad. +Esta opción se puede usar cuando agrega un nuevo nivel de +paridad o si revirtió a un archivo de contenido antiguo +utilizando datos de paridad más recientes. +En lugar de recrear la paridad desde cero, esto le permite +reutilizar los hashes presentes en el archivo de contenido +para validar los datos y mantener la protección de datos durante +el proceso `sync` utilizando los datos de paridad existentes. +Esta opción solo se puede usar con `sync`. +
+
+
+
+
+
+-R, --force-realloc +
+En `sync`, fuerza una reasignación completa de archivos y +la reconstrucción de la paridad. +Esta opción se puede usar para reasignar completamente todos +los archivos, eliminando la fragmentación, mientras se reutilizan +los hashes presentes en el archivo de contenido para validar los datos. +Esta opción solo se puede usar con `sync`. +¡ADVERTENCIA! Esta opción es solo para expertos y se +recomienda encarecidamente no usarla. +NO tiene protección de datos durante la operación `sync`. +
+
+
+
+
+
+-l, --log FILE +
+Escribe un registro detallado en el archivo especificado. +Si no se especifica esta opción, los errores inesperados se +imprimen en la pantalla, lo que puede resultar en una salida +excesiva en caso de muchos errores. Cuando se especifica -l, +--log, solo los errores fatales que hacen que SnapRAID se +detenga se imprimen en la pantalla. +Si la ruta comienza con '>>', el archivo se abre +en modo de anexar. Las ocurrencias de '%D' y '%T' en el nombre +se reemplazan con la fecha y hora en el formato AAAA MM DD y HH MM SS. +En archivos por lotes de Windows, debe duplicar el +carácter '%', por ejemplo, resultado-%%D.log. Para usar '>>', +debe encerrar el nombre entre comillas, por ejemplo, `">>resultado.log"`. +Para enviar el registro a la salida estándar o al error +estándar, puede usar `">&1"` y `">&2"`, respectivamente. +Consulte el archivo snapraid_log.txt o la página del manual +para obtener descripciones de las etiquetas de registro. +
+
+
+
+
+
+-L, --error-limit NUMBER +
+Establece un nuevo límite de error antes de detener la ejecución. +De forma predeterminada, SnapRAID se detiene si encuentra más +de 100 errores de entrada/salida, lo que indica que es probable +que un disco esté fallando. +Esta opción afecta a `sync` y `scrub`, a los que se les +permite continuar después del primer conjunto de errores de +disco para intentar completar sus operaciones. +Sin embargo, `check` y `fix` siempre se detienen en el primer error. +
+
+
+
+
+
+-S, --start BLKSTART +
+Comienza a procesar desde el número de bloque especificado. +Esto puede ser útil para reintentar verificar o corregir +bloques específicos en caso de un disco dañado. +Esta opción es principalmente para recuperación manual avanzada. +
+
+
+
+
+
+-B, --count BLKCOUNT +
+Procesa solo el número de bloques especificado. +Esta opción es principalmente para recuperación manual avanzada. +
+
+
+
+
+
+-C, --gen-conf CONTENT +
+Genera un archivo de configuración ficticio a partir de un +archivo de contenido existente. +El archivo de configuración se escribe en la salida estándar +y no sobrescribe uno existente. +Este archivo de configuración también contiene la información +necesaria para reconstruir los puntos de montaje del disco en +caso de que pierda todo el sistema. +
+
+
+
+
+
+-v, --verbose +
+Imprime más información en la pantalla. +Si se especifica una vez, imprime archivos excluidos +y estadísticas adicionales. +Esta opción no tiene efecto en los archivos de registro. +
+
+
+
+
+
+-q, --quiet +
+Imprime menos información en la pantalla. +Si se especifica una vez, elimina la barra de progreso; +dos veces, las operaciones en ejecución; tres veces, los +mensajes de información; cuatro veces, los mensajes de estado. +Los errores fatales siempre se imprimen en la pantalla. +Esta opción no tiene efecto en los archivos de registro. +
+
+
+
+
+
+-H, --help +
+Imprime una pantalla de ayuda corta. +
+
+
+
+
+
+-V, --version +
+Imprime la versión del programa. +
+
+
+
+
+

+Configuration +

+

SnapRAID requiere un archivo de configuración para saber dónde se +encuentra su array de discos y dónde almacenar la información de paridad. +

En Unix, utiliza el archivo `/usr/local/etc/snapraid.conf` si existe, +de lo contrario `/etc/snapraid.conf`. +En Windows, utiliza el archivo `snapraid.conf` en el mismo +directorio que `snapraid.exe`. +

Debe contener las siguientes opciones (distingue entre mayúsculas y minúsculas): +

+

+parity FILE [,FILE] ... +

+

Define los archivos a usar para almacenar la información de paridad. +La paridad permite la protección contra un solo fallo de disco, +similar a RAID5. +

Puede especificar varios archivos, que deben estar en discos diferentes. +Cuando un archivo no puede crecer más, se utiliza el siguiente. +El espacio total disponible debe ser al menos tan grande como el +disco de datos más grande del array. +

Puede agregar archivos de paridad adicionales más tarde, pero no +puede reordenarlos ni eliminarlos. +

Mantener los discos de paridad reservados para la paridad asegura +que no se fragmenten, mejorando el rendimiento. +

En Windows, se dejan 256 MB sin usar en cada disco para evitar la +advertencia sobre discos llenos. +

Esta opción es obligatoria y solo se puede usar una vez. +

+
+

+(2,3,4,5,6)-parity FILE [,FILE] ... +

+

Define los archivos a usar para almacenar información de paridad +adicional. +

Para cada nivel de paridad especificado, se habilita un nivel +adicional de protección: +

    +
  • +2-parity habilita la paridad dual RAID6. +
  • +
  • +3-parity habilita la paridad triple. +
  • +
  • +4-parity habilita la paridad cuádruple. +
  • +
  • +5-parity habilita la paridad quíntuple. +
  • +
  • +6-parity habilita la paridad séxtuple. +
  • +
+

Cada nivel de paridad requiere la presencia de todos los niveles +de paridad anteriores. +

Se aplican las mismas consideraciones que para la opción 'parity'. +

Estas opciones son opcionales y solo se pueden usar una vez. +

+
+

+z-parity FILE [,FILE] ... +

+

Define un archivo y un formato alternativos para almacenar paridad triple. +

Esta opción es una alternativa a '3-parity', destinada principalmente +a CPU de gama baja como ARM o AMD Phenom, Athlon y Opteron que no +admiten el conjunto de instrucciones SSSE3. En tales casos, +proporciona un mejor rendimiento. +

Este formato es similar pero más rápido que el utilizado por ZFS RAIDZ3. +Al igual que ZFS, no funciona más allá de la paridad triple. +

Al usar '3-parity', se le advertirá si se recomienda usar +el formato 'z-parity' para mejorar el rendimiento. +

Es posible convertir de un formato a otro ajustando +el archivo de configuración con el archivo z-parity o 3-parity +deseado y usando 'fix' para recrearlo. +

+
+

+content FILE +

+

Define el archivo a usar para almacenar la lista y las sumas de +comprobación de todos los archivos presentes en su array de discos. +

Se puede colocar en un disco utilizado para datos, paridad o +cualquier otro disco disponible. +Si usa un disco de datos, este archivo se excluye automáticamente +del proceso `sync`. +

Esta opción es obligatoria y se puede usar varias veces para guardar +múltiples copias del mismo archivo. +

Debe almacenar al menos una copia por cada disco de paridad utilizado +más uno. Usar copias adicionales no perjudica. +

+
+

+data NAME DIR +

+

Define el nombre y el punto de montaje de los discos de datos en +el array. NAME se usa para identificar el disco y debe +ser único. DIR es el punto de montaje del disco en el +sistema de archivos. +

Puede cambiar el punto de montaje según sea necesario, siempre que +mantenga el NAME fijo. +

Debe usar una opción para cada disco de datos en el array. +

Puede cambiar el nombre de un disco más tarde cambiando el NAME +directamente en el archivo de configuración y luego ejecutando un +comando 'sync'. En el caso de cambiar el nombre, la asociación se +realiza utilizando el UUID almacenado de los discos. +

+
+

+nohidden +

+

Excluye todos los archivos y directorios ocultos. +En Unix, los archivos ocultos son los que comienzan con `.`. +En Windows, son los que tienen el atributo oculto. +

+
+

+exclude/include PATTERN +

+

Define los patrones de archivo o directorio a excluir o incluir +en el proceso de sincronización. +Todos los patrones se procesan en el orden especificado. +

Si el primer patrón que coincide es un `exclude`, el archivo +se excluye. Si es un `include`, el archivo se incluye. +Si ningún patrón coincide, el archivo se excluye si el último +patrón especificado es un `include`, o se incluye si el último +patrón especificado es un `exclude`. +

Consulte la sección PATTERN para obtener más detalles sobre +las especificaciones de patrones. +

Esta opción se puede usar varias veces. +

+
+

+blocksize SIZE_IN_KIBIBYTES +

+

Define el tamaño de bloque básico en kibibytes para la paridad. +Un kibibyte es 1024 bytes. +

El tamaño de bloque predeterminado es 256, que debería funcionar +para la mayoría de los casos. +

¡ADVERTENCIA! Esta opción es solo para expertos y se +recomienda encarecidamente no cambiar este valor. Para cambiar +este valor en el futuro, ¡tendrá que recrear toda la paridad! +

Una razón para usar un tamaño de bloque diferente es si tiene +muchos archivos pequeños, del orden de millones. +

Para cada archivo, incluso si solo son unos pocos bytes, se asigna +un bloque completo de paridad, y con muchos archivos, esto puede +resultar en un espacio de paridad no utilizado significativo. +Cuando llena completamente el disco de paridad, no se le permite +agregar más archivos a los discos de datos. +Sin embargo, la paridad desperdiciada no se acumula en los discos +de datos. El espacio desperdiciado resultante de un alto número de +archivos en un disco de datos limita solo la cantidad de datos en +ese disco de datos, no en otros. +

Como aproximación, puede suponer que se desperdicia la mitad del +tamaño del bloque para cada archivo. Por ejemplo, con 100,000 archivos +y un tamaño de bloque de 256 KiB, desperdiciará 12.8 GB de paridad, +lo que puede resultar en 12.8 GB menos de espacio disponible en el +disco de datos. +

Puede verificar la cantidad de espacio desperdiciado en cada disco +usando `status`. Este es el espacio que debe dejar libre en los +discos de datos o usar para archivos no incluidos en el array. +Si este valor es negativo, significa que está cerca de llenar +la paridad, y representa el espacio que aún puede desperdiciar. +

Para evitar este problema, puede usar una partición más grande para +la paridad. Por ejemplo, si la partición de paridad es 12.8 GB +más grande que los discos de datos, tiene suficiente espacio extra +para manejar hasta 100,000 archivos en cada disco de datos sin +ningún espacio desperdiciado. +

Un truco para obtener una partición de paridad más grande en Linux +es formatearla con el comando: +

+mkfs.ext4 -m 0 -T largefile4 DEVICE
+
+

Esto resulta en aproximadamente un 1.5% de espacio extra, +aproximadamente 60 GB para un disco de 4 TB, lo que permite +alrededor de 460,000 archivos en cada disco de datos sin ningún +espacio desperdiciado. +

+
+

+hashsize SIZE_IN_BYTES +

+

Define el tamaño del hash en bytes para los bloques guardados. +

El tamaño de hash predeterminado es de 16 bytes (128 bits), +que debería funcionar para la mayoría de los casos. +

¡ADVERTENCIA! Esta opción es solo para expertos y se +recomienda encarecidamente no cambiar este valor. Para cambiar +este valor en el futuro, ¡tendrá que recrear toda la paridad! +

Una razón para usar un tamaño de hash diferente es si su sistema +tiene memoria limitada. Como regla general, SnapRAID +típicamente requiere 1 GiB de RAM por cada 16 TB de datos en el array. +

Específicamente, para almacenar los hashes de los datos, SnapRAID +requiere aproximadamente TS*(1+HS)/BS bytes de RAM, +donde TS es el tamaño total en bytes de su array de discos, BS es el +tamaño de bloque en bytes, y HS es el tamaño de hash en bytes. +

Por ejemplo, con 8 discos de 4 TB, un tamaño de bloque de 256 KiB +(1 KiB = 1024 bytes) y un tamaño de hash de 16, obtiene: +

+RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB
+
+

Cambiando a un tamaño de hash de 8, obtiene: +

+RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB
+
+

Cambiando a un tamaño de bloque de 512, obtiene: +

+RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB
+
+

Cambiando tanto a un tamaño de hash de 8 como a un tamaño de bloque de 512, +obtiene: +

+RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB
+
+
+
+

+autosave SIZE_IN_GIGABYTES +

+

Guarda automáticamente el estado al sincronizar o fregar después de +la cantidad especificada de GB procesados. +Esta opción es útil para evitar reiniciar comandos `sync` largos +desde cero si son interrumpidos por un fallo de la máquina o +cualquier otro evento. +

+
+

+temp_limit TEMPERATURE_CELSIUS +

+

Establece la temperatura máxima permitida del disco en Celsius. +Cuando se especifica, SnapRAID verifica periódicamente la temperatura +de todos los discos utilizando la herramienta smartctl. Las +temperaturas actuales del disco se muestran mientras SnapRAID está +operando. Si algún disco excede este límite, todas las operaciones +se detienen y los discos se detienen (se ponen en espera) durante +la duración definida por la opción `temp_sleep`. Después del +período de espera, las operaciones se reanudan, pausándose +potencialmente de nuevo si se alcanza el límite de temperatura +una vez más. +

Durante la operación, SnapRAID también analiza la curva de +calentamiento de cada disco y estima la temperatura constante a +largo plazo que se espera que alcancen si la actividad continúa. +La estimación se realiza solo después de que la temperatura del +disco haya aumentado cuatro veces, asegurando que haya suficientes +puntos de datos disponibles para establecer una tendencia confiable. +Esta temperatura constante predicha se muestra entre paréntesis junto +al valor actual y ayuda a evaluar si la refrigeración del sistema es +adecuada. Esta temperatura estimada es solo para fines informativos +y no tiene ningún efecto en el comportamiento de SnapRAID. Las +acciones del programa se basan únicamente en las temperaturas reales +medidas del disco. +

Para realizar este análisis, SnapRAID necesita una referencia para la +temperatura del sistema. Primero intenta leerla de los sensores de +hardware disponibles. Si no se puede acceder a ningún sensor del +sistema, utiliza la temperatura del disco más baja medida al +comienzo de la ejecución como referencia de respaldo. +

Normalmente, SnapRAID solo muestra la temperatura del disco más +caliente. Para mostrar la temperatura de todos los discos, use +la opción -A o --stats. +

+
+

+temp_sleep TIME_IN_MINUTES +

+

Establece el tiempo de espera, en minutos, cuando se alcanza el +límite de temperatura. Durante este período, los discos permanecen +detenidos. El valor predeterminado es de 5 minutos. +

+
+

+pool DIR +

+

Define el directorio de agrupación (pooling) donde se crea la vista +virtual del array de discos utilizando el comando `pool`. +

El directorio ya debe existir. +

+
+

+share UNC_DIR +

+

Define la ruta UNC de Windows requerida para acceder a los discos +de forma remota. +

Si se especifica esta opción, los enlaces simbólicos creados en el +directorio pool utilizan esta ruta UNC para acceder a los discos. +Sin esta opción, los enlaces simbólicos generados utilizan solo +rutas locales, lo que no permite compartir el directorio pool a +través de la red. +

Los enlaces simbólicos se forman utilizando la ruta UNC especificada, +agregando el nombre del disco como se especifica en la opción `data`, +y finalmente agregando el directorio y el nombre del archivo. +

Esta opción solo es necesaria para Windows. +

+
+

+smartctl DISK/PARITY OPTIONS... +

+

Define opciones personalizadas de smartctl para obtener los atributos +SMART de cada disco. Esto puede ser necesario para controladores +RAID y algunos discos USB que no se pueden detectar automáticamente. +El marcador de posición %s se reemplaza por el nombre del dispositivo, +pero es opcional para dispositivos fijos como controladores RAID. +

DISK es el mismo nombre de disco especificado en la opción `data`. +PARITY es uno de los nombres de paridad: `parity`, `2-parity`, +`3-parity`, `4-parity`, `5-parity`, `6-parity` o `z-parity`. +

En las OPCIONES especificadas, la cadena `%s` se reemplaza por +el nombre del dispositivo. Para los controladores RAID, el dispositivo +es probable que sea fijo y es posible que no necesite usar `%s`. +

Consulte la documentación de smartmontools para conocer las posibles +opciones: +

+https://www.smartmontools.org/wiki/Supported_RAID-Controllers
+https://www.smartmontools.org/wiki/Supported_USB-Devices
+
+

Por ejemplo: +

+smartctl parity -d sat %s
+
+
+
+

+smartignore DISK/PARITY ATTR [ATTR...] +

+

Ignora el atributo SMART especificado al calcular la probabilidad +de fallo del disco. Esta opción es útil si un disco informa valores +inusuales o engañosos para un atributo en particular. +

DISK es el mismo nombre de disco especificado en la opción `data`. +PARITY es uno de los nombres de paridad: `parity`, `2-parity`, +`3-parity`, `4-parity`, `5-parity`, `6-parity` o `z-parity`. +El valor especial * se puede usar para ignorar el atributo en todos +los discos. +

Por ejemplo, para ignorar el atributo `Current Pending Sector Count` +en todos los discos: +

+smartignore * 197
+
+

Para ignorarlo solo en el primer disco de paridad: +

+smartignore parity 197
+
+
+
+

+Examples +

+

Un ejemplo de una configuración típica para Unix es: +

+parity /mnt/diskp/snapraid.parity
+content /mnt/diskp/snapraid.content
+content /var/snapraid/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+exclude /lost+found/
+exclude /tmp/
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/sg0
+smartctl 2-parity -d areca,2/1 /dev/sg0
+
+

Un ejemplo de una configuración típica para Windows es: +

+parity E:\snapraid.parity
+content E:\snapraid.content
+content C:\snapraid\snapraid.content
+data d1 G:\array\
+data d2 H:\array\
+data d3 I:\array\
+exclude Thumbs.db
+exclude \$RECYCLE.BIN
+exclude \System Volume Information
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/arcmsr0
+smartctl 2-parity -d areca,2/1 /dev/arcmsr0
+
+
+
+
+

+Pattern +

+

Los patrones proporcionan una forma flexible de filtrar archivos para su inclusión o +exclusión. Al usar caracteres de globbing, puede definir reglas que coincidan con +nombres de archivos específicos o estructuras de directorios completas sin +enumerar cada ruta manualmente. +

El signo de interrogación `?` coincide con cualquier carácter individual excepto el +separador de directorios. Esto lo hace útil para hacer coincidir nombres de archivos con +caracteres variables manteniendo el patrón limitado a un solo nivel de directorio. +

El asterisco simple `*` coincide con cualquier secuencia de caracteres, pero al igual que el +signo de interrogación, nunca cruza los límites de los directorios. Se detiene en la +barra diagonal, lo que lo hace adecuado para buscar coincidencias dentro de un solo +componente de ruta. Este es el comportamiento estándar de los comodines familiar +del globbing de la shell. +

el doble asterisco `**` es más potente, coincide con cualquier secuencia de +caracteres, incluidos los separadores de directorios. Esto permite que los patrones coincidan +a través de múltiples niveles de directorio. Cuando `**` aparece incrustado directamente en +un patrón, puede coincidir con cero o más caracteres, incluidas las barras diagonales entre +el texto literal circundante. +

El uso más importante de `**` es en la forma especial `/**/`. Esta coincide con +cero o más niveles de directorio completos, lo que permite que los archivos coincidan +a cualquier profundidad en un árbol de directorios sin conocer la estructura exacta de la ruta. +Por ejemplo, el patrón `src/**/main.js` coincide con `src/main.js` (saltando +cero directorios), `src/ui/main.js` (saltando un directorio) y +`src/ui/components/main.js` (saltando dos directorios). +

Las clases de caracteres que utilizan corchetes `[]` coinciden con un solo carácter de un +conjunto o rango especificado. Al igual que los otros patrones de un solo carácter, +no coinciden con los separadores de directorios. Las clases admiten rangos y negación mediante +un signo de exclamación. +

La distinción fundamental que debe recordar es que `*`, `?` y las clases de caracteres +respetan los límites de los directorios y solo coinciden dentro de un único +componente de ruta, mientras que `**` es el único patrón que puede coincidir a través de +los separadores de directorios. +

Hay cuatro tipos diferentes de patrones: +

+
+
+FILE +
+Selecciona cualquier archivo llamado FILE. +Este patrón se aplica solo a archivos, no a directorios. +
+
+
+
+
+
+DIR/ +
+Selecciona cualquier directorio llamado DIR y todo lo que hay dentro. +Este patrón se aplica solo a directorios, no a archivos. +
+
+
+
+
+
+/PATH/FILE +
+Selecciona la ruta exacta del archivo especificado. Este patrón se aplica +solo a archivos, no a directorios. +
+
+
+
+
+
+/PATH/DIR/ +
+Selecciona la ruta exacta del directorio especificado y todo lo que hay +dentro. Este patrón se aplica solo a directorios, no a archivos. +
+
+
+

Cuando especifica una ruta absoluta que comienza con /, se aplica +en el directorio raíz del array, no en el directorio raíz del +sistema de archivos local. +

En Windows, puede usar la barra invertida \ en lugar de la barra /. +Los directorios del sistema de Windows, las uniones, los puntos de +montaje y otros directorios especiales de Windows se tratan como +archivos, lo que significa que para excluirlos, debe usar una regla +de archivo, no una de directorio. +

Si el nombre del archivo contiene un carácter '*', '?', '[', +o ']', debe escaparlo para evitar que se interprete como un +carácter globbing. En Unix, el carácter de escape es '\'; +en Windows, es '^'. Cuando el patrón está en la línea de comandos, +debe duplicar el carácter de escape para evitar que sea +interpretado por el shell de comandos. +

En el archivo de configuración, puede usar diferentes estrategias +para filtrar los archivos a procesar. +El enfoque más simple es usar solo reglas `exclude` para +eliminar todos los archivos y directorios que no desea procesar. +Por ejemplo: +

+# Excluye cualquier archivo llamado `*.unrecoverable`
+exclude *.unrecoverable
+# Excluye el directorio raíz `/lost+found`
+exclude /lost+found/
+# Excluye cualquier subdirectorio llamado `tmp`
+exclude tmp/
+
+

El enfoque opuesto es definir solo los archivos que desea procesar, +utilizando solo reglas `include`. Por ejemplo: +

+# Incluye solo algunos directorios
+include /movies/
+include /musics/
+include /pictures/
+
+

El enfoque final es mezclar reglas `exclude` e `include`. En este +caso, el orden de las reglas es importante. Las reglas anteriores +tienen precedencia sobre las posteriores. +Para simplificar, puede enumerar todas las reglas `exclude` primero +y luego todas las reglas `include`. Por ejemplo: +

+# Excluye cualquier archivo llamado `*.unrecoverable`
+exclude *.unrecoverable
+# Excluye cualquier subdirectorio llamado `tmp`
+exclude tmp/
+# Incluye solo algunos directorios
+include /movies/
+include /musics/
+include /pictures/
+
+

En la línea de comandos, usando la opción -f, solo puede usar +patrones `include`. Por ejemplo: +

+# Verifica solo los archivos .mp3.
+# En Unix, use comillas para evitar la expansión globbing por el shell.
+snapraid -f "*.mp3" check
+
+

En Unix, al usar caracteres globbing en la línea de comandos, debe +ponerlos entre comillas para evitar que el shell los expanda. +

+
+

+Ignorar Archivos +

+

Además de las reglas globales en el archivo de configuración, puedes +colocar archivos `.snapraidignore` en cualquier directorio dentro del array +para definir reglas de exclusión descentralizadas. +

Las reglas definidas en `.snapraidignore` se aplican después de las reglas del +archivo de configuración. Esto significa que tienen una prioridad más alta y pueden +usarse para excluir archivos que fueron incluidos previamente por la configuración +global. Efectivamente, si una regla local coincide, el archivo se excluye +independientemente de los ajustes de inclusión globales. +

La lógica de patrones en `.snapraidignore` refleja la configuración global +pero ancla los patrones al directorio donde se encuentra el archivo: +

+
+
+FILE +
+Selecciona cualquier archivo llamado FILE en este directorio o por debajo. +Esto sigue las mismas reglas de globbing que el patrón global. +
+
+
+
+
+
+DIR/ +
+Selecciona cualquier directorio llamado DIR y todo su contenido, +ubicado en este directorio o por debajo. +
+
+
+
+
+
+/PATH/FILE +
+Selecciona el archivo exacto especificado relativo a la ubicación +del archivo `.snapraidignore`. +
+
+
+
+
+
+/PATH/DIR/ +
+Selecciona el directorio exacto especificado y todo su contenido, +relativo a la ubicación del archivo `.snapraidignore`. +
+
+
+

A diferencia de la configuración global, los archivos `.snapraidignore` solo admiten +reglas de exclusión; no se pueden usar patrones `include` o negación (!). +

Por ejemplo, si tienes un `.snapraidignore` en `/mnt/disk1/projects/`: +

+# Excluye SOLO /mnt/disk1/projects/output.bin
+/output.bin
+# Excluye cualquier directorio llamado 'build' dentro de projects/
+build/
+# Excluye cualquier archivo .tmp dentro de projects/ o sus subcarpetas
+*.tmp
+
+
+
+

+Content +

+

SnapRAID almacena la lista y las sumas de comprobación de sus +archivos en el archivo de contenido. +

Es un archivo binario que enumera todos los archivos presentes en +su array de discos, junto con todas las sumas de comprobación para +verificar su integridad. +

Este archivo es leído y escrito por los comandos `sync` y `scrub` +y leído por los comandos `fix`, `check` y `status`. +

+
+

+Parity +

+

SnapRAID almacena la información de paridad de su array en los +archivos de paridad. +

Estos son archivos binarios que contienen la paridad calculada +de todos los bloques definidos en el archivo `content`. +

Estos archivos son leídos y escritos por los comandos `sync` y `fix` +y solo leídos por los comandos `scrub` y `check`. +

+
+

+Encoding +

+

SnapRAID en Unix ignora cualquier codificación. Lee y almacena los +nombres de archivo con la misma codificación utilizada por el sistema +de archivos. +

En Windows, todos los nombres leídos del sistema de archivos se +convierten y procesan en formato UTF-8. +

Para que los nombres de archivo se impriman correctamente, debe +configurar la consola de Windows en modo UTF-8 con el comando +`chcp 65001` y usar una fuente TrueType como `Lucida Console` +como fuente de la consola. Esto afecta solo a los nombres de +archivo impresos; si redirige la salida de la consola a un archivo, +el archivo resultante siempre está en formato UTF-8. +

+ + +
+
+
+ + + + + + + diff --git a/beta/manual-fr.html b/beta/manual-fr.html new file mode 100644 index 00000000..fa30bde4 --- /dev/null +++ b/beta/manual-fr.html @@ -0,0 +1,2106 @@ + + + + + + + + SnapRAID Manual + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + +
+ +
+ +
+

+Synopsis +

+
+snapraid [-c, --conf CONFIG]
+    [-f, --filter MOTIF] [-d, --filter-disk NOM]
+    [-m, --filter-missing] [-e, --filter-error]
+    [-a, --audit-only] [-h, --pre-hash] [-i, --import DOSSIER]
+    [-p, --plan PERC|mauvais|nouveau|complet]
+    [-o, --older-than JOURS] [-l, --log FICHIER]
+    [-s, --spin-down-on-error] [-w, --bw-limit DÉBIT]
+    [-Z, --force-zero] [-E, --force-empty]
+    [-U, --force-uuid] [-D, --force-device]
+    [-N, --force-nocopy] [-F, --force-full]
+    [-R, --force-realloc]
+    [-S, --start BLKSTART] [-B, --count BLKCOUNT]
+    [-L, --error-limit NOMBRE]
+    [-A, --stats]
+    [-v, --verbose] [-q, --quiet]
+    status|smart|probe|up|down|diff|sync|scrub|fix|check
+    |list|dup|pool|devices|touch|rehash
+
+
+snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENU]
+
+
+
+

+Description +

+

SnapRAID est un programme de sauvegarde conçu pour les baies de disques, +stockant les informations de parité pour la récupération des données en cas +de défaillance de six disques maximum. +

Principalement destiné aux centres multimédia domestiques avec des fichiers +volumineux et peu souvent modifiés, SnapRAID offre plusieurs fonctionnalités : +

    +
  • +Vous pouvez utiliser des disques déjà remplis de fichiers sans avoir besoin +de les reformater, en y accédant comme d'habitude. +
  • +
  • +Toutes vos données sont hachées pour garantir l'intégrité des données +et prévenir la corruption silencieuse. +
  • +
  • +Lorsque le nombre de disques défaillants dépasse le nombre de parités, +la perte de données est limitée aux disques affectés ; les données +sur les autres disques restent accessibles. +
  • +
  • +Si vous supprimez accidentellement des fichiers sur un disque, +la récupération est possible. +
  • +
  • +Les disques peuvent avoir des tailles différentes. +
  • +
  • +Vous pouvez ajouter des disques à tout moment. +
  • +
  • +SnapRAID ne verrouille pas vos données ; vous pouvez arrêter de l'utiliser +à tout moment sans reformater ni déplacer de données. +
  • +
  • +Pour accéder à un fichier, un seul disque doit tourner, ce qui +économise de l'énergie et réduit le bruit. +
  • +
+

Pour plus d'informations, veuillez visiter le site officiel de SnapRAID : +

+https://www.snapraid.it/
+
+
+
+

+Limitations +

+

SnapRAID est un hybride entre un programme RAID et un programme de sauvegarde, +visant à combiner les meilleurs avantages des deux. Cependant, il a quelques +limitations que vous devriez considérer avant de l'utiliser. +

La principale limitation est que si un disque tombe en panne et que vous +n'avez pas synchronisé récemment, vous pourriez ne pas être en mesure de +récupérer complètement. +Plus précisément, vous pourriez ne pas être en mesure de récupérer jusqu'à +la taille des fichiers modifiés ou supprimés depuis la dernière opération +de synchronisation. +Cela se produit même si les fichiers modifiés ou supprimés ne se trouvent +pas sur le disque défaillant. C'est pourquoi SnapRAID est mieux adapté +aux données qui changent rarement. +

D'un autre côté, les fichiers nouvellement ajoutés n'empêchent pas +la récupération des fichiers déjà existants. Vous ne perdrez que les +fichiers récemment ajoutés s'ils se trouvent sur le disque défaillant. +

Les autres limitations de SnapRAID sont : +

    +
  • +Avec SnapRAID, vous avez toujours des systèmes de fichiers séparés +pour chaque disque. Avec le RAID, vous obtenez un seul grand +système de fichiers. +
  • +
  • +SnapRAID ne fait pas de striping (entrelacement) des données. +Avec le RAID, vous obtenez un gain de vitesse avec le striping. +
  • +
  • +SnapRAID ne prend pas en charge la récupération en temps réel. +Avec le RAID, vous n'avez pas à arrêter de travailler lorsqu'un +disque tombe en panne. +
  • +
  • +SnapRAID ne peut récupérer des données que pour un nombre limité +de défaillances de disques. Avec une sauvegarde, vous pouvez +récupérer d'une défaillance complète de toute la baie de disques. +
  • +
  • +Seuls les noms de fichiers, les horodatages, les liens symboliques +et les liens matériels sont sauvegardés. Les permissions, la +propriété et les attributs étendus ne sont pas sauvegardés. +
  • +
+
+
+

+Démarrer +

+

Pour utiliser SnapRAID, vous devez d'abord sélectionner un disque +dans votre baie de disques pour le dédier aux informations de `parité`. +Avec un disque pour la parité, vous pourrez récupérer d'une +seule défaillance de disque, similaire au RAID5. +

Si vous souhaitez récupérer de plus de défaillances de disques, +similaire au RAID6, vous devez réserver des disques supplémentaires +pour la parité. Chaque disque de parité supplémentaire permet la +récupération d'une défaillance de disque de plus. +

Comme disques de parité, vous devez choisir les plus grands disques +de la baie, car les informations de parité peuvent atteindre la +taille du plus grand disque de données de la baie. +

Ces disques seront dédiés au stockage des fichiers de `parité`. +Vous ne devriez pas y stocker vos données. +

Ensuite, vous devez définir les disques de `données` que vous souhaitez +protéger avec SnapRAID. La protection est plus efficace si ces disques +contiennent des données qui changent rarement. Pour cette raison, il est +préférable de NE PAS inclure le disque C:\ de Windows ou les répertoires +/home, /var et /tmp d'Unix. +

La liste des fichiers est enregistrée dans les fichiers `content` (contenu), +généralement stockés sur les disques de données, de parité ou de démarrage. +Ce fichier contient les détails de votre sauvegarde, y compris toutes les +sommes de contrôle pour vérifier son intégrité. +Le fichier `content` est stocké en plusieurs copies, et chaque copie +doit se trouver sur un disque différent pour garantir qu'au moins une +copie soit disponible, même en cas de défaillances de disques multiples. +

Par exemple, supposons que vous ne soyez intéressé que par un seul +niveau de protection de parité, et que vos disques se trouvent à : +

+/mnt/diskp <- disque sélectionné pour la parité
+/mnt/disk1 <- premier disque à protéger
+/mnt/disk2 <- deuxième disque à protéger
+/mnt/disk3 <- troisième disque à protéger
+
+

Vous devez créer le fichier de configuration /etc/snapraid.conf +avec les options suivantes : +

+parity /mnt/diskp/snapraid.parity
+content /var/snapraid/snapraid.content
+content /mnt/disk1/snapraid.content
+content /mnt/disk2/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+
+

Si vous êtes sous Windows, vous devez utiliser le format de chemin +Windows, avec des lettres de lecteur et des barres obliques inverses +au lieu de barres obliques. +

+parity E:\snapraid.parity
+content C:\snapraid\snapraid.content
+content F:\array\snapraid.content
+content G:\array\snapraid.content
+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+
+

Si vous avez de nombreux disques et manquez de lettres de lecteur, +vous pouvez monter les disques directement dans des sous-dossiers. Voir : +

+https://www.google.com/search?q=Windows+mount+point
+
+

À ce stade, vous êtes prêt à exécuter la commande `sync` (synchroniser) +pour construire les informations de parité. +

+snapraid sync
+
+

Ce processus peut prendre plusieurs heures la première fois, en fonction +de la taille des données déjà présentes sur les disques. Si les disques +sont vides, le processus est immédiat. +

Vous pouvez l'arrêter à tout moment en appuyant sur Ctrl+C, et lors de +la prochaine exécution, il reprendra là où il a été interrompu. +

Lorsque cette commande est terminée, vos données sont EN SÉCURITÉ. +

Vous pouvez maintenant commencer à utiliser votre baie comme vous le souhaitez +et mettre à jour périodiquement les informations de parité en exécutant +la commande `sync`. +

+

+Nettoyage (Scrubbing) +

+

Pour vérifier périodiquement les données et la parité à la recherche +d'erreurs, vous pouvez exécuter la commande `scrub`. +

+snapraid scrub
+
+

Cette commande compare les données de votre baie avec le hachage calculé +lors de la commande `sync` pour vérifier l'intégrité. +

Chaque exécution de la commande vérifie environ 8 % de la baie, en +excluant les données déjà nettoyées au cours des 10 jours précédents. +Vous pouvez utiliser l'option -p, --plan pour spécifier une quantité +différente et l'option -o, --older-than pour spécifier un âge +différent en jours. Par exemple, pour vérifier 5 % de la baie +pour les blocs de plus de 20 jours, utilisez : +

+snapraid -p 5 -o 20 scrub
+
+

Si des erreurs silencieuses ou d'entrée/sortie sont trouvées pendant +le processus, les blocs correspondants sont marqués comme mauvais +dans le fichier `content` et listés dans la commande `status`. +

+snapraid status
+
+

Pour les corriger, vous pouvez utiliser la commande `fix`, en filtrant +les mauvais blocs avec l'option -e, --filter-error : +

+snapraid -e fix
+
+

Lors du prochain `scrub`, les erreurs disparaîtront du rapport +`status` si elles sont réellement corrigées. Pour accélérer, +vous pouvez utiliser -p mauvais pour nettoyer uniquement les blocs +marqués comme mauvais. +

+snapraid -p bad scrub
+
+

L'exécution de `scrub` sur une baie non synchronisée peut signaler +des erreurs causées par des fichiers supprimés ou modifiés. Ces erreurs +sont signalées dans la sortie de `scrub`, mais les blocs associés +ne sont pas marqués comme mauvais. +

+
+

+Mise en commun (Pooling) +

+

Note : La fonctionnalité de mise en commun décrite ci-dessous a été +remplacée par l'outil mergefs, qui est désormais l'option recommandée +pour les utilisateurs Linux de la communauté SnapRAID. Mergefs offre +un moyen plus flexible et efficace de regrouper plusieurs disques +dans un seul point de montage unifié, permettant un accès transparent +aux fichiers sur toute votre baie sans dépendre de liens symboliques. +Il s'intègre bien avec SnapRAID pour la protection par parité et est +couramment utilisé dans des configurations comme OpenMediaVault (OMV) +ou des configurations NAS personnalisées. +

Pour que tous les fichiers de votre baie apparaissent dans la même +arborescence de répertoires, vous pouvez activer la fonctionnalité +de `pooling`. Elle crée une vue virtuelle en lecture seule de tous +les fichiers de votre baie à l'aide de liens symboliques. +

Vous pouvez configurer le répertoire de `pooling` dans le fichier +de configuration avec : +

+pool /pool
+
+

ou, si vous êtes sous Windows, avec : +

+pool C:\pool
+
+

puis exécutez la commande `pool` pour créer ou mettre à jour +la vue virtuelle. +

+snapraid pool
+
+

Si vous utilisez une plateforme Unix et souhaitez partager ce +répertoire sur le réseau avec des machines Windows ou Unix, +vous devez ajouter les options suivantes à votre +/etc/samba/smb.conf : +

+# Dans la section globale de smb.conf
+unix extensions = no
+
+
+# Dans la section de partage de smb.conf
+[pool]
+comment = Pool
+path = /pool
+read only = yes
+guest ok = yes
+wide links = yes
+follow symlinks = yes
+
+

Sous Windows, le partage de liens symboliques sur un réseau +nécessite que les clients les résolvent à distance. Pour +activer cela, en plus de partager le répertoire du pool, +vous devez également partager tous les disques indépendamment, +en utilisant les noms de disques définis dans le fichier de +configuration comme points de partage. Vous devez également +spécifier dans l'option `share` du fichier de configuration +le chemin UNC Windows que les clients distants doivent +utiliser pour accéder à ces disques partagés. +

Par exemple, en opérant à partir d'un serveur nommé `darkstar`, +vous pouvez utiliser les options : +

+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+pool C:\pool
+share \\darkstar
+
+

et partager les répertoires suivants sur le réseau : +

+\\darkstar\pool -> C:\pool
+\\darkstar\d1 -> F:\array
+\\darkstar\d2 -> G:\array
+\\darkstar\d3 -> H:\array
+
+

pour permettre aux clients distants d'accéder à tous les fichiers +à \\darkstar\pool. +

Vous pourriez également avoir besoin de configurer les clients +distants pour activer l'accès aux liens symboliques distants avec +la commande : +

+fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
+
+
+
+

+Restauration (Undeleting) +

+

SnapRAID fonctionne davantage comme un programme de sauvegarde +qu'un système RAID, et il peut être utilisé pour restaurer +ou récupérer des fichiers dans leur état précédent à l'aide +de l'option -f, --filter : +

+snapraid fix -f FICHIER
+
+

ou pour un répertoire : +

+snapraid fix -f DOSSIER/
+
+

Vous pouvez également l'utiliser pour récupérer uniquement les +fichiers accidentellement supprimés à l'intérieur d'un +répertoire en utilisant l'option -m, --filter-missing, +qui ne restaure que les fichiers manquants, laissant tous +les autres intacts. +

+snapraid fix -m -f DOSSIER/
+
+

Ou pour récupérer tous les fichiers supprimés sur tous les +lecteurs avec : +

+snapraid fix -m
+
+
+
+

+Récupération +

+

Le pire est arrivé, et vous avez perdu un ou plusieurs disques ! +

NE PANIQUEZ PAS ! Vous pourrez les récupérer ! +

La première chose à faire est d'éviter d'autres modifications +sur votre baie de disques. Désactivez toute connexion à distance +et tout processus planifié, y compris toute synchronisation ou +nettoyage SnapRAID nocturne planifié. +

Procédez ensuite aux étapes suivantes. +

+

+ÉTAPE 1 -> Reconfigurer +

+

Vous avez besoin d'espace pour récupérer, idéalement sur des disques +de rechange supplémentaires, mais un disque USB externe ou un disque +distant suffira. +

Modifiez le fichier de configuration SnapRAID pour que l'option +`data` ou `parity` du disque défaillant pointe vers un emplacement +avec suffisamment d'espace vide pour récupérer les fichiers. +

Par exemple, si le disque `d1` a échoué, passez de : +

+data d1 /mnt/disk1/
+
+

à : +

+data d1 /mnt/new_spare_disk/
+
+

Si le disque à récupérer est un disque de parité, mettez à jour +l'option `parity` appropriée. +Si vous avez plusieurs disques défaillants, mettez à jour toutes +leurs options de configuration. +

+
+

+ÉTAPE 2 -> Corriger (Fix) +

+

Exécutez la commande fix, en stockant le journal dans un fichier +externe avec : +

+snapraid -d NOM -l fix.log fix
+
+

Où NOM est le nom du disque, tel que `d1` dans notre exemple précédent. +Si le disque à récupérer est un disque de parité, utilisez les noms +`parity`, `2-parity`, etc. +Si vous avez plusieurs disques défaillants, utilisez plusieurs +options -d pour les spécifier tous. +

Cette commande prendra beaucoup de temps. +

Assurez-vous d'avoir quelques gigaoctets libres pour stocker le fichier fix.log. +Exécutez-la à partir d'un disque avec suffisamment d'espace libre. +

Vous avez maintenant récupéré tout ce qui est récupérable. Si certains +fichiers sont partiellement ou totalement irrécupérables, ils seront +renommés en ajoutant l'extension `.unrecoverable`. +

Vous pouvez trouver une liste détaillée de tous les blocs irrécupérables +dans le fichier fix.log en vérifiant toutes les lignes commençant par +`unrecoverable:`. +

Si la récupération ne vous satisfait pas, vous pouvez réessayer autant +de fois que vous le souhaitez. +

Par exemple, si vous avez supprimé des fichiers de la baie après le dernier +`sync`, cela peut entraîner la non-récupération de certains fichiers. +Dans ce cas, vous pouvez réessayer le `fix` en utilisant l'option +-i, --import, en spécifiant où se trouvent maintenant ces fichiers +pour les inclure à nouveau dans le processus de récupération. +

Si vous êtes satisfait de la récupération, vous pouvez continuer, +mais notez qu'après la synchronisation, vous ne pouvez plus réessayer +la commande `fix` ! +

+
+

+ÉTAPE 3 -> Vérifier (Check) +

+

Par précaution, vous pouvez maintenant exécuter une commande `check` +pour vous assurer que tout est correct sur le disque récupéré. +

+snapraid -d NOM -a check
+
+

Où NOM est le nom du disque, tel que `d1` dans notre exemple précédent. +

Les options -d et -a indiquent à SnapRAID de vérifier uniquement le +disque spécifié et d'ignorer toutes les données de parité. +

Cette commande prendra beaucoup de temps, mais si vous n'êtes pas +trop prudent, vous pouvez la sauter. +

+
+

+ÉTAPE 4 -> Synchroniser (Sync) +

+

Exécutez la commande `sync` pour resynchroniser la baie avec le nouveau +disque. +

+snapraid sync
+
+

Si tout est récupéré, cette commande est immédiate. +

+
+
+
+

+Commandes +

+

SnapRAID fournit quelques commandes simples qui vous permettent de : +

    +
  • +Afficher l'état de la baie de disques -> `status` +
  • +
  • +Contrôler les disques -> `smart`, `probe`, `up`, `down` +
  • +
  • +Faire une sauvegarde/instantané -> `sync` +
  • +
  • +Vérifier périodiquement les données -> `scrub` +
  • +
  • +Restaurer la dernière sauvegarde/instantané -> `fix`. +
  • +
+

Les commandes doivent être écrites en minuscules. +

+

+status +

+

Affiche un résumé de l'état de la baie de disques. +

Il comprend des informations sur la fragmentation de la parité, l'âge +des blocs sans vérification, et toutes les erreurs silencieuses +enregistrées rencontrées lors du nettoyage. +

Les informations présentées se réfèrent au dernier moment où vous avez +exécuté `sync`. Les modifications ultérieures ne sont pas prises en compte. +

Si des mauvais blocs ont été détectés, leurs numéros de blocs sont listés. +Pour les corriger, vous pouvez utiliser la commande `fix -e`. +

Il montre également un graphique représentant la dernière fois que chaque +bloc a été nettoyé ou synchronisé. Les blocs nettoyés sont affichés +avec '*', les blocs synchronisés mais pas encore nettoyés avec 'o'. +

Rien n'est modifié. +

+
+

+smart +

+

Affiche un rapport SMART de tous les disques du système. +

Il comprend une estimation de la probabilité de défaillance au cours +de la prochaine année, vous permettant de planifier les remplacements +de maintenance des disques qui présentent des attributs suspects. +

Cette estimation de probabilité est obtenue en corrélant les attributs +SMART des disques avec les données Backblaze disponibles à : +

+https://www.backblaze.com/hard-drive-test-data.html
+
+

Si SMART signale qu'un disque est en panne, `FAIL` ou `PREFAIL` est +affiché pour ce disque, et SnapRAID retourne une erreur. +Dans ce cas, le remplacement immédiat du disque est fortement +recommandé. +

Les autres chaînes d'état possibles sont : +

+
+
+logfail +
+Dans le passé, certains attributs étaient inférieurs +au seuil. +
+
+
+
+logerr +
+Le journal d'erreurs du périphérique contient des erreurs. +
+
+
+
+selferr +
+Le journal d'auto-test du périphérique contient des erreurs. +
+
+
+

Si l'option -v, --verbose est spécifiée, une analyse statistique +plus approfondie est fournie. Cette analyse peut vous aider à +décider si vous avez besoin de plus ou moins de parité. +

Cette commande utilise l'outil `smartctl` et équivaut à exécuter +`smartctl -a` sur tous les périphériques. +

Si vos périphériques ne sont pas détectés automatiquement correctement, +vous pouvez spécifier une commande personnalisée en utilisant l'option +`smartctl` dans le fichier de configuration. +

Rien n'est modifié. +

+
+

+probe +

+

Affiche l'état d'ALIMENTATION de tous les disques du système. +

`Standby` signifie que le disque ne tourne pas. `Active` signifie +que le disque tourne. +

Cette commande utilise l'outil `smartctl` et équivaut à exécuter +`smartctl -n standby -i` sur tous les périphériques. +

Si vos périphériques ne sont pas détectés automatiquement correctement, +vous pouvez spécifier une commande personnalisée en utilisant l'option +`smartctl` dans le fichier de configuration. +

Rien n'est modifié. +

+
+

+up +

+

Fait tourner (spin up) tous les disques de la baie. +

Vous pouvez faire tourner uniquement des disques spécifiques +en utilisant l'option -d, --filter-disk. +

Faire tourner tous les disques en même temps nécessite beaucoup +d'énergie. Assurez-vous que votre alimentation peut le supporter. +

Rien n'est modifié. +

+
+

+down +

+

Arrête (spin down) tous les disques de la baie. +

Cette commande utilise l'outil `smartctl` et équivaut à exécuter +`smartctl -s standby,now` sur tous les périphériques. +

Vous pouvez arrêter uniquement des disques spécifiques +en utilisant l'option -d, --filter-disk. +

Pour arrêter automatiquement en cas d'erreur, vous pouvez utiliser +l'option -s, --spin-down-on-error avec toute autre commande, +ce qui équivaut à exécuter `down` manuellement lorsqu'une +erreur se produit. +

Rien n'est modifié. +

+
+

+diff +

+

Liste tous les fichiers modifiés depuis le dernier `sync` qui +nécessitent la recomputation de leurs données de parité. +

Cette commande ne vérifie pas les données des fichiers, +mais uniquement l'horodatage, la taille et l'inode du fichier. +

Après avoir listé tous les fichiers modifiés, un résumé des +modifications est présenté, regroupé par : +

+
+
+equal +
+Fichiers inchangés par rapport à avant. +
+
+
+
+added +
+Fichiers ajoutés qui n'étaient pas présents auparavant. +
+
+
+
+removed +
+Fichiers supprimés. +
+
+
+
+updated +
+Fichiers avec une taille ou un horodatage différent, +signifiant qu'ils ont été modifiés. +
+
+
+
+moved +
+Fichiers déplacés vers un répertoire différent sur le +même disque. Ils sont identifiés par le même nom, la +même taille, le même horodatage et le même inode, mais +un répertoire différent. +
+
+
+
+copied +
+Fichiers copiés sur le même disque ou un disque différent. +Notez que s'ils sont vraiment déplacés vers un autre +disque, ils seront également comptés dans `removed`. +Ils sont identifiés par le même nom, la même taille +et le même horodatage. Si l'horodatage en sous-seconde +est zéro, le chemin complet doit correspondre, pas seulement +le nom. +
+
+
+
+restored +
+Fichiers avec un inode différent mais correspondant +au nom, à la taille et à l'horodatage. Il s'agit +généralement de fichiers restaurés après avoir été supprimés. +
+
+
+

Si un `sync` est requis, le code de retour du processus est 2, +au lieu du 0 par défaut. Le code de retour 1 est utilisé pour +une condition d'erreur générique. +

Rien n'est modifié. +

+
+

+sync +

+

Met à jour les informations de parité. Tous les fichiers modifiés +dans la baie de disques sont lus, et les données de parité +correspondantes sont mises à jour. +

Vous pouvez arrêter ce processus à tout moment en appuyant sur Ctrl+C, +sans perdre le travail déjà effectué. +Lors de la prochaine exécution, le processus `sync` reprendra +là où il a été interrompu. +

Si des erreurs silencieuses ou d'entrée/sortie sont trouvées +pendant le processus, les blocs correspondants sont marqués comme mauvais. +

Les fichiers sont identifiés par chemin et/ou inode et vérifiés +par taille et horodatage. +Si la taille ou l'horodatage du fichier diffère, les données de +parité sont recomptées pour l'ensemble du fichier. +Si le fichier est déplacé ou renommé sur le même disque, en gardant +le même inode, la parité n'est pas recomptée. +Si le fichier est déplacé vers un autre disque, la parité est +recomptée, mais les informations de hachage précédemment calculées +sont conservées. +

Les fichiers `content` et `parity` sont modifiés si nécessaire. +Les fichiers dans la baie NE SONT PAS modifiés. +

+
+

+scrub +

+

Nettoie la baie, vérifiant les erreurs silencieuses ou d'entrée/sortie +dans les disques de données et de parité. +

Chaque invocation vérifie environ 8 % de la baie, en excluant +les données déjà nettoyées au cours des 10 derniers jours. +Cela signifie qu'un nettoyage une fois par semaine garantit que +chaque bit de données est vérifié au moins une fois tous les trois mois. +

Vous pouvez définir un plan de nettoyage ou une quantité différente +en utilisant l'option -p, --plan, qui accepte : +bad - Nettoyer les blocs marqués mauvais. +new - Nettoyer les blocs juste synchronisés qui n'ont pas encore été nettoyés. +full - Nettoyer tout. +0-100 - Nettoyer le pourcentage spécifié de blocs. +

Si vous spécifiez un pourcentage, vous pouvez également utiliser +l'option -o, --older-than pour définir l'âge que le bloc +doit avoir. +Les blocs les plus anciens sont nettoyés en premier, assurant +une vérification optimale. +Si vous souhaitez nettoyer uniquement les blocs juste synchronisés +qui n'ont pas encore été nettoyés, utilisez l'option `-p new`. +

Pour obtenir des détails sur l'état du nettoyage, utilisez la commande +`status`. +

Pour toute erreur silencieuse ou d'entrée/sortie trouvée, les blocs +correspondants sont marqués comme mauvais dans le fichier `content`. +Ces mauvais blocs sont listés dans `status` et peuvent être corrigés +avec `fix -e`. +Après la correction, lors du prochain nettoyage, ils seront revérifiés, +et s'ils sont jugés corrigés, la marque "mauvais" sera supprimée. +Pour nettoyer uniquement les mauvais blocs, vous pouvez utiliser la +commande `scrub -p bad`. +

Il est recommandé d'exécuter `scrub` uniquement sur une baie +synchronisée pour éviter les erreurs signalées causées par des données +non synchronisées. Ces erreurs sont reconnues comme n'étant pas +des erreurs silencieuses, et les blocs ne sont pas marqués comme mauvais, +mais de telles erreurs sont signalées dans la sortie de la commande. +

Le fichier `content` est modifié pour mettre à jour l'heure de la dernière +vérification de chaque bloc et pour marquer les mauvais blocs. +Les fichiers `parity` NE SONT PAS modifiés. +Les fichiers dans la baie NE SONT PAS modifiés. +

+
+

+fix +

+

Corrige tous les fichiers et les données de parité. +

Tous les fichiers et les données de parité sont comparés à l'état +de l'instantané enregistré lors du dernier `sync`. +Si une différence est trouvée, elle est rétablie à l'instantané stocké. +

AVERTISSEMENT ! La commande `fix` ne fait pas de distinction entre +les erreurs et les modifications intentionnelles. Elle rétablit +inconditionnellement l'état du fichier au dernier `sync`. +

Si aucune autre option n'est spécifiée, l'intégralité de la baie est traitée. +Utilisez les options de filtre pour sélectionner un sous-ensemble de +fichiers ou de disques sur lesquels opérer. +

Pour corriger uniquement les blocs marqués mauvais pendant `sync` et `scrub`, +utilisez l'option -e, --filter-error. +Contrairement aux autres options de filtre, celle-ci applique des corrections +uniquement aux fichiers qui sont inchangés depuis le dernier `sync`. +

SnapRAID renomme tous les fichiers qui ne peuvent pas être corrigés +en ajoutant l'extension `.unrecoverable`. +

Avant de corriger, l'intégralité de la baie est scannée pour trouver +tout fichier déplacé depuis la dernière opération `sync`. +Ces fichiers sont identifiés par leur horodatage, ignorant leur nom +et leur répertoire, et sont utilisés dans le processus de récupération +si nécessaire. +Si vous en avez déplacé certains en dehors de la baie, vous pouvez +utiliser l'option -i, --import pour spécifier des répertoires +supplémentaires à scanner. +

Les fichiers sont identifiés uniquement par chemin, pas par inode. +

Le fichier `content` N'EST PAS modifié. +Les fichiers `parity` sont modifiés si nécessaire. +Les fichiers dans la baie sont modifiés si nécessaire. +

+
+

+check +

+

Vérifie tous les fichiers et les données de parité. +

Il fonctionne comme `fix`, mais il simule seulement une récupération +et aucune modification n'est écrite sur la baie. +

Cette commande est principalement destinée à la vérification manuelle, +comme après un processus de récupération ou dans d'autres conditions +spéciales. Pour les vérifications périodiques et planifiées, utilisez +`scrub`. +

Si vous utilisez l'option -a, --audit-only, seules les données +des fichiers sont vérifiées, et les données de parité sont ignorées +pour une exécution plus rapide. +

Les fichiers sont identifiés uniquement par chemin, pas par inode. +

Rien n'est modifié. +

+
+

+list +

+

Liste tous les fichiers contenus dans la baie au moment du dernier +`sync`. +

Avec -v ou --verbose, l'heure en sous-seconde est également affichée. +

Rien n'est modifié. +

+
+

+dup +

+

Liste tous les fichiers en double. Deux fichiers sont considérés +comme égaux si leurs hachages correspondent. Les données des fichiers +ne sont pas lues ; seuls les hachages précalculés sont utilisés. +

Rien n'est modifié. +

+
+

+pool +

+

Crée ou met à jour une vue virtuelle de tous +les fichiers de votre baie de disques dans le répertoire `pooling`. +

Les fichiers ne sont pas copiés mais liés à l'aide de +liens symboliques. +

Lors de la mise à jour, tous les liens symboliques et les +sous-répertoires vides existants sont supprimés et remplacés par +la nouvelle vue de la baie. Tout autre fichier ordinaire est laissé +en place. +

Rien n'est modifié en dehors du répertoire du pool. +

+
+

+devices +

+

Affiche les périphériques de bas niveau utilisés par la baie. +

Cette commande affiche les associations de périphériques dans la baie +et est principalement destinée à être une interface de script. +

Les deux premières colonnes sont l'ID et le chemin du périphérique +de bas niveau. Les deux colonnes suivantes sont l'ID et le chemin +du périphérique de haut niveau. La dernière colonne est le nom du +disque dans la baie. +

Dans la plupart des cas, vous avez un périphérique de bas niveau +pour chaque disque de la baie, mais dans certaines configurations +plus complexes, vous pouvez avoir plusieurs périphériques de bas +niveau utilisés par un seul disque de la baie. +

Rien n'est modifié. +

+
+

+touch +

+

Définit un horodatage arbitraire en sous-seconde pour tous les fichiers +qui l'ont défini à zéro. +

Cela améliore la capacité de SnapRAID à reconnaître les fichiers +déplacés et copiés, car cela rend l'horodatage presque unique, +réduisant les doublons possibles. +

Plus précisément, si l'horodatage en sous-seconde n'est pas zéro, +un fichier déplacé ou copié est identifié comme tel s'il correspond +au nom, à la taille et à l'horodatage. Si l'horodatage en sous-seconde +est zéro, il est considéré comme une copie uniquement si le chemin +complet, la taille et l'horodatage correspondent tous. +

L'horodatage à la seconde près n'est pas modifié, +de sorte que toutes les dates et heures de vos fichiers seront +préservées. +

+
+

+rehash +

+

Planifie un nouveau hachage de toute la baie. +

Cette commande change le type de hachage utilisé, généralement lors +de la mise à niveau d'un système 32 bits vers un système 64 bits, +pour passer de MurmurHash3 au plus rapide SpookyHash. +

Si vous utilisez déjà le hachage optimal, cette commande +ne fait rien et vous informe qu'aucune action n'est nécessaire. +

Le nouveau hachage n'est pas effectué immédiatement, mais a lieu +progressivement pendant `sync` et `scrub`. +

Vous pouvez vérifier l'état du nouveau hachage en utilisant `status`. +

Pendant le nouveau hachage, SnapRAID conserve toutes ses +fonctionnalités, à la seule exception que `dup` ne peut pas +détecter les fichiers en double utilisant un hachage différent. +

+
+
+

+Options +

+

SnapRAID fournit les options suivantes : +

+
+
+-c, --conf CONFIG +
+Sélectionne le fichier de configuration à utiliser. S'il n'est pas +spécifié, sous Unix, il utilise le fichier `/usr/local/etc/snapraid.conf` +s'il existe, sinon `/etc/snapraid.conf`. +Sous Windows, il utilise le fichier `snapraid.conf` dans le même +répertoire que `snapraid.exe`. +
+
+
+
+
+
+-f, --filter MOTIF +
+Filtre les fichiers à traiter dans `check` et `fix`. +Seuls les fichiers correspondant au motif spécifié sont traités. +Cette option peut être utilisée plusieurs fois. +Voir la section MOTIF pour plus de détails sur les +spécifications de motifs. +Sous Unix, assurez-vous que les caractères de globbing sont +entre guillemets s'ils sont utilisés. +Cette option ne peut être utilisée qu'avec `check` et `fix`. +Elle ne peut pas être utilisée avec `sync` et `scrub`, car ils +traitent toujours l'intégralité de la baie. +
+
+
+
+
+
+-d, --filter-disk NOM +
+Filtre les disques à traiter dans `check`, `fix`, `up` et `down`. +Vous devez spécifier un nom de disque tel que défini dans le fichier +de configuration. +Vous pouvez également spécifier des disques de parité avec les noms : +`parity`, `2-parity`, `3-parity`, etc., pour limiter les opérations +à un disque de parité spécifique. +Si vous combinez plusieurs options --filter, --filter-disk et +--filter-missing, seuls les fichiers correspondant à tous les filtres +sont sélectionnés. +Cette option peut être utilisée plusieurs fois. +Cette option ne peut être utilisée qu'avec `check`, `fix`, `up` +et `down`. +Elle ne peut pas être utilisée avec `sync` et `scrub`, car ils +traitent toujours l'intégralité de la baie. +
+
+
+
+
+
+-m, --filter-missing +
+Filtre les fichiers à traiter dans `check` et `fix`. +Seuls les fichiers manquants ou supprimés de la baie sont traités. +Lorsqu'elle est utilisée avec `fix`, cela agit comme une commande +`undelete` (restaurer). +Si vous combinez plusieurs options --filter, --filter-disk et +--filter-missing, seuls les fichiers correspondant à tous les filtres +sont sélectionnés. +Cette option ne peut être utilisée qu'avec `check` et `fix`. +Elle ne peut pas être utilisée avec `sync` et `scrub`, car ils +traitent toujours l'intégralité de la baie. +
+
+
+
+
+
+-e, --filter-error +
+Traite les fichiers avec des erreurs dans `check` et `fix`. +Il ne traite que les fichiers qui ont des blocs marqués avec des erreurs +silencieuses ou d'entrée/sortie pendant `sync` et `scrub`, tels +que listés dans `status`. +Cette option ne peut être utilisée qu'avec `check` et `fix`. +
+
+
+
+
+
+-p, --plan PERC|bad|new|full +
+Sélectionne le plan de nettoyage. Si PERC est une valeur numérique +de 0 à 100, elle est interprétée comme le pourcentage de blocs à +nettoyer. +Au lieu d'un pourcentage, vous pouvez spécifier un plan : +`bad` nettoie les mauvais blocs, `new` nettoie les blocs +qui n'ont pas encore été nettoyés, et `full` nettoie tout. +Cette option ne peut être utilisée qu'avec `scrub`. +
+
+
+
+
+
+-o, --older-than JOURS +
+Sélectionne la partie la plus ancienne de la baie à traiter dans `scrub`. +JOURS est l'âge minimum en jours pour qu'un bloc soit nettoyé ; +la valeur par défaut est 10. +Les blocs marqués comme mauvais sont toujours nettoyés, +quelle que soit cette option. +Cette option ne peut être utilisée qu'avec `scrub`. +
+
+
+
+
+
+-a, --audit-only +
+Dans `check`, vérifie le hachage des fichiers sans +vérifier les données de parité. +Si vous êtes intéressé uniquement par la vérification des données +des fichiers, cette option peut accélérer considérablement le +processus de vérification. +Cette option ne peut être utilisée qu'avec `check`. +
+
+
+
+
+
+-h, --pre-hash +
+Dans `sync`, exécute une phase de hachage préliminaire de toutes +les nouvelles données pour une vérification supplémentaire avant +le calcul de la parité. +Habituellement, dans `sync`, aucun hachage préliminaire n'est +effectué, et les nouvelles données sont hachées juste avant +le calcul de la parité lorsqu'elles sont lues pour la première fois. +Ce processus se produit lorsque le système est soumis à +une lourde charge, avec tous les disques en rotation et un +processeur occupé. +Il s'agit d'une condition extrême pour la machine, et si elle +présente un problème matériel latent, des erreurs silencieuses +peuvent passer inaperçues car les données ne sont pas encore +hachées. +Pour éviter ce risque, vous pouvez activer le mode `pre-hash` +pour que toutes les données soient lues deux fois afin de +garantir leur intégrité. +Cette option vérifie également les fichiers déplacés au sein +de la baie pour s'assurer que l'opération de déplacement a +réussi et, si nécessaire, vous permet d'exécuter une +opération fix avant de continuer. +Cette option ne peut être utilisée qu'avec `sync`. +
+
+
+
+
+
+-i, --import DOSSIER +
+Importe à partir du répertoire spécifié tous les fichiers supprimés +de la baie après le dernier `sync`. +Si vous avez toujours de tels fichiers, ils peuvent être utilisés +par `check` et `fix` pour améliorer le processus de récupération. +Les fichiers sont lus, y compris dans les sous-répertoires, et sont +identifiés quel que soit leur nom. +Cette option ne peut être utilisée qu'avec `check` et `fix`. +
+
+
+
+
+
+-s, --spin-down-on-error +
+En cas d'erreur, arrête (spin down) tous les disques gérés avant +de quitter avec un code d'état non nul. Cela empêche les +lecteurs de rester actifs et en rotation après une opération +interrompue, aidant à éviter une accumulation inutile de chaleur +et une consommation d'énergie. Utilisez cette option pour vous +assurer que les disques sont arrêtés en toute sécurité +même lorsqu'une commande échoue. +
+
+
+
+
+
+-w, --bw-limit DÉBIT +
+Applique une limite de bande passante globale pour tous les disques. +Le DÉBIT est le nombre d'octets par seconde. Vous pouvez spécifier +un multiplicateur tel que K, M ou G (par exemple, --bw-limit 1G). +
+
+
+
+
+
+-A, --stats +
+Active une vue d'état étendue qui affiche des informations +supplémentaires. +L'écran affiche deux graphiques : +Le premier graphique montre le nombre de bandes mises en mémoire +tampon pour chaque disque, ainsi que le chemin d'accès au fichier +en cours d'accès sur ce disque. Généralement, le disque le plus +lent n'aura pas de tampon disponible, ce qui détermine la +bande passante maximale réalisable. +Le deuxième graphique montre le pourcentage de temps passé en attente +au cours des 100 dernières secondes. Le disque le plus lent est +censé causer la majeure partie du temps d'attente, tandis que les +autres disques devraient avoir peu ou pas de temps d'attente car +ils peuvent utiliser leurs bandes mises en mémoire tampon. +Ce graphique montre également le temps passé en attente pour les +calculs de hachage et les calculs RAID. +Tous les calculs s'exécutent en parallèle avec les opérations de disque. +Par conséquent, tant qu'il y a un temps d'attente mesurable pour +au moins un disque, cela indique que le processeur est suffisamment +rapide pour suivre la charge de travail. +
+
+
+
+
+
+-Z, --force-zero +
+Force l'opération non sécurisée de synchronisation d'un fichier +de taille zéro qui était auparavant non nul. +Si SnapRAID détecte une telle condition, il arrête de +procéder à moins que vous ne spécifiiez cette option. +Cela vous permet de détecter facilement quand, après un +plantage du système, certains fichiers accédés ont été tronqués. +C'est une condition possible sous Linux avec les systèmes +de fichiers ext3/ext4. +Cette option ne peut être utilisée qu'avec `sync`. +
+
+
+
+
+
+-E, --force-empty +
+Force l'opération non sécurisée de synchronisation d'un disque +avec tous les fichiers originaux manquants. +Si SnapRAID détecte que tous les fichiers initialement présents +sur le disque sont manquants ou réécrits, il arrête de +procéder à moins que vous ne spécifiiez cette option. +Cela vous permet de détecter facilement lorsqu'un système de +fichiers de données n'est pas monté. +Cette option ne peut être utilisée qu'avec `sync`. +
+
+
+
+
+
+-U, --force-uuid +
+Force l'opération non sécurisée de synchronisation, vérification +et correction avec des disques qui ont changé leur UUID. +Si SnapRAID détecte que certains disques ont changé d'UUID, +il arrête de procéder à moins que vous ne spécifiiez cette option. +Cela vous permet de détecter lorsque vos disques sont montés +aux mauvais points de montage. +Il est cependant autorisé d'avoir un seul changement d'UUID +avec une seule parité, et plus avec une parité multiple, +car c'est le cas normal lors du remplacement des disques après +une récupération. +Cette option ne peut être utilisée qu'avec `sync`, `check` ou +`fix`. +
+
+
+
+
+
+-D, --force-device +
+Force l'opération non sécurisée de correction avec des disques +inaccessibles ou avec des disques sur le même périphérique physique. +Par exemple, si vous avez perdu deux disques de données et que +vous avez un disque de rechange pour ne récupérer que le premier, +vous pouvez ignorer le deuxième disque inaccessible. +Ou, si vous souhaitez récupérer un disque dans l'espace libre +restant sur un disque déjà utilisé, partageant le même +périphérique physique. +Cette option ne peut être utilisée qu'avec `fix`. +
+
+
+
+
+
+-N, --force-nocopy +
+Dans `sync`, `check` et `fix`, désactive l'heuristique de détection +de copie. +Sans cette option, SnapRAID suppose que les fichiers ayant les mêmes +attributs, tels que le nom, la taille et l'horodatage, sont des copies +avec les mêmes données. +Cela permet d'identifier les fichiers copiés ou déplacés d'un disque +à un autre et réutilise les informations de hachage déjà calculées +pour détecter les erreurs silencieuses ou pour récupérer les fichiers +manquants. +Dans de rares cas, ce comportement peut entraîner des faux positifs +ou un processus lent en raison de nombreuses vérifications de hachage, +et cette option vous permet de résoudre de tels problèmes. +Cette option ne peut être utilisée qu'avec `sync`, `check` et `fix`. +
+
+
+
+
+
+-F, --force-full +
+Dans `sync`, force un recomptage complet de la parité. +Cette option peut être utilisée lorsque vous ajoutez un nouveau +niveau de parité ou si vous êtes revenu à un ancien fichier +de contenu utilisant des données de parité plus récentes. +Au lieu de recréer la parité à partir de zéro, cela vous permet +de réutiliser les hachages présents dans le fichier de contenu +pour valider les données et maintenir la protection des données +pendant le processus `sync` en utilisant les données de parité +existantes. +Cette option ne peut être utilisée qu'avec `sync`. +
+
+
+
+
+
+-R, --force-realloc +
+Dans `sync`, force une réallocation complète des fichiers et +une reconstruction de la parité. +Cette option peut être utilisée pour réallouer complètement +tous les fichiers, en supprimant la fragmentation, tout en +réutilisant les hachages présents dans le fichier de contenu +pour valider les données. +Cette option ne peut être utilisée qu'avec `sync`. +AVERTISSEMENT ! Cette option est réservée aux experts, et il est +fortement recommandé de ne pas l'utiliser. +Vous N'AVEZ AUCUNE protection des données pendant l'opération `sync`. +
+
+
+
+
+
+-l, --log FICHIER +
+Écrit un journal détaillé dans le fichier spécifié. +Si cette option n'est pas spécifiée, les erreurs inattendues +sont imprimées à l'écran, ce qui peut entraîner une sortie +excessive en cas de nombreuses erreurs. Lorsque -l, --log est +spécifié, seules les erreurs fatales qui entraînent l'arrêt +de SnapRAID sont imprimées à l'écran. +Si le chemin commence par '>>', le fichier est ouvert +en mode ajout. Les occurrences de '%D' et '%T' dans le nom sont +remplacées par la date et l'heure au format YYYYMMDD et +HHMMSS. Dans les fichiers batch Windows, vous devez doubler +le caractère '%', par exemple, result-%%D.log. Pour utiliser +'>>', vous devez encadrer le nom de guillemets, par exemple, +`">>result.log"`. +Pour sortir le journal sur la sortie standard ou l'erreur +standard, vous pouvez utiliser `">&1"` et `">&2"`, +respectivement. +Consultez le fichier ou la page de manuel snapraid_log.txt +pour les descriptions des balises de journal. +
+
+
+
+
+
+-L, --error-limit NOMBRE +
+Définit une nouvelle limite d'erreurs avant d'arrêter l'exécution. +Par défaut, SnapRAID s'arrête s'il rencontre plus de 100 +erreurs d'entrée/sortie, indiquant qu'un disque est +probablement en panne. +Cette option affecte `sync` et `scrub`, qui sont autorisés +à continuer après le premier ensemble d'erreurs de disque +pour essayer de terminer leurs opérations. +Cependant, `check` et `fix` s'arrêtent toujours à la première erreur. +
+
+
+
+
+
+-S, --start BLKSTART +
+Commence le traitement à partir du numéro de bloc spécifié. +Cela peut être utile pour réessayer de vérifier ou de corriger +des blocs spécifiques en cas de disque endommagé. +Cette option est principalement destinée à la récupération manuelle avancée. +
+
+
+
+
+
+-B, --count BLKCOUNT +
+Ne traite que le nombre de blocs spécifié. +Cette option est principalement destinée à la récupération manuelle avancée. +
+
+
+
+
+
+-C, --gen-conf CONTENU +
+Génère un fichier de configuration factice à partir d'un +fichier de contenu existant. +Le fichier de configuration est écrit sur la sortie standard +et n'écrase pas un fichier existant. +Ce fichier de configuration contient également les informations +nécessaires pour reconstruire les points de montage du disque au +cas où vous perdriez l'intégralité du système. +
+
+
+
+
+
+-v, --verbose +
+Affiche plus d'informations à l'écran. +S'il est spécifié une fois, il affiche les fichiers exclus +et des statistiques supplémentaires. +Cette option n'a aucun effet sur les fichiers journaux. +
+
+
+
+
+
+-q, --quiet +
+Affiche moins d'informations à l'écran. +S'il est spécifié une fois, il supprime la barre de progression ; +deux fois, les opérations en cours ; trois fois, les messages +d'information ; quatre fois, les messages d'état. +Les erreurs fatales sont toujours imprimées à l'écran. +Cette option n'a aucun effet sur les fichiers journaux. +
+
+
+
+
+
+-H, --help +
+Affiche un écran d'aide court. +
+
+
+
+
+
+-V, --version +
+Affiche la version du programme. +
+
+
+
+
+

+Configuration +

+

SnapRAID nécessite un fichier de configuration pour savoir où se trouve +votre baie de disques et où stocker les informations de parité. +

Sous Unix, il utilise le fichier `/usr/local/etc/snapraid.conf` s'il existe, +sinon `/etc/snapraid.conf`. +Sous Windows, il utilise le fichier `snapraid.conf` dans le même +répertoire que `snapraid.exe`. +

Il doit contenir les options suivantes (sensibles à la casse) : +

+

+parity FICHIER [,FICHIER] ... +

+

Définit les fichiers à utiliser pour stocker les informations de parité. +La parité permet une protection contre une seule défaillance +de disque, similaire au RAID5. +

Vous pouvez spécifier plusieurs fichiers, qui doivent se trouver +sur des disques différents. +Lorsqu'un fichier ne peut plus grandir, le suivant est utilisé. +L'espace total disponible doit être au moins aussi grand que le +plus grand disque de données de la baie. +

Vous pouvez ajouter des fichiers de parité supplémentaires plus tard, +mais vous ne pouvez pas les réorganiser ni les supprimer. +

Garder les disques de parité réservés à la parité garantit qu'ils +ne deviennent pas fragmentés, améliorant les performances. +

Sous Windows, 256 Mo sont laissés inutilisés sur chaque disque pour +éviter l'avertissement concernant les disques pleins. +

Cette option est obligatoire et ne peut être utilisée qu'une seule fois. +

+
+

+(2,3,4,5,6)-parity FICHIER [,FICHIER] ... +

+

Définit les fichiers à utiliser pour stocker les informations de parité +supplémentaires. +

Pour chaque niveau de parité spécifié, un niveau de protection +supplémentaire est activé : +

    +
  • +2-parity active la double parité RAID6. +
  • +
  • +3-parity active la triple parité. +
  • +
  • +4-parity active la quadruple (quatre) parité. +
  • +
  • +5-parity active la penta (cinq) parité. +
  • +
  • +6-parity active l'hexa (six) parité. +
  • +
+

Chaque niveau de parité nécessite la présence de tous les niveaux +de parité précédents. +

Les mêmes considérations que pour l'option 'parity' s'appliquent. +

Ces options sont facultatives et ne peuvent être utilisées qu'une seule fois. +

+
+

+z-parity FICHIER [,FICHIER] ... +

+

Définit un fichier et un format alternatifs pour stocker la triple parité. +

Cette option est une alternative à '3-parity', principalement destinée +aux processeurs bas de gamme comme ARM ou AMD Phenom, Athlon et Opteron +qui ne prennent pas en charge l'ensemble d'instructions SSSE3. Dans de +tels cas, elle offre de meilleures performances. +

Ce format est similaire mais plus rapide que celui utilisé par ZFS RAIDZ3. +Comme ZFS, il ne fonctionne pas au-delà de la triple parité. +

Lors de l'utilisation de '3-parity', vous serez averti s'il est +recommandé d'utiliser le format 'z-parity' pour une amélioration des +performances. +

Il est possible de convertir d'un format à l'autre en ajustant +le fichier de configuration avec le fichier z-parity ou 3-parity souhaité +et en utilisant 'fix' pour le recréer. +

+
+

+content FICHIER +

+

Définit le fichier à utiliser pour stocker la liste et les sommes de +contrôle de tous les fichiers présents dans votre baie de disques. +

Il peut être placé sur un disque utilisé pour les données, la parité, +ou tout autre disque disponible. +Si vous utilisez un disque de données, ce fichier est automatiquement +exclu du processus `sync`. +

Cette option est obligatoire et peut être utilisée plusieurs fois pour +enregistrer plusieurs copies du même fichier. +

Vous devez stocker au moins une copie pour chaque disque de parité +utilisé plus un. L'utilisation de copies supplémentaires ne nuit pas. +

+
+

+data NOM DOSSIER +

+

Définit le nom et le point de montage des disques de données dans +la baie. NOM est utilisé pour identifier le disque et doit +être unique. DOSSIER est le point de montage du disque dans le +système de fichiers. +

Vous pouvez modifier le point de montage au besoin, tant que +vous gardez le NOM fixe. +

Vous devriez utiliser une option pour chaque disque de données +de la baie. +

Vous pouvez renommer un disque plus tard en changeant le NOM directement +dans le fichier de configuration, puis en exécutant une commande 'sync'. +Dans le cas d'un renommage, l'association est faite en utilisant l'UUID +stocké des disques. +

+
+

+nohidden +

+

Exclut tous les fichiers et répertoires cachés. +Sous Unix, les fichiers cachés sont ceux commençant par `.`. +Sous Windows, ce sont ceux avec l'attribut caché. +

+
+

+exclude/include MOTIF +

+

Définit les motifs de fichiers ou de répertoires à exclure ou à inclure +dans le processus de synchronisation. +Tous les motifs sont traités dans l'ordre spécifié. +

Si le premier motif qui correspond est un `exclude` (exclure), le fichier +est exclu. S'il s'agit d'un `include` (inclure), le fichier est inclus. +Si aucun motif ne correspond, le fichier est exclu si le dernier motif +spécifié est un `include`, ou inclus si le dernier motif +spécifié est un `exclude`. +

Voir la section MOTIF pour plus de détails sur les +spécifications de motifs. +

Cette option peut être utilisée plusieurs fois. +

+
+

+blocksize TAILLE_EN_KIBIOCTETS +

+

Définit la taille de bloc de base en kibioctets pour la parité. +Un kibioctet est de 1024 octets. +

La taille de bloc par défaut est de 256, ce qui devrait fonctionner +dans la plupart des cas. +

AVERTISSEMENT ! Cette option est réservée aux experts, et il est +fortement recommandé de ne pas modifier cette valeur. Pour modifier +cette valeur à l'avenir, vous devrez recréer l'intégralité de la parité ! +

Une raison d'utiliser une taille de bloc différente est si vous avez +beaucoup de petits fichiers, de l'ordre de millions. +

Pour chaque fichier, même s'il ne contient que quelques octets, un bloc +entier de parité est alloué, et avec de nombreux fichiers, cela peut +entraîner un espace de parité inutilisé important. +Lorsque vous remplissez complètement le disque de parité, vous n'êtes +pas autorisé à ajouter plus de fichiers aux disques de données. +Cependant, la parité gaspillée ne s'accumule pas sur les disques de +données. L'espace gaspillé résultant d'un grand nombre de fichiers +sur un disque de données limite uniquement la quantité de données +sur ce disque de données, pas les autres. +

À titre d'approximation, vous pouvez supposer que la moitié de la +taille de bloc est gaspillée pour chaque fichier. Par exemple, avec +100 000 fichiers et une taille de bloc de 256 Kio, vous gaspillerez +12,8 Go de parité, ce qui peut entraîner 12,8 Go d'espace en moins +disponible sur le disque de données. +

Vous pouvez vérifier la quantité d'espace gaspillé sur chaque disque +en utilisant `status`. +C'est la quantité d'espace que vous devez laisser libre sur les disques +de données ou utiliser pour les fichiers non inclus dans la baie. +Si cette valeur est négative, cela signifie que vous êtes près de +remplir la parité, et cela représente l'espace que vous pouvez encore +gaspiller. +

Pour éviter ce problème, vous pouvez utiliser une partition plus grande +pour la parité. Par exemple, si la partition de parité est 12,8 Go plus +grande que les disques de données, vous avez suffisamment d'espace +supplémentaire pour gérer jusqu'à 100 000 fichiers sur chaque disque +de données sans aucun espace gaspillé. +

Une astuce pour obtenir une partition de parité plus grande sous Linux +est de la formater avec la commande : +

+mkfs.ext4 -m 0 -T largefile4 DEVICE
+
+

Cela se traduit par environ 1,5 % d'espace supplémentaire, environ 60 Go +pour un disque de 4 To, ce qui permet environ 460 000 fichiers sur +chaque disque de données sans aucun espace gaspillé. +

+
+

+hashsize TAILLE_EN_OCTETS +

+

Définit la taille du hachage en octets pour les blocs enregistrés. +

La taille de hachage par défaut est de 16 octets (128 bits), +ce qui devrait fonctionner dans la plupart des cas. +

AVERTISSEMENT ! Cette option est réservée aux experts, et il est +fortement recommandé de ne pas modifier cette valeur. Pour modifier +cette valeur à l'avenir, vous devrez recréer l'intégralité de la parité ! +

Une raison d'utiliser une taille de hachage différente est si votre +système a une mémoire limitée. En règle générale, SnapRAID nécessite +généralement 1 Gio de RAM pour chaque 16 To de données dans la baie. +

Plus précisément, pour stocker les hachages des données, SnapRAID +nécessite environ TS*(1+HS)/BS octets de RAM, +où TS est la taille totale en octets de votre baie de disques, BS est la +taille de bloc en octets, et HS est la taille de hachage en octets. +

Par exemple, avec 8 disques de 4 To, une taille de bloc de 256 Kio +(1 Kio = 1024 octets) et une taille de hachage de 16, vous obtenez : +

+RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1,93 Gio
+
+

En passant à une taille de hachage de 8, vous obtenez : +

+RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1,02 Gio
+
+

En passant à une taille de bloc de 512, vous obtenez : +

+RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0,96 Gio
+
+

En passant à la fois à une taille de hachage de 8 et à une taille de +bloc de 512, vous obtenez : +

+RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0,51 Gio
+
+
+
+

+autosave TAILLE_EN_GIGAOCTETS +

+

Enregistre automatiquement l'état lors de la synchronisation ou du +nettoyage après la quantité spécifiée de Go traités. +Cette option est utile pour éviter de redémarrer de longues commandes +`sync` à partir de zéro si elles sont interrompues par un plantage +de la machine ou tout autre événement. +

+
+

+temp_limit TEMPÉRATURE_CELSIUS +

+

Définit la température maximale autorisée du disque en Celsius. +Lorsqu'elle est spécifiée, SnapRAID vérifie périodiquement la +température de tous les disques à l'aide de l'outil smartctl. +Les températures actuelles des disques sont affichées pendant que +SnapRAID fonctionne. Si un disque dépasse cette limite, toutes les +opérations s'arrêtent et les disques sont arrêtés (mis en veille) +pendant la durée définie par l'option `temp_sleep`. Après la période +de veille, les opérations reprennent, pouvant s'arrêter à nouveau si +la limite de température est de nouveau atteinte. +

Pendant le fonctionnement, SnapRAID analyse également la courbe de +chauffe de chaque disque et estime la température stable à long terme +qu'ils sont censés atteindre si l'activité continue. L'estimation +n'est effectuée qu'après que la température du disque a augmenté +quatre fois, garantissant que suffisamment de points de données sont +disponibles pour établir une tendance fiable. +Cette température stable prédite est affichée entre parenthèses à +côté de la valeur actuelle et aide à évaluer si le refroidissement +du système est adéquat. Cette température estimée est uniquement à +titre informatif et n'a aucun effet sur le comportement de SnapRAID. +Les actions du programme sont basées uniquement sur les températures +réelles mesurées des disques. +

Pour effectuer cette analyse, SnapRAID a besoin d'une référence pour +la température du système. Il tente d'abord de la lire à partir des +capteurs matériels disponibles. Si aucun capteur système n'est +accessible, il utilise la température de disque la plus basse mesurée +au début de l'exécution comme référence de secours. +

Normalement, SnapRAID n'affiche que la température du disque le plus chaud. +Pour afficher la température de tous les disques, utilisez l'option +-A ou --stats. +

+
+

+temp_sleep TEMPS_EN_MINUTES +

+

Définit le temps de veille, en minutes, lorsque la limite de température +est atteinte. Pendant cette période, les disques restent arrêtés. +La valeur par défaut est de 5 minutes. +

+
+

+pool DOSSIER +

+

Définit le répertoire de mise en commun où la vue virtuelle de la +baie de disques est créée à l'aide de la commande `pool`. +

Le répertoire doit déjà exister. +

+
+

+share CHEMIN_UNC +

+

Définit le chemin UNC Windows requis pour accéder aux disques à distance. +

Si cette option est spécifiée, les liens symboliques créés dans le +répertoire du pool utilisent ce chemin UNC pour accéder aux disques. +Sans cette option, les liens symboliques générés utilisent uniquement +des chemins locaux, ce qui ne permet pas de partager le répertoire +du pool sur le réseau. +

Les liens symboliques sont formés en utilisant le chemin UNC spécifié, +en ajoutant le nom du disque tel que spécifié dans l'option `data`, +et en ajoutant enfin le répertoire et le nom du fichier. +

Cette option est requise uniquement pour Windows. +

+
+

+smartctl DISQUE/PARITÉ OPTIONS... +

+

Définit les options smartctl personnalisées pour obtenir les attributs +SMART de chaque disque. Cela peut être nécessaire pour les contrôleurs +RAID et certains disques USB qui ne peuvent pas être détectés +automatiquement. Le placeholder %s est remplacé par le nom du +périphérique, mais il est facultatif pour les périphériques fixes +comme les contrôleurs RAID. +

DISQUE est le même nom de disque spécifié dans l'option `data`. +PARITÉ est l'un des noms de parité : `parity`, `2-parity`, `3-parity`, +`4-parity`, `5-parity`, `6-parity` ou `z-parity`. +

Dans les OPTIONS spécifiées, la chaîne `%s` est remplacée par le +nom du périphérique. Pour les contrôleurs RAID, le périphérique est +probablement fixe, et vous n'aurez peut-être pas besoin d'utiliser `%s`. +

Consultez la documentation smartmontools pour les options possibles : +

+https://www.smartmontools.org/wiki/Supported_RAID-Controllers
+https://www.smartmontools.org/wiki/Supported_USB-Devices
+
+

Par exemple : +

+smartctl parity -d sat %s
+
+
+
+

+smartignore DISQUE/PARITÉ ATTR [ATTR...] +

+

Ignore l'attribut SMART spécifié lors du calcul de la probabilité +de défaillance du disque. Cette option est utile si un disque signale +des valeurs inhabituelles ou trompeuses pour un attribut particulier. +

DISQUE est le même nom de disque spécifié dans l'option `data`. +PARITÉ est l'un des noms de parité : `parity`, `2-parity`, `3-parity`, +`4-parity`, `5-parity`, `6-parity` ou `z-parity`. +La valeur spéciale * peut être utilisée pour ignorer l'attribut +sur tous les disques. +

Par exemple, pour ignorer l'attribut `Current Pending Sector Count` +sur tous les disques : +

+smartignore * 197
+
+

Pour l'ignorer uniquement sur le premier disque de parité : +

+smartignore parity 197
+
+
+
+

+Exemples +

+

Un exemple de configuration typique pour Unix est : +

+parity /mnt/diskp/snapraid.parity
+content /mnt/diskp/snapraid.content
+content /var/snapraid/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+exclude /lost+found/
+exclude /tmp/
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/sg0
+smartctl 2-parity -d areca,2/1 /dev/sg0
+
+

Un exemple de configuration typique pour Windows est : +

+parity E:\snapraid.parity
+content E:\snapraid.content
+content C:\snapraid\snapraid.content
+data d1 G:\array\
+data d2 H:\array\
+data d3 I:\array\
+exclude Thumbs.db
+exclude \$RECYCLE.BIN
+exclude \System Volume Information
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/arcmsr0
+smartctl 2-parity -d areca,2/1 /dev/arcmsr0
+
+
+
+
+

+Motif (Pattern) +

+

Les motifs offrent un moyen flexible de filtrer les fichiers à inclure ou +à exclure. En utilisant des caractères de "globbing", vous pouvez définir des règles qui +correspondent à des noms de fichiers spécifiques ou à des structures de répertoires entières sans +lister chaque chemin manuellement. +

Le point d'interrogation `?` correspond à n'importe quel caractère unique, sauf le +séparateur de répertoire. Cela le rend utile pour faire correspondre des noms de fichiers avec des +caractères variables tout en limitant le motif à un seul niveau de répertoire. +

L'étoile simple `*` correspond à n'importe quelle séquence de caractères, mais comme le +point d'interrogation, elle ne traverse jamais les frontières des répertoires. Elle s'arrête à la +barre oblique, ce qui la rend adaptée à la recherche de correspondances au sein d'un seul +composant de chemin. Il s'agit du comportement standard des jokers familier du +"globbing" shell. +

La double étoile `**` est plus puissante, elle correspond à n'importe quelle séquence de +caractères, y compris les séparateurs de répertoires. Cela permet aux motifs de correspondre +sur plusieurs niveaux de répertoires. Lorsque `**` apparaît directement intégré dans +un motif, il peut correspondre à zéro ou plusieurs caractères, y compris les barres obliques entre +le texte littéral environnant. +

L'utilisation la plus importante de `**` est sous la forme spéciale `/**/`. Celle-ci correspond à +zéro ou plusieurs niveaux de répertoires complets, ce qui permet de faire correspondre des fichiers +à n'importe quelle profondeur dans une arborescence de répertoires sans connaître la structure exacte du chemin. +Par exemple, le motif `src/**/main.js` correspond à `src/main.js` (saut de +zéro répertoire), `src/ui/main.js` (saut d'un répertoire), et +`src/ui/components/main.js` (saut de deux répertoires). +

Les classes de caractères utilisant des crochets `[]` correspondent à un seul caractère d'un +ensemble ou d'une plage spécifiés. Comme les autres motifs à caractère unique, elles +ne correspondent pas aux séparateurs de répertoires. Les classes supportent les plages et la négation à l'aide +d'un point d'exclamation. +

La distinction fondamentale à retenir est que `*`, `?` et les classes de caractères +respectent tous les limites des répertoires et ne correspondent qu'au sein d'un seul +composant de chemin, alors que `**` est le seul motif qui peut correspondre à travers +les séparateurs de répertoires. +

Il existe quatre types de motifs différents : +

+
+
+FILE +
+Sélectionne n'importe quel fichier nommé FILE. +Ce motif s'applique uniquement aux fichiers, pas aux répertoires. +
+
+
+
+
+
+DIR/ +
+Sélectionne n'importe quel répertoire nommé DIR et tout son contenu. +Ce motif s'applique uniquement aux répertoires, pas aux fichiers. +
+
+
+
+
+
+/PATH/FILE +
+Sélectionne le chemin exact du fichier spécifié. Ce motif s'applique +uniquement aux fichiers, pas aux répertoires. +
+
+
+
+
+
+/PATH/DIR/ +
+Sélectionne le chemin exact du répertoire spécifié et tout son contenu. +Ce motif s'applique uniquement aux répertoires, pas aux fichiers. +
+
+
+

Lorsque vous spécifiez un chemin absolu commençant par /, il est +appliqué à la racine de la baie, et non à la racine du système +de fichiers local. +

Sous Windows, vous pouvez utiliser la barre oblique inverse \ au lieu +de la barre oblique /. +Les répertoires système Windows, les jonctions, les points de montage +et les autres répertoires spéciaux Windows sont traités comme des fichiers, +ce qui signifie que pour les exclure, vous devez utiliser une règle +de fichier, pas une règle de répertoire. +

Si le nom de fichier contient un caractère '*', '?', '[', +ou ']', vous devez l'échapper pour éviter qu'il ne soit interprété +comme un caractère de globbing. Sous Unix, le caractère d'échappement +est '\' ; sous Windows, c'est '^'. +Lorsque le motif est sur la ligne de commande, vous devez doubler +le caractère d'échappement pour éviter qu'il ne soit interprété +par le shell de commande. +

Dans le fichier de configuration, vous pouvez utiliser différentes +stratégies pour filtrer les fichiers à traiter. +L'approche la plus simple consiste à n'utiliser que des règles +`exclude` pour supprimer tous les fichiers et répertoires que vous +ne voulez pas traiter. Par exemple : +

+# Exclut tout fichier nommé `*.unrecoverable`
+exclude *.unrecoverable
+# Exclut le répertoire racine `/lost+found`
+exclude /lost+found/
+# Exclut tout sous-répertoire nommé `tmp`
+exclude tmp/
+
+

L'approche opposée consiste à ne définir que les fichiers que vous +souhaitez traiter, en n'utilisant que des règles `include`. Par exemple : +

+# Inclut uniquement certains répertoires
+include /movies/
+include /musics/
+include /pictures/
+
+

L'approche finale consiste à mélanger les règles `exclude` et `include`. +Dans ce cas, l'ordre des règles est important. Les règles antérieures +ont préséance sur les règles ultérieures. +Pour simplifier, vous pouvez lister toutes les règles `exclude` +d'abord, puis toutes les règles `include`. Par exemple : +

+# Exclut tout fichier nommé `*.unrecoverable`
+exclude *.unrecoverable
+# Exclut tout sous-répertoire nommé `tmp`
+exclude tmp/
+# Inclut uniquement certains répertoires
+include /movies/
+include /musics/
+include /pictures/
+
+

Sur la ligne de commande, en utilisant l'option -f, vous ne pouvez +utiliser que des motifs `include`. Par exemple : +

+# Vérifie uniquement les fichiers .mp3.
+# Sous Unix, utilisez des guillemets pour éviter l'expansion
+# du globbing par le shell.
+snapraid -f "*.mp3" check
+
+

Sous Unix, lorsque vous utilisez des caractères de globbing sur la +ligne de commande, vous devez les mettre entre guillemets pour empêcher +le shell de les développer. +

+
+

+Ignorer des Fichiers (Ignore Files) +

+

En plus des règles globales du fichier de configuration, vous pouvez +placer des fichiers `.snapraidignore` dans n'importe quel répertoire de la grappe +pour définir des règles d'exclusion décentralisées. +

Les règles définies dans `.snapraidignore` sont appliquées après les règles du +fichier de configuration. Cela signifie qu'elles ont une priorité plus élevée et peuvent +être utilisées pour exclure des fichiers qui étaient précédemment inclus par la +configuration globale. En pratique, si une règle locale correspond, le fichier est +exclu quels que soient les paramètres d'inclusion globaux. +

La logique des motifs dans `.snapraidignore` reflète la configuration globale +mais ancre les motifs au répertoire où se trouve le fichier : +

+
+
+FILE +
+Sélectionne n'importe quel fichier nommé FILE dans ce répertoire ou en dessous. +Cela suit les mêmes règles de globbing que le motif global. +
+
+
+
+
+
+DIR/ +
+Sélectionne n'importe quel répertoire nommé DIR et tout son contenu, +résidant dans ce répertoire ou en dessous. +
+
+
+
+
+
+/PATH/FILE +
+Sélectionne le fichier exact spécifié par rapport à l'emplacement +du fichier `.snapraidignore`. +
+
+
+
+
+
+/PATH/DIR/ +
+Sélectionne le répertoire exact spécifié et tout son contenu, +par rapport à l'emplacement du fichier `.snapraidignore`. +
+
+
+

Contrairement à la configuration globale, les fichiers `.snapraidignore` ne prennent +en charge que les règles d'exclusion ; vous ne pouvez pas utiliser de motifs `include` ou de négation (!). +

Par exemple, si vous avez un `.snapraidignore` dans `/mnt/disk1/projects/` : +

+# Exclut UNIQUEMENT /mnt/disk1/projects/output.bin
+/output.bin
+# Exclut tout répertoire nommé 'build' dans projects/
+build/
+# Exclut tout fichier .tmp dans projects/ ou ses sous-dossiers
+*.tmp
+
+
+
+

+Contenu (Content) +

+

SnapRAID stocke la liste et les sommes de contrôle de vos fichiers +dans le fichier de contenu. +

Il s'agit d'un fichier binaire qui répertorie tous les fichiers +présents dans votre baie de disques, ainsi que toutes les sommes +de contrôle pour vérifier leur intégrité. +

Ce fichier est lu et écrit par les commandes `sync` et `scrub` et +lu par les commandes `fix`, `check` et `status`. +

+
+

+Parité (Parity) +

+

SnapRAID stocke les informations de parité de votre baie dans +les fichiers de parité. +

Ce sont des fichiers binaires contenant la parité calculée de tous les +blocs définis dans le fichier `content`. +

Ces fichiers sont lus et écrits par les commandes `sync` et `fix` et +lus uniquement par les commandes `scrub` et `check`. +

+
+

+Encodage +

+

SnapRAID sous Unix ignore tout encodage. Il lit et stocke les +noms de fichiers avec le même encodage utilisé par le système +de fichiers. +

Sous Windows, tous les noms lus à partir du système de fichiers sont +convertis et traités au format UTF-8. +

Pour que les noms de fichiers soient imprimés correctement, vous devez +définir la console Windows en mode UTF-8 avec la commande `chcp 65001` +et utiliser une police TrueType comme `Lucida Console` comme police +de console. +Cela n'affecte que les noms de fichiers imprimés ; si vous +redirigez la sortie de la console vers un fichier, le fichier +résultant est toujours au format UTF-8. +

+
+

+Droits d'auteur (Copyright) +

+

Ce fichier est Copyright (C) 2025 Andrea Mazzoleni +

+
+

+Voir aussi (See Also) +

+

snapraid_log(1), snapraidd(1) +

+ + +
+
+
+ + + + + + + diff --git a/beta/manual-it.html b/beta/manual-it.html new file mode 100644 index 00000000..55c50fbf --- /dev/null +++ b/beta/manual-it.html @@ -0,0 +1,2084 @@ + + + + + + + + SnapRAID Manual + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + +
+ +
+ +
+

+Sinossi +

+
+snapraid [-c, --conf CONFIG]
+    [-f, --filter PATTERN] [-d, --filter-disk NAME]
+    [-m, --filter-missing] [-e, --filter-error]
+    [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR]
+    [-p, --plan PERC|bad|new|full]
+    [-o, --older-than DAYS] [-l, --log FILE]
+    [-s, --spin-down-on-error] [-w, --bw-limit RATE]
+    [-Z, --force-zero] [-E, --force-empty]
+    [-U, --force-uuid] [-D, --force-device]
+    [-N, --force-nocopy] [-F, --force-full]
+    [-R, --force-realloc]
+    [-S, --start BLKSTART] [-B, --count BLKCOUNT]
+    [-L, --error-limit NUMBER]
+    [-A, --stats]
+    [-v, --verbose] [-q, --quiet]
+    status|smart|probe|up|down|diff|sync|scrub|fix|check
+    |list|dup|pool|devices|touch|rehash
+
+
+snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT]
+
+
+
+

+Descrizione +

+

SnapRAID è un programma di backup progettato per array di dischi, che +memorizza informazioni di parità per il recupero dati in caso di guasto +fino a sei dischi. +

Destinato principalmente a centri multimediali domestici con file grandi +e che cambiano raramente, SnapRAID offre diverse funzionalità: +

    +
  • +È possibile utilizzare dischi già pieni di file senza la necessità +di riformattarli, accedendovi come al solito. +
  • +
  • +Tutti i dati sono sottoposti ad hashing per garantire l'integrità dei +dati e prevenire la corruzione silente. +
  • +
  • +Quando il numero di dischi guasti supera il conteggio di parità, +la perdita di dati è confinata ai dischi interessati; i dati sugli +altri dischi rimangono accessibili. +
  • +
  • +Se si eliminano accidentalmente dei file su un disco, il recupero +è possibile. +
  • +
  • +I dischi possono avere dimensioni diverse. +
  • +
  • +È possibile aggiungere dischi in qualsiasi momento. +
  • +
  • +SnapRAID non blocca i dati; è possibile smettere di usarlo in qualsiasi +momento senza riformattare o spostare i dati. +
  • +
  • +Per accedere a un file, è necessario far girare solo un singolo disco, +risparmiando energia e riducendo il rumore. +
  • +
+

Per maggiori informazioni, si prega di visitare il sito ufficiale SnapRAID: +

+https://www.snapraid.it/
+
+
+
+

+Limitazioni +

+

SnapRAID è un ibrido tra un programma RAID e un programma di backup, +che mira a combinare i migliori vantaggi di entrambi. Tuttavia, ha +alcune limitazioni che si dovrebbero considerare prima di usarlo. +

La limitazione principale è che se un disco si guasta e non si è +effettuato un sync di recente, potrebbe non essere possibile recuperare +completamente. +Più specificamente, potrebbe non essere possibile recuperare fino alla +dimensione dei file modificati o eliminati dall'ultima operazione di sync. +Ciò accade anche se i file modificati o eliminati non si trovano sul +disco guasto. Questo è il motivo per cui SnapRAID è più adatto per dati +che cambiano raramente. +

D'altra parte, i file appena aggiunti non impediscono il recupero dei +file già esistenti. Si perderanno solo i file aggiunti di recente se si +trovano sul disco guasto. +

Altre limitazioni di SnapRAID sono: +

    +
  • +Con SnapRAID, si hanno ancora file system separati per ogni disco. +Con RAID, si ottiene un unico grande file system. +
  • +
  • +SnapRAID non esegue lo striping dei dati. +Con RAID, si ottiene un aumento di velocità con lo striping. +
  • +
  • +SnapRAID non supporta il recupero in tempo reale. +Con RAID, non si deve smettere di lavorare quando un disco si guasta. +
  • +
  • +SnapRAID può recuperare i dati solo da un numero limitato di guasti +del disco. +Con un backup, è possibile recuperare da un guasto completo +dell'intero array di dischi. +
  • +
  • +Vengono salvati solo nomi di file, timestamp, symlink e hardlink. +Permessi, proprietà e attributi estesi non vengono salvati. +
  • +
+
+
+

+Iniziare +

+

Per usare SnapRAID, è necessario prima selezionare un disco nell'array +di dischi da dedicare alle informazioni di `parity` (parità). Con un +disco per la parità, si sarà in grado di recuperare da un singolo guasto +del disco, in modo simile a RAID5. +

Se si desidera recuperare da più guasti del disco, in modo simile a RAID6, +è necessario riservare dischi aggiuntivi per la parità. Ogni disco di +parità aggiuntivo consente il recupero da un guasto in più del disco. +

Come dischi di parità, è necessario scegliere i dischi più grandi +dell'array, poiché le informazioni di parità possono crescere fino alle +dimensioni del più grande disco dati nell'array. +

Questi dischi saranno dedicati alla memorizzazione dei file di `parity`. +Non si dovrebbero memorizzare i propri dati su di essi. +

Quindi, è necessario definire i dischi `data` (dati) che si desidera +proteggere con SnapRAID. La protezione è più efficace se questi dischi +contengono dati che cambiano raramente. Per questo motivo, è meglio +NON includere il disco C:\ di Windows o le directory Unix /home, /var, +e /tmp. +

L'elenco dei file viene salvato nei file `content` (contenuto), di solito +memorizzati sui dischi dati, di parità o di avvio. +Questo file contiene i dettagli del backup, inclusi tutti i checksum +per verificarne l'integrità. +Il file `content` viene memorizzato in più copie e ogni copia deve +essere su un disco diverso per garantire che, anche in caso di guasti +multipli del disco, sia disponibile almeno una copia. +

Ad esempio, supponiamo di essere interessati a un solo livello di +protezione con parità e che i dischi si trovino in: +

+/mnt/diskp <- disco selezionato per la parità
+/mnt/disk1 <- primo disco da proteggere
+/mnt/disk2 <- secondo disco da proteggere
+/mnt/disk3 <- terzo disco da proteggere
+
+

È necessario creare il file di configurazione /etc/snapraid.conf con +le seguenti opzioni: +

+parity /mnt/diskp/snapraid.parity
+content /var/snapraid/snapraid.content
+content /mnt/disk1/snapraid.content
+content /mnt/disk2/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+
+

Se si è su Windows, si dovrebbe usare il formato del percorso di Windows, +con lettere di unità e backslash invece di slash. +

+parity E:\snapraid.parity
+content C:\snapraid\snapraid.content
+content F:\array\snapraid.content
+content G:\array\snapraid.content
+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+
+

Se si hanno molti dischi e si esauriscono le lettere di unità, è +possibile montare i dischi direttamente nelle sottocartelle. Vedi: +

+https://www.google.com/search?q=Windows+mount+point
+
+

A questo punto, si è pronti per eseguire il comando `sync` per costruire +le informazioni di parità. +

+snapraid sync
+
+

Questo processo può richiedere diverse ore la prima volta, a seconda +delle dimensioni dei dati già presenti sui dischi. Se i dischi sono +vuoti, il processo è immediato. +

È possibile interromperlo in qualsiasi momento premendo Ctrl+C e, alla +prossima esecuzione, riprenderà da dove è stato interrotto. +

Quando questo comando è completato, i dati sono SICURI. +

Ora è possibile iniziare a usare l'array come si desidera e aggiornare +periodicamente le informazioni di parità eseguendo il comando `sync`. +

+

+Scrubbing +

+

Per controllare periodicamente i dati e la parità per gli errori, è +possibile eseguire il comando `scrub`. +

+snapraid scrub
+
+

Questo comando confronta i dati nell'array con l'hash calcolato +durante il comando `sync` per verificarne l'integrità. +

Ogni esecuzione del comando controlla circa l'8% dell'array, escludendo +i dati già sottoposti a scrub nei 10 giorni precedenti. +È possibile utilizzare l'opzione -p, --plan per specificare un importo +diverso e l'opzione -o, --older-than per specificare un'età diversa +in giorni. +Ad esempio, per controllare il 5% dell'array per blocchi più vecchi di +20 giorni, usare: +

+snapraid -p 5 -o 20 scrub
+
+

Se vengono trovati errori silenti o di input/output durante il processo, +i blocchi corrispondenti vengono contrassegnati come bad (cattivi) nel +file `content` ed elencati nel comando `status`. +

+snapraid status
+
+

Per correggerli, è possibile utilizzare il comando `fix`, filtrando +i blocchi bad con l'opzione -e, --filter-error: +

+snapraid -e fix
+
+

Al prossimo `scrub`, gli errori scompariranno dal report `status` +se sono stati veramente corretti. Per renderlo più veloce, è possibile +utilizzare -p bad per eseguire lo scrub solo dei blocchi contrassegnati +come bad. +

+snapraid -p bad scrub
+
+

L'esecuzione di `scrub` su un array non sincronizzato può riportare +errori causati da file rimossi o modificati. Questi errori sono riportati +nell'output di `scrub`, ma i blocchi correlati non sono contrassegnati +come bad. +

+
+

+Pooling +

+

Nota: La funzionalità di pooling descritta di seguito è stata +sostituita dallo strumento mergefs, che è ora l'opzione consigliata +per gli utenti Linux nella comunità SnapRAID. Mergefs fornisce un modo +più flessibile ed efficiente per raggruppare più unità in un singolo +punto di montaggio unificato, consentendo un accesso trasparente ai +file attraverso l'array senza fare affidamento sui collegamenti +simbolici. Si integra bene con SnapRAID per la protezione della parità +ed è comunemente usato in configurazioni come OpenMediaVault (OMV) o +NAS personalizzati. +

Per avere tutti i file nell'array mostrati nello stesso albero di +directory, è possibile abilitare la funzionalità di `pooling`. Crea +una vista virtuale di sola lettura di tutti i file nell'array +utilizzando collegamenti simbolici. +

È possibile configurare la directory di `pooling` nel file di +configurazione con: +

+pool /pool
+
+

o, se si è su Windows, con: +

+pool C:\pool
+
+

e quindi eseguire il comando `pool` per creare o aggiornare la +vista virtuale. +

+snapraid pool
+
+

Se si sta utilizzando una piattaforma Unix e si desidera condividere +questa directory sulla rete con macchine Windows o Unix, è necessario +aggiungere le seguenti opzioni al file /etc/samba/smb.conf: +

+# Nella sezione globale di smb.conf
+unix extensions = no
+
+
+# Nella sezione di condivisione di smb.conf
+[pool]
+comment = Pool
+path = /pool
+read only = yes
+guest ok = yes
+wide links = yes
+follow symlinks = yes
+
+

In Windows, la condivisione di collegamenti simbolici su una rete +richiede che i client li risolvano da remoto. Per abilitare questo, oltre +a condividere la directory pool, è necessario condividere anche tutti i +dischi in modo indipendente, utilizzando i nomi dei dischi definiti nel +file di configurazione come punti di condivisione. È inoltre necessario +specificare nell'opzione `share` del file di configurazione il percorso +UNC di Windows che i client remoti devono utilizzare per accedere a +questi dischi condivisi. +

Ad esempio, operando da un server chiamato `darkstar`, è possibile +utilizzare le opzioni: +

+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+pool C:\pool
+share \\darkstar
+
+

e condividere le seguenti directory sulla rete: +

+\\darkstar\pool -> C:\pool
+\\darkstar\d1 -> F:\array
+\\darkstar\d2 -> G:\array
+\\darkstar\d3 -> H:\array
+
+

per consentire ai client remoti di accedere a tutti i file in +\\darkstar\pool. +

Potrebbe anche essere necessario configurare i client remoti per +abilitare l'accesso ai symlink remoti con il comando: +

+fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
+
+
+
+

+Annullamento Eliminazione +

+

SnapRAID funziona più come un programma di backup che come un sistema RAID +e può essere utilizzato per ripristinare o annullare l'eliminazione dei +file al loro stato precedente utilizzando l'opzione -f, --filter: +

+snapraid fix -f FILE
+
+

o per una directory: +

+snapraid fix -f DIR/
+
+

È anche possibile usarlo per recuperare solo i file eliminati +accidentalmente all'interno di una directory utilizzando l'opzione -m, +--filter-missing, che ripristina solo i file mancanti, lasciando tutti +gli altri intatti. +

+snapraid fix -m -f DIR/
+
+

O per recuperare tutti i file eliminati su tutte le unità con: +

+snapraid fix -m
+
+
+
+

+Recupero +

+

È successo il peggio e si è perso uno o più dischi! +

NON FARSI PRENDERE DAL PANICO! Sarà possibile recuperarli! +

La prima cosa da fare è evitare ulteriori modifiche all'array di dischi. +Disabilitare qualsiasi connessione remota ad esso e qualsiasi processo +pianificato, incluso qualsiasi sync o scrub notturno pianificato di SnapRAID. +

Quindi procedere con i seguenti passaggi. +

+

+PASSO 1 -> Riconfigurazione +

+

È necessario un po' di spazio per recuperare, idealmente su dischi di +riserva aggiuntivi, ma un disco USB esterno o un disco remoto saranno +sufficienti. +

Modificare il file di configurazione SnapRAID per far puntare l'opzione +`data` o `parity` del disco guasto a una posizione con spazio vuoto +sufficiente per recuperare i file. +

Ad esempio, se il disco `d1` è guasto, cambiare da: +

+data d1 /mnt/disk1/
+
+

a: +

+data d1 /mnt/new_spare_disk/
+
+

Se il disco da recuperare è un disco di parità, aggiornare l'opzione +`parity` appropriata. +Se si hanno più dischi guasti, aggiornare tutte le loro opzioni di +configurazione. +

+
+

+PASSO 2 -> Correzione (Fix) +

+

Eseguire il comando fix, memorizzando il log in un file esterno con: +

+snapraid -d NAME -l fix.log fix
+
+

Dove NAME è il nome del disco, come `d1` nel nostro esempio precedente. +Se il disco da recuperare è un disco di parità, usare i nomi `parity`, +`2-parity`, ecc. +Se si hanno più dischi guasti, usare più opzioni -d per specificarli tutti. +

Questo comando richiederà molto tempo. +

Assicurarsi di avere alcuni gigabyte liberi per memorizzare il file +fix.log. Eseguirlo da un disco con spazio libero sufficiente. +

Ora si è recuperato tutto ciò che è recuperabile. Se alcuni file sono +parzialmente o totalmente irrecuperabili, verranno rinominati aggiungendo +l'estensione `.unrecoverable`. +

È possibile trovare un elenco dettagliato di tutti i blocchi +irrecuperabili nel file fix.log controllando tutte le righe che iniziano +con `unrecoverable:`. +

Se non si è soddisfatti del recupero, è possibile riprovare tutte le +volte che si desidera. +

Ad esempio, se si sono rimossi file dall'array dopo l'ultimo `sync`, +questo può comportare che alcuni file non vengano recuperati. +In questo caso, è possibile riprovare il `fix` usando l'opzione -i, +--import, specificando dove si trovano ora questi file per includerli +di nuovo nel processo di recupero. +

Se si è soddisfatti del recupero, è possibile procedere oltre, +ma notare che dopo la sincronizzazione, non è più possibile riprovare +il comando `fix`! +

+
+

+PASSO 3 -> Controllo (Check) +

+

Come controllo cauto, è ora possibile eseguire un comando `check` per +assicurarsi che tutto sia corretto sul disco recuperato. +

+snapraid -d NAME -a check
+
+

Dove NAME è il nome del disco, come `d1` nel nostro esempio precedente. +

Le opzioni -d e -a dicono a SnapRAID di controllare solo il disco +specificato e di ignorare tutti i dati di parità. +

Questo comando richiederà molto tempo, ma se non si è eccessivamente +cauti, è possibile saltarlo. +

+
+

+PASSO 4 -> Sincronizzazione (Sync) +

+

Eseguire il comando `sync` per risincronizzare l'array con il nuovo disco. +

+snapraid sync
+
+

Se tutto è recuperato, questo comando è immediato. +

+
+
+
+

+Comandi +

+

SnapRAID fornisce alcuni semplici comandi che consentono di: +

    +
  • +Stampare lo stato dell'array -> `status` +
  • +
  • +Controllare i dischi -> `smart`, `probe`, `up`, `down` +
  • +
  • +Effettuare un backup/snapshot -> `sync` +
  • +
  • +Controllare periodicamente i dati -> `scrub` +
  • +
  • +Ripristinare l'ultimo backup/snapshot -> `fix`. +
  • +
+

I comandi devono essere scritti in minuscolo. +

+

+status +

+

Stampa un riepilogo dello stato dell'array di dischi. +

Include informazioni sulla frammentazione della parità, quanto sono +vecchi i blocchi senza essere controllati e tutti gli errori silenti +registrati incontrati durante lo scrubbing. +

Le informazioni presentate si riferiscono all'ultima volta che si è +eseguito `sync`. Le modifiche successive non vengono prese in +considerazione. +

Se sono stati rilevati blocchi bad, vengono elencati i loro numeri +di blocco. Per correggerli, è possibile utilizzare il comando `fix -e`. +

Mostra anche un grafico che rappresenta l'ultima volta che ogni blocco +è stato sottoposto a scrub o sincronizzato. I blocchi sottoposti a scrub +sono mostrati con '*', i blocchi sincronizzati ma non ancora sottoposti +a scrub con 'o'. +

Nulla viene modificato. +

+
+

+smart +

+

Stampa un report SMART di tutti i dischi nel sistema. +

Include una stima della probabilità di guasto nel prossimo anno, +consentendo di pianificare sostituzioni di manutenzione di dischi +che mostrano attributi sospetti. +

Questa stima della probabilità è ottenuta correlando gli attributi +SMART dei dischi con i dati Backblaze disponibili all'indirizzo: +

+https://www.backblaze.com/hard-drive-test-data.html
+
+

Se SMART segnala che un disco sta per guastarsi, viene stampato `FAIL` +o `PREFAIL` per quel disco e SnapRAID restituisce un errore. +In questo caso, si raccomanda vivamente la sostituzione immediata del +disco. +

Altre possibili stringhe di stato sono: +

+
+
+logfail +
+In passato, alcuni attributi erano inferiori alla +soglia. +
+
+
+
+logerr +
+Il log degli errori del dispositivo contiene errori. +
+
+
+
+selferr +
+Il log dell'autotest del dispositivo contiene errori. +
+
+
+

Se viene specificata l'opzione -v, --verbose, viene fornita un'analisi +statistica più approfondita. Questa analisi può aiutare a decidere se +è necessaria più o meno parità. +

Questo comando utilizza lo strumento `smartctl` ed è equivalente +all'esecuzione di `smartctl -a` su tutti i dispositivi. +

Se i dispositivi non vengono rilevati automaticamente correttamente, è +possibile specificare un comando personalizzato utilizzando l'opzione +`smartctl` nel file di configurazione. +

Nulla viene modificato. +

+
+

+probe +

+

Stampa lo stato POWER di tutti i dischi nel sistema. +

`Standby` significa che il disco non sta girando. `Active` significa +che il disco sta girando. +

Questo comando utilizza lo strumento `smartctl` ed è equivalente +all'esecuzione di `smartctl -n standby -i` su tutti i dispositivi. +

Se i dispositivi non vengono rilevati automaticamente correttamente, è +possibile specificare un comando personalizzato utilizzando l'opzione +`smartctl` nel file di configurazione. +

Nulla viene modificato. +

+
+

+up +

+

Fa girare tutti i dischi dell'array. +

È possibile far girare solo dischi specifici utilizzando l'opzione -d, +--filter-disk. +

Far girare tutti i dischi contemporaneamente richiede molta energia. +Assicurarsi che l'alimentatore possa sostenerlo. +

Nulla viene modificato. +

+
+

+down +

+

Ferma tutti i dischi dell'array. +

Questo comando utilizza lo strumento `smartctl` ed è equivalente +all'esecuzione di `smartctl -s standby,now` su tutti i dispositivi. +

È possibile fermare solo dischi specifici utilizzando l'opzione -d, +--filter-disk. +

Per fermare automaticamente in caso di errore, è possibile utilizzare +l'opzione -s, --spin-down-on-error con qualsiasi altro comando, +che è equivalente all'esecuzione manuale di `down` quando si verifica +un errore. +

Nulla viene modificato. +

+
+

+diff +

+

Elenca tutti i file modificati dall'ultimo `sync` che devono avere i +loro dati di parità ricalcolati. +

Questo comando non controlla i dati del file, ma solo il timestamp +del file, le dimensioni e l'inode. +

Dopo aver elencato tutti i file modificati, viene presentato un +riepilogo delle modifiche, raggruppate per: +

+
+
+equal +
+File invariati rispetto a prima. +
+
+
+
+added +
+File aggiunti che non erano presenti prima. +
+
+
+
+removed +
+File rimossi. +
+
+
+
+updated +
+File con dimensioni o timestamp diversi, il che +significa che sono stati modificati. +
+
+
+
+moved +
+File spostati in una directory diversa sullo stesso +disco. Sono identificati dall'avere lo stesso nome, +dimensioni, timestamp e inode, ma una directory diversa. +
+
+
+
+copied +
+File copiati sullo stesso o su un disco diverso. +Si noti che se sono stati veramente spostati su un altro +disco, saranno contati anche in `removed`. +Sono identificati dall'avere lo stesso nome, dimensioni +e timestamp. Se il timestamp sotto il secondo è zero, +il percorso completo deve corrispondere, non solo il nome. +
+
+
+
+restored +
+File con un inode diverso ma nome, dimensioni e +timestamp corrispondenti. Questi sono di solito file +ripristinati dopo essere stati eliminati. +
+
+
+

Se è richiesto un `sync`, il codice di ritorno del processo è 2, +invece del predefinito 0. Il codice di ritorno 1 è utilizzato per una +condizione di errore generica. +

Nulla viene modificato. +

+
+

+sync +

+

Aggiorna le informazioni di parità. Tutti i file modificati +nell'array di dischi vengono letti e i dati di parità +corrispondenti vengono aggiornati. +

È possibile interrompere questo processo in qualsiasi momento +premendo Ctrl+C, senza perdere il lavoro già svolto. +Alla prossima esecuzione, il processo `sync` riprenderà da dove +è stato interrotto. +

Se vengono trovati errori silenti o di input/output durante il processo, +i blocchi corrispondenti vengono contrassegnati come bad. +

I file sono identificati dal percorso e/o dall'inode e controllati +per dimensione e timestamp. +Se la dimensione o il timestamp del file differiscono, i dati di parità +vengono ricalcolati per l'intero file. +Se il file viene spostato o rinominato sullo stesso disco, +mantenendo lo stesso inode, la parità non viene ricalcolata. +Se il file viene spostato su un altro disco, la parità viene ricalcolata, +ma le informazioni di hash precedentemente calcolate vengono mantenute. +

I file `content` e `parity` vengono modificati se necessario. +I file nell'array NON vengono modificati. +

+
+

+scrub +

+

Esegue lo scrub dell'array, controllando la presenza di errori silenti +o di input/output nei dischi dati e di parità. +

Ogni invocazione controlla circa l'8% dell'array, escludendo +i dati già sottoposti a scrub negli ultimi 10 giorni. +Ciò significa che eseguire lo scrubbing una volta alla settimana +garantisce che ogni bit di dati venga controllato almeno una volta +ogni tre mesi. +

È possibile definire un piano o una quantità di scrub diversa +utilizzando l'opzione -p, --plan, che accetta: +bad - Esegue lo scrub dei blocchi contrassegnati come bad. +new - Esegue lo scrub dei blocchi appena sincronizzati non ancora +

sottoposti a scrub. +

+
+
+full +
+Esegue lo scrub di tutto. +
+
+
+
+0-100 +
+Esegue lo scrub della percentuale specificata di blocchi. +
+
+
+

Se si specifica una quantità percentuale, è anche possibile utilizzare +l'opzione -o, --older-than per definire quanto deve essere vecchio +il blocco. +I blocchi più vecchi vengono sottoposti a scrub per primi, +garantendo un controllo ottimale. +Se si desidera eseguire lo scrub solo dei blocchi appena sincronizzati +non ancora sottoposti a scrub, utilizzare l'opzione `-p new`. +

Per ottenere i dettagli dello stato dello scrub, utilizzare il comando +`status`. +

Per qualsiasi errore silente o di input/output trovato, i blocchi +corrispondenti vengono contrassegnati come bad nel file `content`. +Questi blocchi bad sono elencati in `status` e possono essere corretti +con `fix -e`. +Dopo la correzione, al prossimo scrub, verranno ricontrollati e, se +trovati corretti, il contrassegno bad verrà rimosso. +Per eseguire lo scrub solo dei blocchi bad, è possibile utilizzare +il comando `scrub -p bad`. +

Si consiglia di eseguire `scrub` solo su un array sincronizzato per +evitare errori segnalati causati da dati non sincronizzati. Questi +errori sono riconosciuti come non essendo errori silenti e i blocchi non +vengono contrassegnati come bad, ma tali errori sono riportati +nell'output del comando. +

Il file `content` viene modificato per aggiornare l'ora dell'ultimo +controllo per ogni blocco e per contrassegnare i blocchi bad. +I file `parity` NON vengono modificati. +I file nell'array NON vengono modificati. +

+
+

+fix +

+

Corregge tutti i file e i dati di parità. +

Tutti i file e i dati di parità vengono confrontati con lo stato +snapshot salvato nell'ultimo `sync`. +Se viene trovata una differenza, viene ripristinata allo snapshot +memorizzato. +

ATTENZIONE! Il comando `fix` non differenzia tra errori e modifiche +intenzionali. Ripristina incondizionatamente lo stato del file +all'ultimo `sync`. +

Se non viene specificata nessun'altra opzione, l'intero array viene +elaborato. Utilizzare le opzioni di filtro per selezionare un +sottoinsieme di file o dischi su cui operare. +

Per correggere solo i blocchi contrassegnati come bad durante `sync` +e `scrub`, utilizzare l'opzione -e, --filter-error. +A differenza di altre opzioni di filtro, questa applica correzioni solo +ai file che sono invariati dall'ultimo `sync`. +

SnapRAID rinomina tutti i file che non possono essere corretti aggiungendo +l'estensione `.unrecoverable`. +

Prima di correggere, l'intero array viene scansionato per trovare +eventuali file spostati dall'ultima operazione di `sync`. +Questi file sono identificati dal loro timestamp, ignorando il loro nome +e la directory, e vengono utilizzati nel processo di recupero se +necessario. +Se alcuni di essi sono stati spostati al di fuori dell'array, è possibile +utilizzare l'opzione -i, --import per specificare directory aggiuntive +da scansionare. +

I file sono identificati solo dal percorso, non dall'inode. +

Il file `content` NON viene modificato. +I file `parity` vengono modificati se necessario. +I file nell'array vengono modificati se necessario. +

+
+

+check +

+

Verifica tutti i file e i dati di parità. +

Funziona come `fix`, ma simula solo un recupero e nessuna modifica +viene scritta nell'array. +

Questo comando è destinato principalmente alla verifica manuale, +ad esempio dopo un processo di recupero o in altre condizioni speciali. +Per i controlli periodici e pianificati, utilizzare `scrub`. +

Se si utilizza l'opzione -a, --audit-only, viene controllato solo +l'hash dei file e i dati di parità vengono ignorati per un'esecuzione +più veloce. +

I file sono identificati solo dal percorso, non dall'inode. +

Nulla viene modificato. +

+
+

+list +

+

Elenca tutti i file contenuti nell'array al momento dell'ultimo +`sync`. +

Con -v o --verbose, viene mostrato anche il tempo sotto il secondo. +

Nulla viene modificato. +

+
+

+dup +

+

Elenca tutti i file duplicati. Due file sono considerati uguali se i +loro hash corrispondono. I dati del file non vengono letti; vengono +utilizzati solo gli hash precalcolati. +

Nulla viene modificato. +

+
+

+pool +

+

Crea o aggiorna una vista virtuale di tutti +i file nell'array di dischi nella directory di `pooling`. +

I file non vengono copiati ma collegati utilizzando +collegamenti simbolici. +

Durante l'aggiornamento, tutti i collegamenti simbolici esistenti +e le sottodirectory vuote vengono eliminati e sostituiti con la nuova +vista dell'array. Qualsiasi altro file regolare viene lasciato al suo posto. +

Nulla viene modificato al di fuori della directory pool. +

+
+

+devices +

+

Stampa i dispositivi di basso livello utilizzati dall'array. +

Questo comando visualizza le associazioni dei dispositivi nell'array +ed è principalmente destinato come interfaccia script. +

Le prime due colonne sono l'ID e il percorso del dispositivo di basso +livello. Le due colonne successive sono l'ID e il percorso del dispositivo +di alto livello. L'ultima colonna è il nome del disco nell'array. +

Nella maggior parte dei casi, si ha un dispositivo di basso livello per +ogni disco nell'array, ma in alcune configurazioni più complesse, si +potrebbe avere più dispositivi di basso livello utilizzati da un singolo +disco nell'array. +

Nulla viene modificato. +

+
+

+touch +

+

Imposta un timestamp arbitrario sotto il secondo per tutti i file +che lo hanno impostato a zero. +

Questo migliora la capacità di SnapRAID di riconoscere i file +spostati e copiati, poiché rende il timestamp quasi unico, +riducendo possibili duplicati. +

Più specificamente, se il timestamp sotto il secondo non è zero, +un file spostato o copiato viene identificato come tale se corrisponde +al nome, alle dimensioni e al timestamp. Se il timestamp sotto il secondo +è zero, è considerato una copia solo se il percorso completo, +le dimensioni e il timestamp corrispondono tutti. +

Il timestamp di precisione al secondo non viene modificato, +quindi tutte le date e gli orari dei file saranno conservati. +

+
+

+rehash +

+

Pianifica un rehash dell'intero array. +

Questo comando cambia il tipo di hash utilizzato, in genere quando +si esegue l'aggiornamento da un sistema a 32 bit a uno a 64 bit, per +passare da MurmurHash3 al più veloce SpookyHash. +

Se si sta già utilizzando l'hash ottimale, questo comando non fa +nulla e informa che non è necessaria alcuna azione. +

Il rehash non viene eseguito immediatamente ma avviene +progressivamente durante `sync` e `scrub`. +

È possibile controllare lo stato del rehash utilizzando `status`. +

Durante il rehash, SnapRAID mantiene la piena funzionalità, +con l'unica eccezione che `dup` non è in grado di rilevare file +duplicati utilizzando un hash diverso. +

+
+
+

+Opzioni +

+

SnapRAID fornisce le seguenti opzioni: +

+
+
+-c, --conf CONFIG +
+Seleziona il file di configurazione da utilizzare. Se non +specificato, in Unix utilizza il file `/usr/local/etc/snapraid.conf` +se esiste, altrimenti `/etc/snapraid.conf`. +In Windows, utilizza il file `snapraid.conf` nella stessa +directory di `snapraid.exe`. +
+
+
+
+
+
+-f, --filter PATTERN +
+Filtra i file da elaborare in `check` e `fix`. +Vengono elaborati solo i file che corrispondono al modello +specificato. +Questa opzione può essere utilizzata più volte. +Vedere la sezione PATTERN per maggiori dettagli sulle +specifiche del modello. +In Unix, assicurarsi che i caratteri di globbing siano citati +se usati. +Questa opzione può essere utilizzata solo con `check` e `fix`. +Non può essere utilizzata con `sync` e `scrub`, poiché elaborano +sempre l'intero array. +
+
+
+
+
+
+-d, --filter-disk NAME +
+Filtra i dischi da elaborare in `check`, `fix`, `up` e `down`. +È necessario specificare un nome di disco come definito nel file +di configurazione. +È anche possibile specificare i dischi di parità con i nomi: +`parity`, `2-parity`, `3-parity`, ecc., per limitare le operazioni +a un disco di parità specifico. +Se si combinano più opzioni --filter, --filter-disk e +--filter-missing, vengono selezionati solo i file che corrispondono +a tutti i filtri. +Questa opzione può essere utilizzata più volte. +Questa opzione può essere utilizzata solo con `check`, `fix`, +`up` e `down`. +Non può essere utilizzata con `sync` e `scrub`, poiché elaborano +sempre l'intero array. +
+
+
+
+
+
+-m, --filter-missing +
+Filtra i file da elaborare in `check` e `fix`. +Vengono elaborati solo i file mancanti o eliminati dall'array. +Quando usato con `fix`, questo agisce come un comando di +`undelete` (annullamento eliminazione). +Se si combinano più opzioni --filter, --filter-disk e +--filter-missing, vengono selezionati solo i file che corrispondono +a tutti i filtri. +Questa opzione può essere utilizzata solo con `check` e `fix`. +Non può essere utilizzata con `sync` e `scrub`, poiché elaborano +sempre l'intero array. +
+
+
+
+
+
+-e, --filter-error +
+Elabora i file con errori in `check` e `fix`. +Elabora solo i file che hanno blocchi contrassegnati con errori +silenti o di input/output durante `sync` e `scrub`, come +elencato in `status`. +Questa opzione può essere utilizzata solo con `check` e `fix`. +
+
+
+
+
+
+-p, --plan PERC|bad|new|full +
+Seleziona il piano di scrub. Se PERC è un valore numerico da 0 a +100, viene interpretato come la percentuale di blocchi da +sottoporre a scrub. +Invece di una percentuale, è possibile specificare un piano: +`bad` esegue lo scrub dei blocchi bad, `new` esegue lo scrub +dei blocchi non ancora sottoposti a scrub, e `full` esegue lo +scrub di tutto. +Questa opzione può essere utilizzata solo con `scrub`. +
+
+
+
+
+
+-o, --older-than DAYS +
+Seleziona la parte più vecchia dell'array da elaborare in `scrub`. +DAYS è l'età minima in giorni per un blocco da sottoporre a +scrub; il valore predefinito è 10. +I blocchi contrassegnati come bad vengono sempre sottoposti a scrub +indipendentemente da questa opzione. +Questa opzione può essere utilizzata solo con `scrub`. +
+
+
+
+
+
+-a, --audit-only +
+In `check`, verifica l'hash dei file senza +controllare i dati di parità. +Se si è interessati solo al controllo dei dati del file, questa +opzione può velocizzare significativamente il processo di controllo. +Questa opzione può essere utilizzata solo con `check`. +
+
+
+
+
+
+-h, --pre-hash +
+In `sync`, esegue una fase preliminare di hashing di tutti i nuovi +dati per una verifica aggiuntiva prima del calcolo della parità. +Di solito, in `sync`, non viene eseguito alcun hashing preliminare +e i nuovi dati vengono sottoposti a hash subito prima del calcolo +della parità quando vengono letti per la prima volta. +Questo processo si verifica quando il sistema è sotto +carico pesante, con tutti i dischi che girano e una CPU occupata. +Questa è una condizione estrema per la macchina e, se presenta un +problema hardware latente, gli errori silenti potrebbero non +essere rilevati perché i dati non sono ancora stati sottoposti a hash. +Per evitare questo rischio, è possibile abilitare la modalità +`pre-hash` per far leggere tutti i dati due volte per garantirne +l'integrità. +Questa opzione verifica anche i file spostati all'interno dell'array +per garantire che l'operazione di spostamento sia andata a buon fine +e, se necessario, consente di eseguire un'operazione di fix +prima di procedere. +Questa opzione può essere utilizzata solo con `sync`. +
+
+
+
+
+
+-i, --import DIR +
+Importa dalla directory specificata tutti i file eliminati +dall'array dopo l'ultimo `sync`. +Se si hanno ancora tali file, possono essere utilizzati da `check` +e `fix` per migliorare il processo di recupero. +I file vengono letti, anche nelle sottodirectory, e sono +identificati indipendentemente dal loro nome. +Questa opzione può essere utilizzata solo con `check` e `fix`. +
+
+
+
+
+
+-s, --spin-down-on-error +
+In caso di errore, ferma (spin down) tutti i dischi gestiti prima +di uscire con un codice di stato non zero. Ciò impedisce alle unità +di rimanere attive e in rotazione dopo un'operazione interrotta, +contribuendo a evitare inutili accumuli di calore e consumo di +energia. Utilizzare questa opzione per garantire che i dischi siano +arrestati in modo sicuro anche in caso di errore di un comando. +
+
+
+
+
+
+-w, --bw-limit RATE +
+Applica un limite di larghezza di banda globale per tutti i dischi. +RATE è il numero di byte al secondo. È possibile specificare un +moltiplicatore come K, M o G (ad esempio, --bw-limit 1G). +
+
+
+
+
+
+-A, --stats +
+Abilita una vista dello stato estesa che mostra informazioni +aggiuntive. La schermata visualizza due grafici: +Il primo grafico mostra il numero di stripe bufferizzate per +ciascun disco, insieme al percorso del file attualmente +acceduto su quel disco. In genere, il disco più lento non avrà +buffer disponibile, il che determina la larghezza di banda massima +raggiungibile. +Il secondo grafico mostra la percentuale di tempo trascorso in +attesa negli ultimi 100 secondi. Si prevede che il disco più +lento causi la maggior parte del tempo di attesa, mentre gli altri +dischi dovrebbero avere poco o nessun tempo di attesa perché possono +utilizzare le loro stripe bufferizzate. +Questo grafico mostra anche il tempo trascorso in attesa per +i calcoli di hash e i calcoli RAID. +Tutti i calcoli vengono eseguiti in parallelo con le operazioni +su disco. Pertanto, finché c'è un tempo di attesa misurabile per +almeno un disco, ciò indica che la CPU è abbastanza veloce da +tenere il passo con il carico di lavoro. +
+
+
+
+
+
+-Z, --force-zero +
+Forza l'operazione non sicura di sincronizzazione di un file con +dimensione zero che in precedenza era non zero. +Se SnapRAID rileva una tale condizione, interrompe la +prosecuzione a meno che non si specifichi questa opzione. +Ciò consente di rilevare facilmente quando, dopo un arresto +anomalo del sistema, alcuni file a cui si è acceduto sono stati +troncati. +Questa è una possibile condizione in Linux con i file system +ext3/ext4. +Questa opzione può essere utilizzata solo con `sync`. +
+
+
+
+
+
+-E, --force-empty +
+Forza l'operazione non sicura di sincronizzazione di un disco con +tutti i file originali mancanti. +Se SnapRAID rileva che tutti i file originariamente presenti +sul disco sono mancanti o riscritti, interrompe la prosecuzione +a meno che non si specifichi questa opzione. +Ciò consente di rilevare facilmente quando un file system di dati +non è montato. +Questa opzione può essere utilizzata solo con `sync`. +
+
+
+
+
+
+-U, --force-uuid +
+Forza l'operazione non sicura di sincronizzazione, controllo e +correzione con dischi che hanno cambiato il loro UUID. +Se SnapRAID rileva che alcuni dischi hanno cambiato UUID, +interrompe la prosecuzione a meno che non si specifichi questa +opzione. +Ciò consente di rilevare quando i dischi sono montati sui punti +di montaggio sbagliati. +Tuttavia, è consentito avere un singolo cambio di UUID con +parità singola e di più con parità multipla, perché questo è +il caso normale quando si sostituiscono i dischi dopo un recupero. +Questa opzione può essere utilizzata solo con `sync`, `check` +o `fix`. +
+
+
+
+
+
+-D, --force-device +
+Forza l'operazione non sicura di correzione con dischi inaccessibili +o con dischi sullo stesso dispositivo fisico. +Ad esempio, se si sono persi due dischi dati e si ha un disco di +riserva per recuperare solo il primo, è possibile ignorare il secondo +disco inaccessibile. +Oppure, se si desidera recuperare un disco nello spazio libero +rimasto su un disco già utilizzato, condividendo lo stesso dispositivo +fisico. +Questa opzione può essere utilizzata solo con `fix`. +
+
+
+
+
+
+-N, --force-nocopy +
+In `sync`, `check` e `fix`, disabilita l'euristica di rilevamento +della copia. +Senza questa opzione, SnapRAID presume che i file con gli stessi +attributi, come nome, dimensione e timestamp, siano copie con gli +stessi dati. +Ciò consente l'identificazione di file copiati o spostati da un +disco all'altro e riutilizza le informazioni di hash già calcolate +per rilevare errori silenti o per recuperare file mancanti. +In alcuni rari casi, questo comportamento può comportare falsi +positivi o un processo lento a causa di molte verifiche di hash, +e questa opzione consente di risolvere tali problemi. +Questa opzione può essere utilizzata solo con `sync`, `check` +e `fix`. +
+
+
+
+
+
+-F, --force-full +
+In `sync`, forza un ricalcolo completo della parità. +Questa opzione può essere utilizzata quando si aggiunge un nuovo +livello di parità o se si è tornati a un vecchio file di contenuto +utilizzando dati di parità più recenti. +Invece di ricreare la parità da zero, questo consente di riutilizzare +gli hash presenti nel file di contenuto per convalidare i dati e +mantenere la protezione dei dati durante il processo `sync` +utilizzando i dati di parità esistenti. +Questa opzione può essere utilizzata solo con `sync`. +
+
+
+
+
+
+-R, --force-realloc +
+In `sync`, forza una riallocazione completa dei file e la +ricostruzione della parità. +Questa opzione può essere utilizzata per riallocare completamente +tutti i file, rimuovendo la frammentazione, riutilizzando gli hash +presenti nel file di contenuto per convalidare i dati. +Questa opzione può essere utilizzata solo con `sync`. +ATTENZIONE! Questa opzione è solo per esperti ed è vivamente +sconsigliato utilizzarla. +NON si ha protezione dei dati durante l'operazione `sync`. +
+
+
+
+
+
+-l, --log FILE +
+Scrive un log dettagliato nel file specificato. +Se questa opzione non è specificata, gli errori imprevisti vengono +stampati sullo schermo, potenzialmente resulting in un output +eccessivo in caso di molti errori. Quando -l, --log è specificato, +vengono stampati sullo schermo solo gli errori fatali che +causano l'arresto di SnapRAID. +Se il percorso inizia con '>>', il file viene aperto in modalità +append. Le occorrenze di '%D' e '%T' nel nome vengono sostituite +con la data e l'ora nel formato YYYYMMDD e HHMMSS. Nei file batch +di Windows, è necessario raddoppiare il carattere '%', ad esempio +result-%%D.log. Per utilizzare '>>', è necessario racchiudere +il nome tra virgolette, ad esempio `">>result.log"`. +Per indirizzare l'output del log all'output standard o all'errore +standard, è possibile utilizzare `">&1"` e `">&2"`, +rispettivamente. +Vedere il file snapraid_log.txt o la pagina man per le descrizioni +dei tag di log. +
+
+
+
+
+
+-L, --error-limit NUMBER +
+Imposta un nuovo limite di errore prima di interrompere l'esecuzione. +Per impostazione predefinita, SnapRAID si interrompe se incontra +più di 100 errori di input/output, indicando che un disco +sta probabilmente fallendo. +Questa opzione influisce su `sync` e `scrub`, a cui è consentito +continuare dopo il primo set di errori del disco per cercare di +completare le loro operazioni. +Tuttavia, `check` e `fix` si interrompono sempre al primo errore. +
+
+
+
+
+
+-S, --start BLKSTART +
+Avvia l'elaborazione dal numero di blocco specificato. +Ciò può essere utile per riprovare a controllare o correggere +blocchi specifici in caso di disco danneggiato. +Questa opzione è principalmente per il recupero manuale avanzato. +
+
+
+
+
+
+-B, --count BLKCOUNT +
+Elabora solo il numero specificato di blocchi. +Questa opzione è principalmente per il recupero manuale avanzato. +
+
+
+
+
+
+-C, --gen-conf CONTENT +
+Genera un file di configurazione fittizio da un file di contenuto +esistente. +Il file di configurazione viene scritto nell'output standard e non +sovrascrive uno esistente. +Questo file di configurazione contiene anche le informazioni +necessarie per ricostruire i punti di montaggio del disco nel caso +in cui si perda l'intero sistema. +
+
+
+
+
+
+-v, --verbose +
+Stampa più informazioni sullo schermo. +Se specificato una volta, stampa i file esclusi +e statistiche aggiuntive. +Questa opzione non ha effetto sui file di log. +
+
+
+
+
+
+-q, --quiet +
+Stampa meno informazioni sullo schermo. +Se specificato una volta, rimuove la barra di avanzamento; +due volte, le operazioni in corso; tre volte, i messaggi di +informazione; quattro volte, i messaggi di stato. +Gli errori fatali vengono sempre stampati sullo schermo. +Questa opzione non ha effetto sui file di log. +
+
+
+
+
+
+-H, --help +
+Stampa una breve schermata di aiuto. +
+
+
+
+
+
+-V, --version +
+Stampa la versione del programma. +
+
+
+
+
+

+Configurazione +

+

SnapRAID richiede un file di configurazione per sapere dove si trova +l'array di dischi e dove memorizzare le informazioni di parità. +

In Unix, utilizza il file `/usr/local/etc/snapraid.conf` se esiste, +altrimenti `/etc/snapraid.conf`. +In Windows, utilizza il file `snapraid.conf` nella stessa +directory di `snapraid.exe`. +

Deve contenere le seguenti opzioni (sensibili al maiuscolo/minuscolo): +

+

+parity FILE [,FILE] ... +

+

Definisce i file da utilizzare per memorizzare le informazioni di parità. +La parità consente la protezione da un singolo guasto del disco, +simile a RAID5. +

È possibile specificare più file, che devono essere su dischi diversi. +Quando un file non può più crescere, viene utilizzato il successivo. +Lo spazio totale disponibile deve essere almeno grande quanto il disco +dati più grande dell'array. +

È possibile aggiungere file di parità aggiuntivi in seguito, ma non è +possibile riordinarli o rimuoverli. +

Mantenere i dischi di parità riservati alla parità garantisce che non +diventino frammentati, migliorando le prestazioni. +

In Windows, 256 MB vengono lasciati inutilizzati su ogni disco per +evitare l'avviso sui dischi pieni. +

Questa opzione è obbligatoria e può essere utilizzata solo una volta. +

+
+

+(2,3,4,5,6)-parity FILE [,FILE] ... +

+

Definisce i file da utilizzare per memorizzare informazioni di parità +extra. +

Per ogni livello di parità specificato, è abilitato un livello +aggiuntivo di protezione: +

    +
  • +2-parity abilita la doppia parità RAID6. +
  • +
  • +3-parity abilita la tripla parità. +
  • +
  • +4-parity abilita la parità quadrupla. +
  • +
  • +5-parity abilita la parità quintupla. +
  • +
  • +6-parity abilita la parità esapla. +
  • +
+

Ogni livello di parità richiede la presenza di tutti i livelli di parità +precedenti. +

Si applicano le stesse considerazioni dell'opzione 'parity'. +

Queste opzioni sono facoltative e possono essere utilizzate solo una volta. +

+
+

+z-parity FILE [,FILE] ... +

+

Definisce un file e un formato alternativi per memorizzare la tripla +parità. +

Questa opzione è un'alternativa a '3-parity', destinata +principalmente a CPU di fascia bassa come ARM o AMD Phenom, Athlon +e Opteron che non supportano il set di istruzioni SSSE3. In tali +casi, fornisce prestazioni migliori. +

Questo formato è simile ma più veloce di quello utilizzato da ZFS RAIDZ3. +Come ZFS, non funziona oltre la tripla parità. +

Quando si utilizza '3-parity', si verrà avvisati se è consigliato +utilizzare il formato 'z-parity' per un miglioramento delle prestazioni. +

È possibile convertire da un formato all'altro regolando il file +di configurazione con il file z-parity o 3-parity desiderato e +utilizzando 'fix' per ricrearlo. +

+
+

+content FILE +

+

Definisce il file da utilizzare per memorizzare l'elenco e i checksum +di tutti i file presenti nell'array di dischi. +

Può essere posizionato su un disco utilizzato per dati, parità o +qualsiasi altro disco disponibile. +Se si utilizza un disco dati, questo file viene automaticamente +escluso dal processo `sync`. +

Questa opzione è obbligatoria e può essere utilizzata più volte +per salvare più copie dello stesso file. +

È necessario memorizzare almeno una copia per ogni disco di parità +utilizzato più uno. L'utilizzo di copie aggiuntive non è dannoso. +

+
+

+data NAME DIR +

+

Definisce il nome e il punto di montaggio dei dischi dati +nell'array. NAME viene utilizzato per identificare il disco e deve +essere unico. DIR è il punto di montaggio del disco nel file system. +

È possibile cambiare il punto di montaggio secondo necessità, +purché si mantenga fisso NAME. +

È necessario utilizzare un'opzione per ogni disco dati nell'array. +

È possibile rinominare un disco in seguito modificando NAME +direttamente nel file di configurazione e quindi eseguendo un +comando 'sync'. +In caso di ridenominazione, l'associazione viene eseguita utilizzando +l'UUID memorizzato dei dischi. +

+
+

+nohidden +

+

Esclude tutti i file e le directory nascosti. +In Unix, i file nascosti sono quelli che iniziano con `.`. +In Windows, sono quelli con l'attributo nascosto. +

+
+

+exclude/include PATTERN +

+

Definisce i modelli di file o directory da escludere o includere +nel processo di sync. +Tutti i modelli vengono elaborati nell'ordine specificato. +

Se il primo modello che corrisponde è un `exclude`, il file +viene escluso. Se è un `include`, il file viene incluso. +Se nessun modello corrisponde, il file viene escluso se l'ultimo +modello specificato è un `include`, o incluso se l'ultimo modello +specificato è un `exclude`. +

Vedere la sezione PATTERN per maggiori dettagli sulle specifiche +del modello. +

Questa opzione può essere utilizzata più volte. +

+
+

+blocksize SIZE_IN_KIBIBYTES +

+

Definisce la dimensione di blocco di base in kibibyte per la parità. +Un kibibyte è 1024 byte. +

La dimensione di blocco predefinita è 256, che dovrebbe funzionare +nella maggior parte dei casi. +

ATTENZIONE! Questa opzione è solo per esperti ed è vivamente +sconsigliato modificare questo valore. Per modificare questo valore in +futuro, sarà necessario ricreare l'intera parità! +

Un motivo per utilizzare una dimensione di blocco diversa è se si +hanno molti file piccoli, nell'ordine dei milioni. +

Per ogni file, anche se solo pochi byte, viene allocato un intero +blocco di parità e, con molti file, ciò può comportare uno spazio +di parità inutilizzato significativo. +Quando si riempie completamente il disco di parità, non è +consentito aggiungere altri file ai dischi dati. +Tuttavia, la parità sprecata non si accumula tra i dischi dati. +Lo spazio sprecato risultante da un numero elevato di file su un +disco dati limita solo la quantità di dati su quel disco dati, non +gli altri. +

Come approssimazione, si può presumere che metà della dimensione del +blocco sia sprecata per ogni file. Ad esempio, con 100.000 file e una +dimensione di blocco di 256 KiB, si sprecheranno 12,8 GB di parità, +il che può comportare 12,8 GB in meno di spazio disponibile sul disco +dati. +

È possibile controllare la quantità di spazio sprecato su ogni disco +utilizzando `status`. +Questa è la quantità di spazio che è necessario lasciare libero sui +dischi dati o utilizzare per i file non inclusi nell'array. +Se questo valore è negativo, significa che si è vicini a riempire +la parità e rappresenta lo spazio che è ancora possibile sprecare. +

Per evitare questo problema, è possibile utilizzare una partizione +più grande per la parità. +Ad esempio, se la partizione di parità è 12,8 GB più grande dei dischi +dati, si ha abbastanza spazio extra per gestire fino a 100.000 +file su ogni disco dati senza alcuno spreco di spazio. +

Un trucco per ottenere una partizione di parità più grande in Linux è +formattarla con il comando: +

+mkfs.ext4 -m 0 -T largefile4 DEVICE
+
+

Ciò si traduce in circa l'1,5% di spazio extra, circa 60 GB per +un disco da 4 TB, che consente circa 460.000 file su ogni disco dati +senza alcuno spreco di spazio. +

+
+

+hashsize SIZE_IN_BYTES +

+

Definisce la dimensione dell'hash in byte per i blocchi salvati. +

La dimensione di hash predefinita è 16 byte (128 bit), che dovrebbe +funzionare nella maggior parte dei casi. +

ATTENZIONE! Questa opzione è solo per esperti ed è vivamente +sconsigliato modificare questo valore. Per modificare questo valore in +futuro, sarà necessario ricreare l'intera parità! +

Un motivo per utilizzare una dimensione di hash diversa è se il +sistema ha memoria limitata. Come regola generale, SnapRAID +tipicamente richiede 1 GiB di RAM per ogni 16 TB di dati nell'array. +

Nello specifico, per memorizzare gli hash dei dati, SnapRAID richiede +circa $TS*(1+HS)/BS$ byte di RAM, +dove $TS$ è la dimensione totale in byte dell'array di dischi, $BS$ è la +dimensione del blocco in byte e $HS$ è la dimensione dell'hash in byte. +

Ad esempio, con 8 dischi da 4 TB, una dimensione di blocco di 256 KiB +($1 \text{ KiB} = 1024 \text{ byte}$) e una dimensione di hash di 16, si ottiene: +

+RAM = $(8 * 4 * 10^{12}) * (1+16) / (256 * 2^{10}) = 1.93 \text{ GiB}$
+
+

Passando a una dimensione di hash di 8, si ottiene: +

+RAM = $(8 * 4 * 10^{12}) * (1+8) / (256 * 2^{10}) = 1.02 \text{ GiB}$
+
+

Passando a una dimensione di blocco di 512, si ottiene: +

+RAM = $(8 * 4 * 10^{12}) * (1+16) / (512 * 2^{10}) = 0.96 \text{ GiB}$
+
+

Passando sia a una dimensione di hash di 8 che a una dimensione di +blocco di 512, si ottiene: +

+RAM = $(8 * 4 * 10^{12}) * (1+8) / (512 * 2^{10}) = 0.51 \text{ GiB}$
+
+
+
+

+autosave SIZE_IN_GIGABYTES +

+

Salva automaticamente lo stato durante la sincronizzazione o lo scrubbing +dopo la quantità specificata di GB elaborati. +Questa opzione è utile per evitare di riavviare lunghi comandi `sync` +da zero se interrotti da un arresto anomalo della macchina o qualsiasi +altro evento. +

+
+

+temp_limit TEMPERATURE_CELSIUS +

+

Imposta la temperatura massima del disco consentita in Celsius. Se +specificato, SnapRAID controlla periodicamente la temperatura di tutti +i dischi utilizzando lo strumento smartctl. Le temperature attuali dei +dischi vengono visualizzate mentre SnapRAID è in funzione. Se un disco +supera questo limite, tutte le operazioni si interrompono e i dischi +vengono messi in stand-by (spin down) per la durata definita +dall'opzione `temp_sleep`. Dopo il periodo di sonno, le operazioni +riprendono, potenzialmente mettendosi in pausa di nuovo se il limite +di temperatura viene raggiunto ancora una volta. +

Durante il funzionamento, SnapRAID analizza anche la curva di riscaldamento +di ciascun disco e stima la temperatura costante a lungo termine che +dovrebbero raggiungere se l'attività continua. La stima viene eseguita +solo dopo che la temperatura del disco è aumentata quattro volte, +garantendo che siano disponibili abbastanza punti dati per stabilire +una tendenza affidabile. +Questa temperatura costante prevista è mostrata tra parentesi accanto +al valore attuale e aiuta a valutare se il raffreddamento del sistema +è adeguato. Questa temperatura stimata è solo a scopo informativo +e non ha alcun effetto sul comportamento di SnapRAID. Le azioni del +programma si basano esclusivamente sulle temperature effettive +misurate del disco. +

Per eseguire questa analisi, SnapRAID necessita di un riferimento +per la temperatura del sistema. Tenta prima di leggerla dai sensori +hardware disponibili. Se non è possibile accedere a nessun sensore di +sistema, utilizza la temperatura del disco più bassa misurata all'inizio +dell'esecuzione come riferimento di riserva. +

Normalmente, SnapRAID mostra solo la temperatura del disco più caldo. +Per visualizzare la temperatura di tutti i dischi, utilizzare l'opzione +-A o --stats. +

+
+

+temp_sleep TIME_IN_MINUTES +

+

Imposta il tempo di stand-by, in minuti, quando il limite di temperatura +viene raggiunto. Durante questo periodo, i dischi rimangono fermi +(spin down). Il valore predefinito è 5 minuti. +

+
+

+pool DIR +

+

Definisce la directory di pooling in cui viene creata la vista virtuale +dell'array di dischi utilizzando il comando `pool`. +

La directory deve già esistere. +

+
+

+share UNC_DIR +

+

Definisce il percorso UNC di Windows necessario per accedere ai dischi +da remoto. +

Se questa opzione è specificata, i collegamenti simbolici creati nella +directory pool utilizzano questo percorso UNC per accedere ai dischi. +Senza questa opzione, i collegamenti simbolici generati utilizzano +solo percorsi locali, il che non consente la condivisione della +directory pool sulla rete. +

I collegamenti simbolici sono formati utilizzando il percorso UNC +specificato, aggiungendo il nome del disco come specificato nell'opzione +`data` e infine aggiungendo la directory e il nome del file. +

Questa opzione è richiesta solo per Windows. +

+
+

+smartctl DISK/PARITY OPTIONS... +

+

Definisce opzioni smartctl personalizzate per ottenere gli attributi +SMART per ogni disco. Ciò potrebbe essere richiesto per controller RAID +e alcuni dischi USB che non possono essere rilevati automaticamente. +Il segnaposto %s viene sostituito dal nome del dispositivo, ma è +facoltativo per dispositivi fissi come i controller RAID. +

DISK è lo stesso nome del disco specificato nell'opzione `data`. +PARITY è uno dei nomi di parità: `parity`, `2-parity`, `3-parity`, +`4-parity`, `5-parity`, `6-parity` o `z-parity`. +

Nelle OPTIONS specificate, la stringa `%s` viene sostituita dal +nome del dispositivo. Per i controller RAID, il dispositivo è +probabilmente fisso e potrebbe non essere necessario utilizzare `%s`. +

Fare riferimento alla documentazione di smartmontools per le possibili +opzioni: +

+https://www.smartmontools.org/wiki/Supported_RAID-Controllers
+https://www.smartmontools.org/wiki/Supported_USB-Devices
+
+

Ad esempio: +

+smartctl parity -d sat %s
+
+
+
+

+smartignore DISK/PARITY ATTR [ATTR...] +

+

Ignora l'attributo SMART specificato durante il calcolo della +probabilità di guasto del disco. Questa opzione è utile se un disco +segnala valori insoliti o fuorvianti per un particolare attributo. +

DISK è lo stesso nome del disco specificato nell'opzione `data`. +PARITY è uno dei nomi di parità: `parity`, `2-parity`, `3-parity`, +`4-parity`, `5-parity`, `6-parity` o `z-parity`. +Il valore speciale * può essere utilizzato per ignorare l'attributo +su tutti i dischi. +

Ad esempio, per ignorare l'attributo `Current Pending Sector Count` +su tutti i dischi: +

+smartignore * 197
+
+

Per ignorarlo solo sul primo disco di parità: +

+smartignore parity 197
+
+
+
+

+Esempi +

+

Un esempio di configurazione tipica per Unix è: +

+parity /mnt/diskp/snapraid.parity
+content /mnt/diskp/snapraid.content
+content /var/snapraid/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+exclude /lost+found/
+exclude /tmp/
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/sg0
+smartctl 2-parity -d areca,2/1 /dev/sg0
+
+

Un esempio di configurazione tipica per Windows è: +

+parity E:\snapraid.parity
+content E:\snapraid.content
+content C:\snapraid\snapraid.content
+data d1 G:\array\
+data d2 H:\array\
+data d3 I:\array\
+exclude Thumbs.db
+exclude \$RECYCLE.BIN
+exclude \System Volume Information
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/arcmsr0
+smartctl 2-parity -d areca,2/1 /dev/arcmsr0
+
+
+
+
+

+Pattern +

+

I pattern offrono un modo flessibile per filtrare i file da includere o +escludere. Usando i caratteri globbing, è possibile definire regole che +corrispondano a nomi di file specifici o a intere strutture di directory senza +elencare manualmente ogni percorso. +

Il punto interrogativo `?` corrisponde a qualsiasi carattere singolo eccetto il +separatore di directory. Questo lo rende utile per far corrispondere nomi di file +con caratteri variabili mantenendo il pattern confinato a un singolo livello di directory. +

L'asterisco singolo `*` corrisponde a qualsiasi sequenza di caratteri, ma come il +punto interrogativo, non attraversa mai i confini delle directory. Si ferma allo +slash in avanti, rendendolo adatto per la corrispondenza all'interno di un singolo +componente del percorso. Questo è il comportamento standard dei wildcard familiare +dal globbing della shell. +

Il doppio asterisco `**` è più potente, corrisponde a qualsiasi sequenza di +caratteri inclusi i separatori di directory. Ciò consente ai pattern di corrispondere +attraverso più livelli di directory. Quando `**` appare inserito direttamente in +un pattern, può corrispondere a zero o più caratteri inclusi gli slash tra +il testo letterale circostante. +

L'uso più importante di `**` è nella forma speciale `/**/`. Questa corrisponde a +zero o più livelli di directory completi, rendendo possibile la corrispondenza di file +a qualsiasi profondità in un albero di directory senza conoscere l'esatta struttura del percorso. +Per esempio, il pattern `src/**/main.js` corrisponde a `src/main.js` (saltando +zero directory), `src/ui/main.js` (saltando una directory), e +`src/ui/components/main.js` (saltando due directory). +

Le classi di caratteri che usano le parentesi quadre `[]` corrispondono a un singolo carattere da un +set o intervallo specificato. Come gli altri pattern a carattere singolo, esse +non corrispondono ai separatori di directory. Le classi supportano intervalli e la negazione usando +un punto esclamativo. +

La distinzione fondamentale da ricordare è che `*`, `?` e le classi di caratteri +rispettano tutti i confini delle directory e corrispondono solo all'interno di un singolo +componente del percorso, mentre `**` è l'unico pattern che può corrispondere attraverso +i separatori di directory. +

Esistono quattro diversi tipi di pattern: +

+
+
+FILE +
+Seleziona qualsiasi file chiamato FILE. +Questo pattern si applica solo ai file, non alle directory. +
+
+
+
+
+
+DIR/ +
+Seleziona qualsiasi directory chiamata DIR e tutto ciò che contiene. +Questo pattern si applica solo alle directory, non ai file. +
+
+
+
+
+
+/PATH/FILE +
+Seleziona l'esatto percorso del file specificato. Questo pattern si applica +solo ai file, non alle directory. +
+
+
+
+
+
+/PATH/DIR/ +
+Seleziona l'esatto percorso della directory specificata e tutto ciò che +contiene. Questo pattern si applica solo alle directory, non ai file. +
+
+
+

Quando si specifica un percorso assoluto che inizia con /, viene +applicato alla directory radice dell'array, non alla directory radice +del file system locale. +

In Windows, è possibile utilizzare il backslash \ invece dello slash +in avanti /. Le directory di sistema di Windows, le junction, i punti +di montaggio e altre directory speciali di Windows sono trattati come +file, il che significa che per escluderli, è necessario utilizzare una +regola di file, non una di directory. +

Se il nome del file contiene un carattere '*', '?', '[' o ']', +è necessario eseguirne l'escape per evitare che venga interpretato +come un carattere di globbing. In Unix, il carattere di escape è '\'; +in Windows, è '^'. +Quando il pattern è sulla riga di comando, è necessario raddoppiare +il carattere di escape per evitare che venga interpretato dalla shell +dei comandi. +

Nel file di configurazione, è possibile utilizzare diverse strategie +per filtrare i file da elaborare. +L'approccio più semplice è utilizzare solo regole `exclude` per +rimuovere tutti i file e le directory che non si desidera elaborare. +Ad esempio: +

+# Esclude qualsiasi file denominato `*.unrecoverable`
+exclude *.unrecoverable
+# Esclude la directory radice `/lost+found`
+exclude /lost+found/
+# Esclude qualsiasi sottodirectory denominata `tmp`
+exclude tmp/
+
+

L'approccio opposto è definire solo i file che si desidera elaborare, +utilizzando solo regole `include`. Ad esempio: +

+# Include solo alcune directory
+include /movies/
+include /musics/
+include /pictures/
+
+

L'approccio finale è mescolare regole `exclude` e `include`. In questo +caso, l'ordine delle regole è importante. Le regole precedenti hanno +la precedenza su quelle successive. +Per semplificare, è possibile elencare prima tutte le regole `exclude` +e poi tutte le regole `include`. Ad esempio: +

+# Esclude qualsiasi file denominato `*.unrecoverable`
+exclude *.unrecoverable
+# Esclude qualsiasi sottodirectory denominata `tmp`
+exclude tmp/
+# Include solo alcune directory
+include /movies/
+include /musics/
+include /pictures/
+
+

Sulla riga di comando, utilizzando l'opzione -f, è possibile utilizzare +solo pattern `include`. Ad esempio: +

+# Controlla solo i file .mp3.
+# In Unix, utilizzare le virgolette per evitare l'espansione
+# del globbing da parte della shell.
+snapraid -f "*.mp3" check
+
+

In Unix, quando si utilizzano caratteri di globbing sulla riga di +comando, è necessario citarli per impedire alla shell di espanderli. +

+
+

+Ignore File +

+

In aggiunta alle regole globali nel file di configurazione, è possibile +inserire file `.snapraidignore` in qualsiasi directory all'interno dell'array +per definire regole di esclusione decentralizzate. +

Le regole definite in `.snapraidignore` vengono applicate dopo le regole nel +file di configurazione. Ciò significa che hanno una priorità più alta e possono +essere utilizzate per escludere file che erano stati precedentemente inclusi dalla +configurazione globale. In pratica, se una regola locale corrisponde, il file viene +escluso indipendentemente dalle impostazioni di inclusione globali. +

La logica dei pattern in `.snapraidignore` rispecchia la configurazione globale +ma ancora i pattern alla directory in cui si trova il file: +

+
+
+FILE +
+Seleziona qualsiasi file chiamato FILE in questa directory o sotto di essa. +Segue le stesse regole di globbing del pattern globale. +
+
+
+
+
+
+DIR/ +
+Seleziona qualsiasi directory chiamata DIR e tutto ciò che contiene, +che risieda in questa directory o sotto di essa. +
+
+
+
+
+
+/PATH/FILE +
+Seleziona l'esatto file specificato relativo alla posizione +del file `.snapraidignore`. +
+
+
+
+
+
+/PATH/DIR/ +
+Seleziona l'esatta directory specificata e tutto ciò che contiene, +relativa alla posizione del file `.snapraidignore`. +
+
+
+

A differenza della configurazione globale, i file `.snapraidignore` supportano +solo regole di esclusione; non è possibile utilizzare pattern `include` o negazioni (!). +

Ad esempio, se hai un `.snapraidignore` in `/mnt/disk1/projects/`: +

+# Esclude SOLO /mnt/disk1/projects/output.bin
+/output.bin
+# Esclude qualsiasi directory chiamata 'build' all'interno di projects/
+build/
+# Esclude qualsiasi file .tmp all'interno di projects/ o delle sue sottocartelle
+*.tmp
+
+
+
+

+Content +

+

SnapRAID memorizza l'elenco e i checksum dei file nel file di contenuto. +

È un file binario che elenca tutti i file presenti nell'array di dischi, +insieme a tutti i checksum per verificarne l'integrità. +

Questo file viene letto e scritto dai comandi `sync` e `scrub` e +letto dai comandi `fix`, `check` e `status`. +

+
+

+Parity +

+

SnapRAID memorizza le informazioni di parità dell'array nei file di +parità. +

Questi sono file binari contenenti la parità calcolata di tutti i +blocchi definiti nel file `content`. +

Questi file vengono letti e scritti dai comandi `sync` e `fix` e +solo letti dai comandi `scrub` e `check`. +

+
+

+Codifica +

+

SnapRAID in Unix ignora qualsiasi codifica. Legge e memorizza i +nomi dei file con la stessa codifica utilizzata dal file system. +

In Windows, tutti i nomi letti dal file system vengono convertiti e +elaborati in formato UTF-8. +

Per avere i nomi dei file stampati correttamente, è necessario impostare +la console di Windows in modalità UTF-8 con il comando `chcp 65001` e +utilizzare un carattere TrueType come `Lucida Console` come carattere +della console. +Questo influisce solo sui nomi dei file stampati; se si +reindirizza l'output della console a un file, il file risultante è +sempre in formato UTF-8. +

+
+

+Vedi Anche +

+

snapraid_log(1), snapraidd(1) +

+ + +
+
+
+ + + + + + + diff --git a/beta/manual-ja.html b/beta/manual-ja.html new file mode 100644 index 00000000..0de047d0 --- /dev/null +++ b/beta/manual-ja.html @@ -0,0 +1,1915 @@ + + + + + + + + SnapRAID Manual + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + +
+ +
+ +
+

+Synopsis +

+
+snapraid [-c, --conf CONFIG]
+    [-f, --filter PATTERN] [-d, --filter-disk NAME]
+    [-m, --filter-missing] [-e, --filter-error]
+    [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR]
+    [-p, --plan PERC|bad|new|full]
+    [-o, --older-than DAYS] [-l, --log FILE]
+    [-s, --spin-down-on-error] [-w, --bw-limit RATE]
+    [-Z, --force-zero] [-E, --force-empty]
+    [-U, --force-uuid] [-D, --force-device]
+    [-N, --force-nocopy] [-F, --force-full]
+    [-R, --force-realloc]
+    [-S, --start BLKSTART] [-B, --count BLKCOUNT]
+    [-L, --error-limit NUMBER]
+    [-A, --stats]
+    [-v, --verbose] [-q, --quiet]
+    status|smart|probe|up|down|diff|sync|scrub|fix|check
+    |list|dup|pool|devices|touch|rehash
+
+
+snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT]
+
+
+
+

+Description +

+

SnapRAIDは、ディスクアレイ用のバックアッププログラムで、最大6台のディスク障害が発生した場合の +データ復旧のためにパリティ情報を保存します。 +

主に大容量で、更新頻度の低いファイルを扱うホームメディアセンターを対象としており、 +SnapRAIDにはいくつかの機能があります。 +

    +
  • +ファイルが既に入っているディスクを、再フォーマットせずにそのまま利用でき、通常通り +アクセスできます。 +
  • +
  • +すべてのデータがハッシュ化され、データの整合性を確保し、サイレントな破損を防ぎます。 +
  • +
  • +障害が発生したディスクの数がパリティ数を超えた場合、データの損失は影響を受けたディスクに +限定され、他のディスクのデータは引き続きアクセス可能です。 +
  • +
  • +誤ってディスク上のファイルを削除した場合でも、復旧が可能です。 +
  • +
  • +ディスクは異なるサイズであっても構いません。 +
  • +
  • +いつでもディスクを追加できます。 +
  • +
  • +SnapRAIDはデータをロックしません。いつでも再フォーマットやデータ移動なしに利用を +停止できます。 +
  • +
  • +ファイルにアクセスするためにスピンさせる必要があるのは1台のディスクだけであり、 +省電力と騒音低減に役立ちます。 +
  • +
+

詳細については、SnapRAIDの公式サイトをご覧ください。 +

+https://www.snapraid.it/
+
+
+
+

+Limitations +

+

SnapRAIDはRAIDとバックアッププログラムのハイブリッドであり、両方の利点を組み合わせることを +目指しています。ただし、使用する前に考慮すべきいくつかの制限があります。 +

主な制限は、ディスクが故障し、最近 `sync` を実行していない場合、完全に復旧できない +可能性があることです。 +より具体的には、最後の `sync` 操作以降に変更または削除されたファイルのサイズまでのデータが +復旧できない可能性があります。 +これは、変更または削除されたファイルが故障したディスク上にない場合でも発生します。 +このため、SnapRAIDは**めったに変更されない**データに適しています。 +

一方で、新しく追加されたファイルは、既に存在するファイルの復旧を妨げません。 +新しく追加されたファイルが故障したディスク上にある場合にのみ、それらのファイルが失われます。 +

その他のSnapRAIDの制限は次のとおりです。 +

    +
  • +SnapRAIDでは、各ディスクに対して**個別のファイルシステム**が保持されます。 +RAIDでは、単一の大きなファイルシステムが得られます。 +
  • +
  • +SnapRAIDは**データをストライピングしません**。 +RAIDでは、ストライピングにより速度が向上します。 +
  • +
  • +SnapRAIDは**リアルタイムの復旧をサポートしません**。 +RAIDでは、ディスクが故障しても作業を停止する必要はありません。 +
  • +
  • +SnapRAIDは**限られた数のディスク障害**からのみデータを復旧できます。 +バックアップでは、ディスクアレイ全体の完全な障害から復旧できます。 +
  • +
  • +**ファイル名、タイムスタンプ、シンボリックリンク、およびハードリンク**のみが保存されます。 +アクセス許可、所有権、および拡張属性は保存されません。 +
  • +
+
+
+

+Getting Started +

+

SnapRAIDを使用するには、まずディスクアレイ内の1つのディスクを `parity` 情報専用に +選択する必要があります。パリティ用に1つのディスクを使用すると、RAID5と同様に、単一のディスク障害から +復旧できます。 +

RAID6と同様に、より多くのディスク障害から復旧したい場合は、パリティ用に追加のディスクを +確保する必要があります。パリティディスクを追加するたびに、復旧できるディスク障害が1つ増えます。 +

パリティ情報はアレイ内の**最大のデータディスク**のサイズにまで増える可能性があるため、 +パリティディスクとしては、アレイ内の**最大のディスク**を選択する必要があります。 +

これらのディスクは、`parity` ファイルの保存専用になります。 +**データを保存しないでください**。 +

次に、SnapRAIDで保護したい `data` ディスクを定義する必要があります。 +これらのディスクに含まれるデータがめったに変更されない場合に、保護が最も効果的です。 +このため、WindowsのC:\ディスクやUnixの/home、/var、/tmpディレクトリを含めない方が +良いでしょう。 +

ファイルの一覧は `content` ファイルに保存され、通常はデータ、パリティ、または +ブートディスクに保存されます。 +このファイルには、バックアップの詳細と、その整合性を検証するためのすべての +チェックサムが含まれています。 +`content` ファイルは**複数のコピー**で保存され、複数のディスク障害が発生した場合でも、 +少なくとも1つのコピーが利用可能であることを保証するために、**各コピーは異なるディスクに** +配置する必要があります。 +

たとえば、1レベルのパリティ保護のみに関心があり、ディスクが次の場所にあるとします。 +

+/mnt/diskp <- パリティ用に選択されたディスク
+/mnt/disk1 <- 保護する最初のディスク
+/mnt/disk2 <- 保護する2番目のディスク
+/mnt/disk3 <- 保護する3番目のディスク
+
+

構成ファイル `/etc/snapraid.conf` を次のオプションで作成する必要があります。 +

+parity /mnt/diskp/snapraid.parity
+content /var/snapraid/snapraid.content
+content /mnt/disk1/snapraid.content
+content /mnt/disk2/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+
+

Windowsを使用している場合は、スラッシュではなくドライブ文字とバックスラッシュを +使用したWindowsのパス形式を使用する必要があります。 +

+parity E:\snapraid.parity
+content C:\snapraid\snapraid.content
+content F:\array\snapraid.content
+content G:\array\snapraid.content
+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+
+

ディスクが多くてドライブ文字が不足する場合は、サブフォルダにディスクを +直接マウントできます。参照: +

+https://www.google.com/search?q=Windows+mount+point
+
+

この時点で、パリティ情報を構築するために `sync` コマンドを実行する準備が整いました。 +

+snapraid sync
+
+

このプロセスは、既にディスクに存在するデータのサイズに応じて、初回は数時間かかる +場合があります。ディスクが空の場合は、プロセスは即座に完了します。 +

Ctrl+Cを押すことでいつでも停止でき、次回の実行時には中断された場所から再開されます。 +

このコマンドが完了すると、データは**SAFE**になります。 +

これで、アレイを自由に使い始め、定期的に `sync` コマンドを実行してパリティ情報を +更新できます。 +

+

+Scrubbing +

+

データとパリティのエラーを定期的にチェックするには、`scrub` コマンドを +実行できます。 +

+snapraid scrub
+
+

このコマンドは、配列内のデータを `sync` コマンド中に計算されたハッシュと比較して、 +整合性を検証します。 +

このコマンドを1回実行すると、前回の10日間で既にスクラブされたデータを除いて、 +アレイの約8%がチェックされます。 +-p, --plan オプションを使用して異なる量を指定でき、 +-o, --older-than オプションを使用して異なる経過日数で +指定できます。 +たとえば、20日以上経過したブロックの5%をチェックするには、次のように使用します。 +

+snapraid -p 5 -o 20 scrub
+
+

プロセス中にサイレントエラーまたは入出力エラーが見つかった場合、 +対応するブロックは `content` ファイル内で不良としてマークされ、 +`status` コマンドで一覧表示されます。 +

+snapraid status
+
+

それらを修正するには、-e, --filter-error オプションで不良ブロックをフィルタリングして、 +`fix` コマンドを使用できます。 +

+snapraid -e fix
+
+

次回の `scrub` で、エラーが本当に修正されていれば、`status` レポートから +エラーは消えます。より高速にするために、`-p bad` を使用して不良としてマークされた +ブロックのみをスクラブできます。 +

+snapraid -p bad scrub
+
+

未同期のアレイで `scrub` を実行すると、削除または変更されたファイルによって +引き起こされたエラーが報告される場合があります。これらのエラーは `scrub` の +出力で報告されますが、関連するブロックは不良としてマークされません。 +

+
+

+Pooling +

+

注: ここで説明するプーリング機能は、**mergefs** ツールに取って代わられました。 +mergefs は、SnapRAIDコミュニティのLinuxユーザーに推奨されるオプションです。 +Mergefs は、複数のドライブを単一の統合されたマウントポイントにプールするための、 +より柔軟で効率的な方法を提供し、シンボリックリンクに頼ることなくアレイ全体の +ファイルにシームレスにアクセスできます。これは、パリティ保護のためにSnapRAIDと +うまく統合されており、OpenMediaVault (OMV) やカスタムNAS構成などのセットアップで +一般的に使用されています。 +

アレイ内のすべてのファイルを同じディレクトリツリーに表示させるには、 +`pooling` 機能を有効にできます。これは、シンボリックリンクを使用して、 +アレイ内のすべてのファイルの読み取り専用の仮想ビューを作成します。 +

構成ファイルで `pooling` ディレクトリを次のように構成できます。 +

+pool /pool
+
+

または、Windowsの場合は、次のようにします。 +

+pool C:\pool
+
+

そして、`pool` コマンドを実行して仮想ビューを作成または更新します。 +

+snapraid pool
+
+

Unixプラットフォームを使用しており、このディレクトリをWindowsまたはUnixマシンに +ネットワーク経由で共有したい場合は、`/etc/samba/smb.conf` に次のオプションを +追加する必要があります。 +

+# smb.conf の global セクションで
+unix extensions = no
+
+
+# smb.conf の share セクションで
+[pool]
+comment = Pool
+path = /pool
+read only = yes
+guest ok = yes
+wide links = yes
+follow symlinks = yes
+
+

Windowsでは、ネットワーク経由でシンボリックリンクを共有するには、クライアントが +それらをリモートで解決する必要があります。これを有効にするには、プールディレクトリを +共有することに加えて、構成ファイルで定義された**ディスク名**を共有ポイントとして +使用して、**すべてのディスクを個別に**共有する必要があります。また、リモートクライアントが +これらの共有ディスクにアクセスするために使用する必要があるWindows UNCパスを、 +構成ファイルの `share` オプションで指定する必要があります。 +

たとえば、`darkstar` という名前のサーバーで操作している場合、次のオプションを +使用できます。 +

+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+pool C:\pool
+share \\darkstar
+
+

そして、次のディレクトリをネットワーク経由で共有します。 +

+\\darkstar\pool -> C:\pool
+\\darkstar\d1 -> F:\array
+\\darkstar\d2 -> G:\array
+\\darkstar\d3 -> H:\array
+
+

これにより、リモートクライアントは `\\darkstar\pool` ですべてのファイルに +アクセスできるようになります。 +

また、リモートクライアントがリモートシンボリックリンクへのアクセスを有効にするために、 +次のコマンドで構成する必要がある場合もあります。 +

+fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
+
+
+
+

+Undeleting +

+

SnapRAIDはRAIDシステムよりもバックアッププログラムのように機能し、 +-f, --filter オプションを使用してファイルを以前の状態に復元または削除解除するために +使用できます。 +

+snapraid fix -f FILE
+
+

またはディレクトリの場合は: +

+snapraid fix -f DIR/
+
+

また、-m, --filter-missing オプションを使用して、ディレクトリ内の**誤って削除されたファイルのみ**を +復旧するために使用することもできます。これにより、不足しているファイルのみが復元され、 +他のファイルはすべてそのまま残されます。 +

+snapraid fix -m -f DIR/
+
+

または、すべてのドライブ上のすべての削除されたファイルを復旧するには: +

+snapraid fix -m
+
+
+
+

+Recovering +

+

最悪の事態が発生し、1台以上のディスクを失いました! +

**パニックにならないでください!** 復旧できます! +

最初に行うべきことは、ディスクアレイへの**さらなる変更を避ける**ことです。 +リモート接続、およびスケジュールされたSnapRAIDの夜間 `sync` や `scrub` を含む、 +すべてのスケジュールされたプロセスを無効にしてください。 +

次に、次の手順に進みます。 +

+

+STEP 1 -> Reconfigure +

+

復旧のためにいくらかのスペースが必要です。理想的には追加の +予備ディスクですが、外部USBディスクやリモートディスクでも十分です。 +

SnapRAIDの構成ファイルを変更して、故障したディスクの `data` または `parity` +オプションを、ファイルを復旧するための十分な空き容量のある場所に +向けます。 +

たとえば、ディスク `d1` が故障した場合、次のように変更します。 +

+data d1 /mnt/disk1/
+
+

から: +

+data d1 /mnt/new_spare_disk/
+
+

復旧するディスクがパリティディスクの場合は、適切な `parity` オプションを +更新します。 +複数のディスクが故障している場合は、すべての構成オプションを更新します。 +

+
+

+STEP 2 -> Fix +

+

ログを外部ファイルに保存して、`fix` コマンドを実行します。 +

+snapraid -d NAME -l fix.log fix
+
+

ここで NAME はディスクの名前であり、前の例では `d1` のようなものです。 +復旧するディスクがパリティディスクの場合は、`parity`、`2-parity` などの +名前を使用します。 +複数のディスクが故障している場合は、複数の `-d` オプションを使用して +すべてを指定します。 +

このコマンドは時間がかかります。 +

`fix.log` ファイルを保存するために数ギガバイトの空き容量があることを確認してください。 +十分な空き容量のあるディスクから実行してください。 +

これで、復旧可能なすべてのものが復旧されました。一部のファイルが部分的または完全に +復旧できない場合、それらは `.unrecoverable` 拡張子を追加して名前が変更されます。 +

`fix.log` ファイルで、`unrecoverable:` で始まるすべての行をチェックすることで、 +すべての復旧不能なブロックの詳細なリストを見つけることができます。 +

復旧に満足できない場合は、何度でも再試行できます。 +

たとえば、最後の `sync` の後にアレイからファイルを削除した場合、 +これにより一部のファイルが復旧されない可能性があります。 +この場合、-i, --import オプションを使用して、これらのファイルが現在どこにあるかを指定することで、 +復旧プロセスにそれらを再度含めるように `fix` を再試行できます。 +

復旧に満足している場合は、さらに進むことができますが、**sync** の実行後には +`fix` コマンドを**再試行できない**ことに注意してください! +

+
+

+STEP 3 -> Check +

+

慎重なチェックとして、`check` コマンドを実行して、復旧されたディスク上の +すべてが正しいことを確認できます。 +

+snapraid -d NAME -a check
+
+

ここで NAME はディスクの名前であり、前の例では `d1` のようなものです。 +

`-d` および `-a` オプションは、SnapRAIDに**指定されたディスクのみ**をチェックし、 +**すべてのパリティデータを無視**するように指示します。 +

このコマンドは時間がかかりますが、過度に慎重でない場合はスキップできます。 +

+
+

+STEP 4 -> Sync +

+

`sync` コマンドを実行して、アレイを新しいディスクと再同期します。 +

+snapraid sync
+
+

すべてが復旧されていれば、このコマンドは即座に完了します。 +

+
+
+
+

+Commands +

+

SnapRAIDは、次のことを可能にするいくつかの簡単なコマンドを提供します。 +

    +
  • +アレイの状態の概要を出力 -> `status` +
  • +
  • +ディスクの制御 -> `smart`、`probe`、`up`、`down` +
  • +
  • +バックアップ/スナップショットの作成 -> `sync` +
  • +
  • +データの定期的なチェック -> `scrub` +
  • +
  • +最後のバックアップ/スナップショットの復元 -> `fix`。 +
  • +
+

コマンドは**小文字**で記述する必要があります。 +

+

+status +

+

ディスクアレイの状態の概要を出力します。 +

これには、パリティの断片化、チェックなしでのブロックの古さ、および +スクラビング中に遭遇したすべての記録されたサイレントエラーに関する情報が +含まれます。 +

提示される情報は、最後に `sync` を実行した時点のものです。 +それ以降の変更は考慮されません。 +

不良ブロックが検出された場合、それらのブロック番号が一覧表示されます。 +それらを修正するには、`fix -e` コマンドを使用できます。 +

また、各ブロックが最後にスクラブまたは同期された時期を示すグラフも表示されます。 +スクラブされたブロックは `*` で、同期されたがまだスクラブされていないブロックは `o` で +示されます。 +

何も変更されません。 +

+
+

+smart +

+

システム内のすべてのディスクのSMARTレポートを出力します。 +

これには、翌年の故障確率の推定値が含まれており、疑わしい属性を示すディスクの +メンテナンス交換を計画できます。 +

この確率推定は、ディスクのSMART属性を次の場所で利用可能なBackblazeのデータと +相関させることで得られます。 +

+https://www.backblaze.com/hard-drive-test-data.html
+
+

SMARTがディスクが故障していると報告した場合、そのディスクに対して `FAIL` または `PREFAIL` が +出力され、SnapRAIDはエラーを返します。 +この場合、**ディスクの即時交換**が強く推奨されます。 +

その他の可能なステータス文字列は次のとおりです。 +

+
+
+logfail +
+過去に、一部の属性がしきい値よりも低かった。 +
+
+
+
+logerr +
+デバイスのエラーログにエラーが含まれている。 +
+
+
+
+selferr +
+デバイスのセルフテストログにエラーが含まれている。 +
+
+
+
+
+
+-v, --verbose オプションが指定されている場合、より詳細な統計分析が提供されます。 +
+
+
+
+

この分析は、より多くまたはより少ないパリティが必要かどうかを決定するのに役立ちます。 +

このコマンドは `smartctl` ツールを使用し、すべてのデバイスで `smartctl -a` を実行するのと +同等です。 +

デバイスが正しく自動検出されない場合は、構成ファイルで `smartctl` オプションを +使用してカスタムコマンドを指定できます。 +

何も変更されません。 +

+
+

+probe +

+

システム内のすべてのディスクのPOWER状態を出力します。 +

`Standby` はディスクがスピンしていないことを意味します。`Active` は +ディスクがスピンしていることを意味します。 +

このコマンドは `smartctl` ツールを使用し、すべてのデバイスで `smartctl -n standby -i` を実行するのと +同等です。 +

デバイスが正しく自動検出されない場合は、構成ファイルで `smartctl` オプションを +使用してカスタムコマンドを指定できます。 +

何も変更されません。 +

+
+

+up +

+

アレイのすべてのディスクをスピンアップします。 +

+
+
+-d, --filter-disk オプションを使用して、特定のディスクのみをスピンアップできます。 +
+
+
+
+

すべてのディスクを同時にスピンアップするには、多くの電力が必要です。 +電源がそれに耐えられることを確認してください。 +

何も変更されません。 +

+
+

+down +

+

アレイのすべてのディスクをスピンダウンします。 +

このコマンドは `smartctl` ツールを使用し、すべてのデバイスで `smartctl -s standby,now` を実行するのと +同等です。 +

+
+
+-d, --filter-disk オプションを使用して、特定のディスクのみをスピンダウンできます。 +
+
+
+
+

エラー時に自動的にスピンダウンするには、他の任意のコマンドで -s, --spin-down-on-error +オプションを使用できます。これは、エラーが発生したときに手動で `down` を実行するのと同等です。 +

何も変更されません。 +

+
+

+diff +

+

最後の `sync` 以降に変更され、パリティデータを再計算する必要があるすべてのファイルを +一覧表示します。 +

このコマンドはファイルデータはチェックせず、ファイルのタイムスタンプ、サイズ、 +およびinodeのみをチェックします。 +

変更されたすべてのファイルを一覧表示した後、変更の概要が +次のようにグループ化されて提示されます。 +

+
+
+equal +
+変更されていないファイル。 +
+
+
+
+added +
+以前は存在しなかった追加されたファイル。 +
+
+
+
+removed +
+削除されたファイル。 +
+
+
+
+updated +
+サイズまたはタイムスタンプが異なるファイル。これは、 +変更されたことを意味します。 +
+
+
+
+moved +
+同じディスク上の異なるディレクトリに移動されたファイル。 +同じ名前、サイズ、タイムスタンプ、およびinodeを持ちますが、ディレクトリが +異なることで識別されます。 +
+
+
+
+copied +
+同じディスクまたは異なるディスクにコピーされたファイル。 +異なるディスクに真に移動された場合、`removed` にも +カウントされることに注意してください。 +同じ名前、サイズ、およびタイムスタンプを持つことで識別されます。 +サブ秒のタイムスタンプがゼロの場合、ファイル名だけでなく、 +フルパスが一致する必要があります。 +
+
+
+
+restored +
+inodeは異なるが、名前、サイズ、タイムスタンプが一致するファイル。 +これらは通常、削除後に復元されたファイルです。 +
+
+
+

`sync` が必要な場合、プロセスはデフォルトの0ではなく、リターンコード2を返します。 +リターンコード1は、一般的なエラー状態に使用されます。 +

何も変更されません。 +

+
+

+sync +

+

パリティ情報を更新します。ディスクアレイ内のすべての変更されたファイルが読み取られ、 +対応するパリティデータが更新されます。 +

Ctrl+Cを押すことでいつでもこのプロセスを停止でき、 +既に完了した作業を失うことはありません。 +次回の実行時には、`sync` プロセスは中断された場所から +再開されます。 +

プロセス中にサイレントエラーまたは入出力エラーが見つかった場合、 +対応するブロックは不良としてマークされます。 +

ファイルはパスおよび/またはinodeによって識別され、サイズとタイムスタンプによって +チェックされます。 +ファイルサイズまたはタイムスタンプが異なる場合、パリティデータはファイル全体で +再計算されます。 +ファイルが同じディスク上で移動または名前が変更され、同じinodeが保持されている場合、 +パリティは再計算されません。 +ファイルが別のディスクに移動された場合、パリティは再計算されますが、 +以前に計算されたハッシュ情報は保持されます。 +

`content` ファイルと `parity` ファイルは必要に応じて変更されます。 +アレイ内のファイルは**変更されません**。 +

+
+

+scrub +

+

アレイをスクラブし、データおよびパリティディスクのサイレントエラーまたは入出力エラーを +チェックします。 +

1回の呼び出しごとに、最後の10日間で既にスクラブされたデータを除いて、 +アレイの約8%がチェックされます。 +これは、週に1回スクラビングを実行すると、すべてのデータが少なくとも3か月に1回は +チェックされることを意味します。 +

+
+
+-p, --plan オプションを使用して、異なるスクラブプランまたは量を定義できます。 +
+
+
+
+

このオプションは以下を受け入れます。 +bad - 不良としてマークされたブロックをスクラブします。 +new - まだスクラブされていない、同期されたばかりのブロックをスクラブします。 +full - すべてをスクラブします。 +0-100 - 指定されたパーセンテージのブロックをスクラブします。 +

パーセンテージの量を指定する場合、-o, --older-than オプションを使用して、 +ブロックがどれくらいの古さである必要があるかを定義することもできます。 +最も古いブロックが最初にスクラブされ、最適なチェックが保証されます。 +まだスクラブされていない、同期されたばかりのブロックのみをスクラブしたい場合は、 +`-p new` オプションを使用します。 +

スクラブステータスの詳細を取得するには、`status` コマンドを使用します。 +

見つかったサイレントエラーまたは入出力エラーごとに、対応するブロックは +`content` ファイル内で不良としてマークされます。 +これらの不良ブロックは `status` で一覧表示され、`fix -e` で修正できます。 +修正後、次回のスクラブで再チェックされ、修正されていると判明した場合、 +不良マークは削除されます。 +不良ブロックのみをスクラブするには、`scrub -p bad` コマンドを使用できます。 +

未同期のデータによって引き起こされた報告されたエラーを避けるために、 +`scrub` は**同期された**アレイでのみ実行することをお勧めします。これらのエラーは +サイレントエラーではないと認識され、ブロックは不良としてマークされませんが、 +そのようなエラーはコマンドの出力で報告されます。 +

`content` ファイルは、各ブロックの最後のチェック時刻を更新し、不良ブロックを +マークするために変更されます。 +`parity` ファイルは**変更されません**。 +アレイ内のファイルは**変更されません**。 +

+
+

+fix +

+

すべてのファイルとパリティデータを修正します。 +

すべてのファイルとパリティデータは、最後の `sync` で保存されたスナップショット状態と +比較されます。 +違いが見つかった場合、保存されたスナップショットに**元に戻されます**。 +

**警告!** `fix` コマンドは、エラーと意図的な変更を区別しません。 +ファイルの_状態を_最後の `sync` に**無条件に元に戻します**。 +

他のオプションが指定されていない場合、アレイ全体が処理されます。 +フィルタオプションを使用して、操作するファイルまたはディスクのサブセットを +選択します。 +

`sync` および `scrub` 中に不良としてマークされたブロックのみを修正するには、 +-e, --filter-error オプションを使用します。 +他のフィルタオプションとは異なり、これは最新の `sync` 以降に**変更されていない** +ファイルにのみ修正を適用します。 +

SnapRAIDは、修正できないすべてのファイルの名前を `.unrecoverable` 拡張子を +追加して変更します。 +

修正する前に、アレイ全体がスキャンされ、最後の `sync` 操作以降に移動されたファイルが +見つけられます。 +これらのファイルは、名前を無視してタイムスタンプによって識別され、 +必要に応じて復旧プロセスで使用されます。 +それらのいくつかをアレイ外に移動した場合は、-i, --import オプションを使用して +スキャンする追加のディレクトリを指定できます。 +

ファイルは**パスによってのみ**識別され、inodeによっては識別されません。 +

`content` ファイルは**変更されません**。 +`parity` ファイルは必要に応じて変更されます。 +アレイ内のファイルは必要に応じて変更されます。 +

+
+

+check +

+

すべてのファイルとパリティデータを検証します。 +

`fix` のように機能しますが、復旧を**シミュレートするだけ**で、アレイに**変更は書き込まれません**。 +

このコマンドは、主に復旧プロセス後やその他の特殊な条件下での手動検証を +目的としています。 +定期的でスケジュールされたチェックには、`scrub` を使用します。 +

+
+
+-a, --audit-only オプションを使用すると、ファイルの**ハッシュのみ**がチェックされ、 +
+
+
+
+

パリティデータは無視されるため、チェックプロセスが大幅に高速化されます。 +

ファイルは**パスによってのみ**識別され、inodeによっては識別されません。 +

何も変更されません。 +

+
+

+list +

+

最後の `sync` の時点のアレイに含まれるすべてのファイルを +一覧表示します。 +

+
+
+-v または --verbose を使用すると、サブ秒の時間も表示されます。 +
+
+
+
+

何も変更されません。 +

+
+

+dup +

+

すべての重複ファイルを一覧表示します。ハッシュが一致する場合、2つのファイルは等しいと見なされます。 +ファイルデータは読み取られず、事前に計算されたハッシュのみが使用されます。 +

何も変更されません。 +

+
+

+pool +

+

`pooling` ディレクトリに、ディスクアレイ内のすべてのファイルの仮想ビューを +作成または更新します。 +

ファイルはコピーされず、シンボリックリンクを使用してリンクされます。 +

更新時、既存のすべてのシンボリックリンクと空のサブディレクトリは削除され、 +アレイの新しいビューに置き換えられます。その他の通常のファイルはそのまま残されます。 +

プールディレクトリ外は何も変更されません。 +

+
+

+devices +

+

アレイで使用される低レベルデバイスを出力します。 +

このコマンドは、アレイ内のデバイスの関連付けを表示し、主にスクリプトインターフェイスを +目的としています。 +

最初の2つの列は、低レベルデバイスIDとパスです。 +次の2つの列は、高レベルデバイスIDとパスです。 +最後の列は、アレイ内のディスク名です。 +

ほとんどの場合、アレイ内のディスクごとに1つの低レベルデバイスがありますが、 +より複雑な構成では、単一のアレイ内のディスクで複数の低レベルデバイスが +使用される場合があります。 +

何も変更されません。 +

+
+

+touch +

+

サブ秒のタイムスタンプがゼロに設定されているすべてのファイルに、任意のサブ秒のタイムスタンプを +設定します。 +

これにより、タイムスタンプがほぼ一意になり、重複の可能性が減るため、 +SnapRAIDが移動およびコピーされたファイルを認識する能力が向上します。 +

より具体的には、サブ秒のタイムスタンプがゼロでない場合、移動またはコピーされたファイルは、 +名前、サイズ、およびタイムスタンプが一致する場合にそうであると識別されます。 +サブ秒のタイムスタンプがゼロの場合、フルパス、サイズ、およびタイムスタンプのすべてが +一致する場合にのみコピーと見なされます。 +

秒精度のタイムスタンプは変更されないため、ファイルのすべての日付と時刻は +保持されます。 +

+
+

+rehash +

+

アレイ全体のリハッシュをスケジュールします。 +

このコマンドは、使用されるハッシュの種類を変更します。これは通常、32ビットシステムから +64ビットシステムにアップグレードするときに、MurmurHash3からより高速なSpookyHashに +切り替えるために行われます。 +

既に最適なハッシュを使用している場合、このコマンドは何もせず、アクションが不要であることを +通知します。 +

リハッシュはすぐには実行されず、`sync` および `scrub` の間に徐々に実行されます。 +

`status` を使用してリハッシュの状態を確認できます。 +

リハッシュ中もSnapRAIDは完全な機能を維持しますが、唯一の例外として、 +`dup` は異なるハッシュを使用している重複ファイルを検出できません。 +

+
+
+

+Options +

+

SnapRAIDには、次のオプションがあります。 +

+
+
+-c, --conf CONFIG +
+使用する構成ファイルを選択します。指定されていない場合、Unixでは、存在すれば +`/usr/local/etc/snapraid.conf` を使用し、それ以外の場合は `/etc/snapraid.conf` を +使用します。 +Windowsでは、`snapraid.exe` と同じディレクトリにある `snapraid.conf` ファイルを +使用します。 +
+
+
+
+
+
+-f, --filter PATTERN +
+`check` および `fix` で処理するファイルをフィルタリングします。 +指定されたパターンに一致するファイルのみが処理されます。 +このオプションは複数回使用できます。 +パターン仕様の詳細については、PATTERNセクションを参照してください。 +Unixでは、グロブ文字を使用する場合は引用符で囲むようにしてください。 +このオプションは、`check` および `fix` のみで使用できます。 +これらは常にアレイ全体を処理するため、`sync` および `scrub` では +使用できません。 +
+
+
+
+
+
+-d, --filter-disk NAME +
+`check`、`fix`、`up`、および `down` で処理するディスクをフィルタリングします。 +構成ファイルで定義されているディスク名を指定する必要があります。 +`parity`、`2-parity`、`3-parity` などの名前でパリティディスクも指定して、 +特定のパリティディスクに操作を限定できます。 +複数の --filter、--filter-disk、および --filter-missing オプションを組み合わせると、 +すべてのフィルタに一致するファイルのみが選択されます。 +このオプションは複数回使用できます。 +このオプションは、`check`、`fix`、`up`、および `down` のみで使用できます。 +これらは常にアレイ全体を処理するため、`sync` および `scrub` では +使用できません。 +
+
+
+
+
+
+-m, --filter-missing +
+`check` および `fix` で処理するファイルをフィルタリングします。 +アレイから不足または削除されたファイルのみが処理されます。 +`fix` と一緒に使用すると、これは `undelete` コマンドとして機能します。 +複数の --filter、--filter-disk、および --filter-missing オプションを組み合わせると、 +すべてのフィルタに一致するファイルのみが選択されます。 +このオプションは、`check` および `fix` のみで使用できます。 +これらは常にアレイ全体を処理するため、`sync` および `scrub` では +使用できません。 +
+
+
+
+
+
+-e, --filter-error +
+`check` および `fix` でエラーのあるファイルを処理します。 +`status` で一覧表示されているように、`sync` および `scrub` 中にサイレントエラーまたは +入出力エラーでマークされたブロックを持つファイルのみを処理します。 +このオプションは、`check` および `fix` のみで使用できます。 +
+
+
+
+
+
+-p, --plan PERC|bad|new|full +
+スクラブプランを選択します。PERCが0から100までの数値である場合、 +スクラブするブロックのパーセンテージとして解釈されます。 +パーセンテージの代わりに、プランを指定できます。 +`bad` は不良ブロックをスクラブし、`new` はまだスクラブされていないブロックをスクラブし、 +`full` はすべてをスクラブします。 +このオプションは、`scrub` のみで使用できます。 +
+
+
+
+
+
+-o, --older-than DAYS +
+`scrub` で処理するアレイの最も古い部分を選択します。 +DAYS は、ブロックがスクラブされるための最小経過日数であり、デフォルトは10です。 +不良としてマークされたブロックは、このオプションに関係なく常にスクラブされます。 +このオプションは、`scrub` のみで使用できます。 +
+
+
+
+
+
+-a, --audit-only +
+`check` で、パリティデータをチェックせずにファイルのハッシュを検証します。 +ファイルデータのみのチェックに関心がある場合、このオプションはチェックプロセスを +大幅に高速化できます。 +このオプションは、`check` のみで使用できます。 +
+
+
+
+
+
+-h, --pre-hash +
+`sync` で、パリティ計算の前の追加検証のために、すべての新しいデータの +予備ハッシュ化フェーズを実行します。 +通常、`sync` では、予備ハッシュ化は行われず、新しいデータはパリティ計算の直前に、 +最初に読み取られたときにハッシュ化されます。 +このプロセスは、システムが重い負荷の下にあり、すべてのディスクがスピンしており、CPUが +ビジーなときに発生します。 +これはマシンにとって極端な状態であり、潜在的なハードウェアの問題がある場合、 +データがまだハッシュ化されていないため、サイレントエラーが検出されないままになる +可能性があります。 +このリスクを回避するために、`pre-hash` モードを有効にして、すべてのデータを2回読み取り、 +その整合性を確保できます。 +このオプションは、アレイ内で移動されたファイルも検証して、移動操作が成功したことを +確認し、必要に応じて、続行する前に修正操作を実行できるようにします。 +このオプションは、`sync` のみで使用できます。 +
+
+
+
+
+
+-i, --import DIR +
+最後の `sync` の後にアレイから削除されたファイルを、指定されたディレクトリから +インポートします。 +これらのファイルをまだ持っている場合、それらは復旧プロセスを改善するために +`check` および `fix` で使用できます。 +ファイルは、サブディレクトリを含めて読み取られ、名前に関係なく識別されます。 +このオプションは、`check` および `fix` のみで使用できます。 +
+
+
+
+
+
+-s, --spin-down-on-error +
+エラーが発生した場合、非ゼロのステータスコードで終了する前に、管理されているすべてのディスクを +スピンダウンします。これにより、中断された操作後にドライブがアクティブなままスピンし続け、 +不要な熱の蓄積と電力消費を回避するのに役立ちます。 +コマンドが失敗した場合でも、ディスクが安全に停止されるように、このオプションを使用します。 +
+
+
+
+
+
+-w, --bw-limit RATE +
+すべてのディスクにグローバルな帯域幅制限を適用します。RATE は +1秒あたりのバイト数です。K、M、Gなどの乗数を指定できます +(例:--bw-limit 1G)。 +
+
+
+
+
+
+-A, --stats +
+追加情報を表示する拡張ステータスビューを有効にします。 +画面には2つのグラフが表示されます。 +最初のグラフは、各ディスクのバッファリングされたストライプの数と、そのディスクで現在 +アクセスされているファイルのファイルパスを示します。通常、最も遅いディスクには +バッファが利用できず、これが達成可能な最大帯域幅を決定します。 +2番目のグラフは、過去100秒間に待機に費やされた時間のパーセンテージを示します。 +最も遅いディスクが待機時間のほとんどを引き起こすと予想され、他のディスクは +バッファリングされたストライプを使用できるため、待機時間がほとんどまたはまったくないはずです。 +このグラフは、ハッシュ計算とRAID計算に費やされた待機時間も示します。 +すべての計算はディスク操作と並行して実行されます。 +したがって、少なくとも1つのディスクで測定可能な待機時間がある限り、 +CPUがワークロードに追いつくのに十分速いことを示しています。 +
+
+
+
+
+
+-Z, --force-zero +
+以前は非ゼロだったサイズのファイルをゼロで同期するという安全でない操作を強制します。 +SnapRAIDがこのような状態を検出した場合、このオプションを指定しない限り、 +続行を停止します。 +これにより、システムクラッシュ後に一部のアクセスされたファイルが切り捨てられたときに、 +それを簡単に検出できます。 +これは、ext3/ext4ファイルシステムを使用したLinuxで起こりうる状態です。 +このオプションは、`sync` のみで使用できます。 +
+
+
+
+
+
+-E, --force-empty +
+元のファイルがすべて不足しているディスクを同期するという安全でない操作を強制します。 +SnapRAIDが、元々ディスクに存在していたすべてのファイルが不足しているか、 +書き換えられていることを検出した場合、このオプションを指定しない限り、 +続行を停止します。 +これにより、データファイルシステムがマウントされていないときに、それを簡単に +検出できます。 +このオプションは、`sync` のみで使用できます。 +
+
+
+
+
+
+-U, --force-uuid +
+UUIDが変更されたディスクとの同期、チェック、および修正という安全でない操作を強制します。 +SnapRAIDが一部のディスクがUUIDを変更したことを検出した場合、 +このオプションを指定しない限り、続行を停止します。 +これにより、ディスクが間違ったマウントポイントにマウントされているときに、それを検出できます。 +ただし、単一パリティでの単一のUUID変更、および複数のパリティでのより多くのUUID変更は +許可されています。これは、復旧後にディスクを交換するときの通常のケースであるためです。 +このオプションは、`sync`、`check`、または `fix` のみで使用できます。 +
+
+
+
+
+
+-D, --force-device +
+アクセスできないディスク、または同じ物理デバイス上のディスクとの修正という安全でない操作を強制します。 +たとえば、2台のデータディスクを失い、最初の1台だけを復旧するための予備ディスクがある場合、 +2番目のアクセスできないディスクを無視できます。 +または、既に**使用されている**ディスクに残された空き容量にディスクを復旧したい場合、 +同じ物理デバイスを共有します。 +このオプションは、`fix` のみで使用できます。 +
+
+
+
+
+
+-N, --force-nocopy +
+`sync`、`check`、および `fix` で、コピー検出ヒューリスティックを無効にします。 +このオプションがない場合、SnapRAIDは、名前、サイズ、タイムスタンプなどの同じ属性を持つファイルが、 +同じデータを持つコピーであると見なします。 +これにより、あるディスクから別のディスクにコピーまたは移動されたファイルを識別し、 +既に計算されたハッシュ情報を再利用して、サイレントエラーを検出したり、不足しているファイルを +復旧したりできます。 +まれに、この動作が誤検出や、多くのハッシュ検証によるプロセスの遅延につながる可能性があり、 +このオプションを使用すると、そのような問題を解決できます。 +このオプションは、`sync`、`check`、および `fix` のみで使用できます。 +
+
+
+
+
+
+-F, --force-full +
+`sync` で、パリティの完全な再計算を強制します。 +このオプションは、新しいパリティレベルを追加する場合、またはより新しいパリティデータを使用して +古いコンテンツファイルに戻した場合に使用できます。 +パリティを最初から再作成する代わりに、これにより、コンテンツファイルに存在するハッシュを +再利用してデータを検証し、既存のパリティデータを使用して `sync` プロセス中にデータ保護を +維持できます。 +このオプションは、`sync` のみで使用できます。 +
+
+
+
+
+
+-R, --force-realloc +
+`sync` で、ファイルの完全な再割り当てとパリティの再構築を強制します。 +このオプションは、コンテンツファイルに存在するハッシュを再利用してデータを検証しながら、 +断片化を削除して、すべてのファイルを完全に再割り当てするために使用できます。 +このオプションは、`sync` のみで使用できます。 +**警告!** このオプションはエキスパートのみを対象としており、使用しないことを強く +お勧めします。 +`sync` 操作中にデータ保護はありません。 +
+
+
+
+
+
+-l, --log FILE +
+詳細なログを指定されたファイルに書き込みます。 +このオプションが指定されていない場合、予期しないエラーが画面に出力され、 +多くのエラーが発生した場合に過剰な出力になる可能性があります。 +-l, --log が指定されている場合、SnapRAIDが停止する原因となる致命的なエラーのみが +画面に出力されます。 +パスが '>>' で始まる場合、ファイルは追記モードで開かれます。 +名前に '%D' と '%T' が出現すると、それぞれYYYYMMDDとHHMMSSの形式で +日付と時刻に置き換えられます。Windowsバッチファイルでは、'%' 文字を +2倍にする必要があります。例:result-%%D.log。'>>' を使用するには、 +名前を引用符で囲む必要があります。例:`">>result.log"`。 +ログを標準出力または標準エラーに出力するには、それぞれ `">&1"` および `">&2"` を +使用できます。 +ログタグの説明については、snapraid_log.txtファイルまたはmanページを参照してください。 +
+
+
+
+
+
+-L, --error-limit NUMBER +
+実行を停止する前の新しいエラー制限を設定します。 +デフォルトでは、SnapRAIDは100を超える入出力エラーに遭遇した場合に停止します。 +これは、ディスクが故障している可能性が高いことを示しています。 +このオプションは `sync` と `scrub` に影響し、最初の一連のディスクエラーの後に +続行して操作を完了しようとすることが許可されます。 +ただし、`check` と `fix` は常に最初のエラーで停止します。 +
+
+
+
+
+
+-S, --start BLKSTART +
+指定されたブロック番号から処理を開始します。 +これは、破損したディスクの場合に特定のブロックを再試行してチェックまたは修正するのに +役立ちます。 +このオプションは、主に高度な手動復旧を目的としています。 +
+
+
+
+
+
+-B, --count BLKCOUNT +
+指定された数のブロックのみを処理します。 +このオプションは、主に高度な手動復旧を目的としています。 +
+
+
+
+
+
+-C, --gen-conf CONTENT +
+既存のコンテンツファイルからダミーの構成ファイルを生成します。 +構成ファイルは標準出力に書き込まれ、既存のファイルを上書きしません。 +この構成ファイルには、システム全体を失った場合にディスクのマウントポイントを +再構築するために必要な情報も含まれています。 +
+
+
+
+
+
+-v, --verbose +
+画面により多くの情報を出力します。 +1回指定すると、除外されたファイルと追加の統計が出力されます。 +このオプションはログファイルには影響しません。 +
+
+
+
+
+
+-q, --quiet +
+画面に出力される情報を減らします。 +1回指定すると、プログレスバーが削除されます。2回指定すると、実行中の操作が削除されます。 +3回指定すると、情報メッセージが削除されます。4回指定すると、ステータスメッセージが削除されます。 +致命的なエラーは常に画面に出力されます。 +このオプションはログファイルには影響しません。 +
+
+
+
+
+
+-H, --help +
+短いヘルプ画面を出力します。 +
+
+
+
+
+
+-V, --version +
+プログラムのバージョンを出力します。 +
+
+
+
+
+

+Configuration +

+

SnapRAIDは、ディスクアレイの場所とパリティ情報の保存場所を知るために、構成ファイルを +必要とします。 +

Unixでは、存在すれば `/usr/local/etc/snapraid.conf` を使用し、それ以外の場合は +`/etc/snapraid.conf` を使用します。 +Windowsでは、`snapraid.exe` と同じディレクトリにある `snapraid.conf` ファイルを +使用します。 +

次のオプションを含める必要があります(大文字と小文字を区別します)。 +

+

+parity FILE [,FILE] ... +

+

パリティ情報を保存するために使用するファイルを定義します。 +パリティは、RAID5と同様に、単一のディスク障害からの保護を有効にします。 +

複数のファイルを指定でき、それらは異なるディスク上に存在する必要があります。 +ファイルがそれ以上成長できなくなると、次のファイルが使用されます。 +利用可能な総容量は、アレイ内の**最大のデータディスク**と少なくとも同じ大きさでなければなりません。 +

後で追加のパリティファイルを追加することはできますが、 +それらを並べ替えたり削除したりすることはできません。 +

パリティディスクをパリティ用に予約しておくことで、それらが断片化されるのを防ぎ、 +パフォーマンスを向上させます。 +

Windowsでは、フルディスクに関する警告を避けるために、各ディスクに256 MBが未使用で +残されます。 +

このオプションは必須であり、1回のみ使用できます。 +

+
+

+(2,3,4,5,6)-parity FILE [,FILE] ... +

+

追加のパリティ情報を保存するために使用するファイルを定義します。 +

指定されたパリティレベルごとに、1つの追加の保護レベルが有効になります。 +

    +
  • +2-parity は RAID6 デュアルパリティを有効にします。 +
  • +
  • +3-parity は トリプルパリティを有効にします。 +
  • +
  • +4-parity は クアッド(4つ)パリティを有効にします。 +
  • +
  • +5-parity は ペンタ(5つ)パリティを有効にします。 +
  • +
  • +6-parity は ヘキサ(6つ)パリティを有効にします。 +
  • +
+

各パリティレベルには、以前のすべてのパリティレベルが存在する必要があります。 +

`parity` オプションと同じ考慮事項が適用されます。 +

これらのオプションはオプションであり、1回のみ使用できます。 +

+
+

+z-parity FILE [,FILE] ... +

+

トリプルパリティを保存するための代替ファイルとフォーマットを定義します。 +

このオプションは `3-parity` の代替であり、主にARMやSSSE3命令セットをサポートしていない +AMD Phenom、Athlon、OpteronなどのローエンドCPUを対象としています。 +このような場合、より良いパフォーマンスを提供します。 +

このフォーマットは、ZFS RAIDZ3で使用されるものと似ていますが、より高速です。 +ZFSと同様に、トリプルパリティを超えては機能しません。 +

`3-parity` を使用している場合、パフォーマンス向上のために `z-parity` フォーマットの +使用が推奨される場合は警告が表示されます。 +

構成ファイルを目的の `z-parity` または `3-parity` ファイルで調整し、 +`fix` を使用して再作成することで、あるフォーマットから別のフォーマットに +変換することが可能です。 +

+
+

+content FILE +

+

ディスクアレイに存在するすべてのファイルの一覧とチェックサムを保存するために使用するファイルを +定義します。 +

データ、パリティ、またはその他の利用可能なディスクに配置できます。 +データディスクを使用する場合、このファイルは `sync` プロセスから自動的に +除外されます。 +

このオプションは必須であり、同じファイルを複数コピー保存するために複数回使用できます。 +

使用するパリティディスクごとに**少なくとも1つのコピー**と、さらに**1つのコピー**を +保存する必要があります。追加のコピーを使用しても害はありません。 +

+
+

+data NAME DIR +

+

アレイ内のデータディスクの名前とマウントポイントを定義します。 +NAME はディスクを識別するために使用され、**一意である**必要があります。 +DIR はファイルシステム内のディスクの**マウントポイント**です。 +

NAME を固定したままにしておけば、必要に応じてマウントポイントを変更できます。 +

アレイ内のデータディスクごとに1つのオプションを使用する必要があります。 +

構成ファイルで直接 NAME を変更してから `sync` コマンドを実行することで、 +後でディスクの名前を変更できます。 +名前変更の場合、関連付けはディスクの保存されたUUIDを使用して行われます。 +

+
+

+nohidden +

+

すべての隠しファイルとディレクトリを除外します。 +Unixでは、隠しファイルは `.` で始まるファイルです。 +Windowsでは、隠し属性を持つファイルです。 +

+
+

+exclude/include PATTERN +

+

syncプロセスで除外または含めるファイルまたはディレクトリのパターンを定義します。 +すべてのパターンは指定された順序で処理されます。 +

一致する最初のパターンが `exclude` の場合、ファイルは除外されます。 +`include` の場合、ファイルは含まれます。 +パターンが一致しない場合、最後に指定されたパターンが `include` の場合はファイルは除外され、 +`exclude` の場合は含まれます。 +

パターン仕様の詳細については、PATTERNセクションを参照してください。 +

このオプションは複数回使用できます。 +

+
+

+blocksize SIZE_IN_KIBIBYTES +

+

パリティの基本ブロックサイズをキビバイト単位で定義します。 +1キビバイトは1024バイトです。 +

デフォルトのブロックサイズは256であり、ほとんどの場合に機能するはずです。 +

**警告!** このオプションはエキスパートのみを対象としており、この値を変更しないことを強く +お勧めします。今後この値を変更するには、パリティ全体を**再作成**する必要があります! +

異なるブロックサイズを使用する理由の1つは、数百万のオーダーの**多くの小さなファイル**を +持っている場合です。 +

ファイルごとに、たとえ数バイトであっても、パリティの**ブロック全体**が割り当てられ、 +ファイルが多いと、これにより**かなりの未使用パリティスペース**が発生する可能性があります。 +パリティディスクを完全に埋めると、データディスクにファイルを追加することは**許可されません**。 +ただし、浪費されたパリティはデータディスク間で蓄積されません。データディスク上の多数のファイルから +生じる浪費スペースは、**そのデータディスク上のデータ量**のみを制限し、他のデータディスクには +影響しません。 +

概算として、ファイルごとにブロックサイズの半分が浪費されると仮定できます。 +たとえば、100,000ファイルと256 KiBのブロックサイズがある場合、12.8 GBのパリティが浪費され、 +これによりデータディスク上で12.8 GB少ないスペースしか利用できなくなる可能性があります。 +

`status` を使用して、各ディスクの浪費スペースの量を確認できます。 +これは、データディスク上に**空き**として残す必要がある、またはアレイに含まれないファイルに +使用する必要があるスペースの量です。 +この値が負の場合、パリティが満杯に近づいていることを意味し、まだ浪費できるスペースを +表します。 +

この問題を回避するために、パリティにより大きなパーティションを使用できます。 +たとえば、パリティパーティションがデータディスクよりも12.8 GB大きい場合、 +各データディスクで最大100,000ファイルを処理するのに十分な追加スペースがあり、 +浪費スペースはありません。 +

Linuxでより大きなパリティパーティションを取得するトリックは、次のコマンドで +フォーマットすることです。 +

+mkfs.ext4 -m 0 -T largefile4 DEVICE
+
+

これにより、約1.5%の追加スペース、4 TBディスクで約60 GBが得られ、 +浪費スペースなしで各データディスクで約460,000ファイルが可能になります。 +

+
+

+hashsize SIZE_IN_BYTES +

+

保存されたブロックのハッシュサイズをバイト単位で定義します。 +

デフォルトのハッシュサイズは16バイト(128ビット)であり、ほとんどの場合に機能するはずです。 +

**警告!** このオプションはエキスパートのみを対象としており、この値を変更しないことを強く +お勧めします。今後この値を変更するには、パリティ全体を**再作成**する必要があります! +

異なるハッシュサイズを使用する理由の1つは、システムのメモリが制限されている場合です。 +経験則として、SnapRAIDは通常、アレイ内のデータ16 TBごとに1 GiBのRAMを必要とします。 +

具体的には、データのハッシュを保存するために、SnapRAIDは +約 $TS \cdot (1 + HS) / BS$ バイトのRAMを必要とします。 +ここで、TSはディスクアレイの合計サイズ(バイト)、BSはブロックサイズ(バイト)、HSはハッシュサイズ(バイト)です。 +

たとえば、4 TBのディスク8台、ブロックサイズ256 KiB(1 KiB = 1024バイト)、 +ハッシュサイズ16の場合: +

+RAM = $(8 \cdot 4 \cdot 10^{12}) \cdot (1 + 16) / (256 \cdot 2^{10}) = 1.93 \text{ GiB}$
+
+

ハッシュサイズを8に切り替えると: +

+RAM = $(8 \cdot 4 \cdot 10^{12}) \cdot (1 + 8) / (256 \cdot 2^{10}) = 1.02 \text{ GiB}$
+
+

ブロックサイズを512に切り替えると: +

+RAM = $(8 \cdot 4 \cdot 10^{12}) \cdot (1 + 16) / (512 \cdot 2^{10}) = 0.96 \text{ GiB}$
+
+

ハッシュサイズを8、ブロックサイズを512の両方に切り替えると: +

+RAM = $(8 \cdot 4 \cdot 10^{12}) \cdot (1 + 8) / (512 \cdot 2^{10}) = 0.51 \text{ GiB}$
+
+
+
+

+autosave SIZE_IN_GIGABYTES +

+

処理された指定されたGB量後に、同期またはスクラビング時に状態を自動的に保存します。 +このオプションは、マシンクラッシュやその他のイベントによって中断された場合に、 +長い `sync` コマンドを最初から再起動するのを避けるのに役立ちます。 +

+
+

+temp_limit TEMPERATURE_CELSIUS +

+

許容される最大ディスク温度を摂氏で設定します。指定されている場合、 +SnapRAIDは smartctl ツールを使用してすべてのディスクの温度を定期的にチェックします。 +SnapRAIDが動作している間、現在のディスク温度が表示されます。 +いずれかのディスクがこの制限を超えると、すべての操作が停止し、ディスクは `temp_sleep` +オプションで定義された期間、スピンダウン(スタンバイ状態に移行)されます。 +スリープ期間後、操作は再開されますが、温度制限に再度達した場合は再び一時停止する +可能性があります。 +

操作中、SnapRAIDは各ディスクの加熱曲線も分析し、アクティビティが継続した場合に +達すると予想される長期的な安定温度を推定します。推定は、ディスク温度が4回上昇した +後にのみ実行され、信頼できる傾向を確立するのに十分なデータポイントが利用可能であることを +保証します。 +この予測される安定温度は、現在の値の横に括弧で表示され、システムの冷却が +適切かどうかを評価するのに役立ちます。この推定温度は情報提供のみを目的としており、 +SnapRAIDの動作には影響しません。プログラムの動作は、実際の測定されたディスク温度にのみ +基づいています。 +

この分析を実行するために、SnapRAIDはシステム温度の参照が必要です。 +まず、利用可能なハードウェアセンサーから読み取ろうとします。システムセンサーに +アクセスできない場合は、実行開始時に測定された最も低いディスク温度をフォールバック参照として +使用します。 +

通常、SnapRAIDは最も熱いディスクの温度のみを表示します。 +すべてのディスクの温度を表示するには、-A または --stats オプションを使用します。 +

+
+

+temp_sleep TIME_IN_MINUTES +

+

温度制限に達したときのスタンバイ時間(分単位)を設定します。この期間中、ディスクは +スピンダウンしたままです。デフォルトは5分です。 +

+
+

+pool DIR +

+

`pool` コマンドを使用してディスクアレイの仮想ビューが作成されるプーリングディレクトリを +定義します。 +

ディレクトリは既に存在している必要があります。 +

+
+

+share UNC_DIR +

+

ディスクにリモートでアクセスするために必要なWindows UNCパスを定義します。 +

このオプションが指定されている場合、プールディレクトリに作成されたシンボリックリンクは、 +ディスクにアクセスするためにこのUNCパスを使用します。 +このオプションがない場合、生成されたシンボリックリンクはローカルパスのみを使用し、 +プールディレクトリをネットワーク経由で共有することはできません。 +

シンボリックリンクは、指定されたUNCパスを使用して形成され、`data` オプションで +指定されたディスク名を追加し、最後にファイルのディレクトリと名前を追加します。 +

このオプションはWindowsでのみ必要です。 +

+
+

+smartctl DISK/PARITY OPTIONS... +

+

各ディスクのSMART属性を取得するためのカスタムsmartctlオプションを定義します。 +これは、RAIDコントローラーや一部のUSBディスクが自動検出できない場合に必要になる +ことがあります。`%s` プレースホルダーはデバイス名に置き換えられますが、 +RAIDコントローラーなどの固定デバイスではオプションです。 +

DISK は `data` オプションで指定されたのと同じディスク名です。 +PARITY はパリティ名のいずれかです:`parity`、`2-parity`、`3-parity`、 +`4-parity`、`5-parity`、`6-parity`、または `z-parity`。 +

指定された OPTIONS で、`%s` 文字列はデバイス名に置き換えられます。 +RAIDコントローラーの場合、デバイスは固定されている可能性が高いため、 +`%s` を使用する必要はないかもしれません。 +

使用可能なオプションについては、smartmontoolsのドキュメントを参照してください。 +

+https://www.smartmontools.org/wiki/Supported_RAID-Controllers
+https://www.smartmontools.org/wiki/Supported_USB-Devices
+
+

例: +

+smartctl parity -d sat %s
+
+
+
+

+smartignore DISK/PARITY ATTR [ATTR...] +

+

ディスク障害の確率を計算するときに、指定されたSMART属性を無視します。 +このオプションは、ディスクが特定の属性について異常な値または誤解を招く値を報告する場合に +役立ちます。 +

DISK は `data` オプションで指定されたのと同じディスク名です。 +PARITY はパリティ名のいずれかです:`parity`、`2-parity`、`3-parity`、 +`4-parity`、`5-parity`、`6-parity`、または `z-parity`。 +特殊な値 `*` は、すべてのディスクで属性を無視するために使用できます。 +

例として、すべてのディスクで `Current Pending Sector Count` 属性を無視するには: +

+smartignore * 197
+
+

最初のパリティディスクでのみ無視するには: +

+smartignore parity 197
+
+
+
+

+Examples +

+

Unixの一般的な構成の例は次のとおりです。 +

+parity /mnt/diskp/snapraid.parity
+content /mnt/diskp/snapraid.content
+content /var/snapraid/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+exclude /lost+found/
+exclude /tmp/
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/sg0
+smartctl 2-parity -d areca,2/1 /dev/sg0
+
+

Windowsの一般的な構成の例は次のとおりです。 +

+parity E:\snapraid.parity
+content E:\snapraid.content
+content C:\snapraid\snapraid.content
+data d1 G:\array\
+data d2 H:\array\
+data d3 I:\array\
+exclude Thumbs.db
+exclude \$RECYCLE.BIN
+exclude \System Volume Information
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/arcmsr0
+smartctl 2-parity -d areca,2/1 /dev/arcmsr0
+
+
+
+
+

+Pattern +

+

パターンは、含めるファイルまたは除外するファイルをフィルタリングするための柔軟な方法を +提供します。グロブ文字を使用することで、すべてのパスを手動でリストすることなく、 +特定のファイル名やディレクトリ構造全体に一致するルールを定義できます。 +

疑問符 `?` は、ディレクトリ区切り文字を除く任意の1文字に一致します。 +これにより、パターンを単一のディレクトリレベルに限定したまま、可変文字を +持つファイル名と一致させるのに役立ちます。 +

単一のアスタリスク `*` は任意の文字列に一致しますが、疑問符と同様に +ディレクトリの境界を越えることはありません。スラッシュで停止するため、 +単一のパスコンポーネント内での一致に適しています。これは、シェルの +グロブでおなじみの標準的なワイルドカードの動作です。 +

ダブルアスタリスク `**` はより強力で、ディレクトリ区切り文字を含む +任意の文字列に一致します。これにより、パターンが複数のディレクトリレベルを +またいで一致できるようになります。`**` がパターン内に直接埋め込まれている場合、 +周囲のリテラルテキストの間にあるスラッシュを含む0文字以上の文字に一致します。 +

`**` の最も重要な使い方は、特別な形式である `/**/` です。これは +0個以上の完全なディレクトリレベルに一致し、正確なパス構造を知らなくても、 +ディレクトリツリー内の任意の深さにあるファイルと一致させることができます。 +例えば、パターン `src/**/main.js` は `src/main.js`(ディレクトリを0個スキップ)、 +`src/ui/main.js`(1個スキップ)、`src/ui/components/main.js`(2個スキップ) +に一致します。 +

角括弧 `[]` を使用した文字クラスは、指定されたセットまたは範囲の +任意の1文字に一致します。他の単一文字パターンと同様に、 +ディレクトリ区切り文字には一致しません。クラスは範囲と、感嘆符を +使用した否定をサポートしています。 +

覚えておくべき根本的な違いは、`*`、`?`、および文字クラスはすべて +ディレクトリの境界を尊重し、単一のパスコンポーネント内でのみ一致するのに対し、 +`**` はディレクトリ区切り文字をまたいで一致できる唯一のパターンであるということです。 +

4つの異なる種類のパターンがあります。 +

+
+
+FILE +
+FILE という名前の任意のファイルを選択します。 +このパターンはファイルにのみ適用され、ディレクトリには適用されません。 +
+
+
+
+
+
+DIR/ +
+DIR という名前の任意のディレクトリとその中のすべてを選択します。 +このパターンはディレクトリにのみ適用され、ファイルには適用されません。 +
+
+
+
+
+
+/PATH/FILE +
+指定された正確なファイル パスを選択します。このパターンは +ファイルにのみ適用され、ディレクトリには適用されません。 +
+
+
+
+
+
+/PATH/DIR/ +
+指定された正確なディレクトリ パスとその中のすべてを選択します。 +このパターンはディレクトリにのみ適用され、ファイルには適用されません。 +
+
+
+
+
+
+/ で始まる絶対パスを指定する場合、それはローカルファイルシステムのルートディレクトリではなく、 +
+
+
+
+

**アレイのルートディレクトリ**に適用されます。 +

Windowsでは、フォワードスラッシュ / の代わりにバックスラッシュ \ を使用できます。 +Windowsシステムディレクトリ、ジャンクション、マウントポイント、およびその他のWindowsの +特殊ディレクトリはファイルとして扱われます。つまり、それらを除外するには、 +ディレクトリルールではなく**ファイルルール**を使用する必要があります。 +

ファイル名に '*'、'?'、'['、または ']' 文字が含まれている場合は、 +グロブ文字として解釈されないように**エスケープ**する必要があります。 +Unixではエスケープ文字は '\' です。Windowsでは '^' です。 +パターンがコマンドラインにある場合は、コマンドシェルによって解釈されるのを防ぐために、 +エスケープ文字を**2倍**にする必要があります。 +

構成ファイルでは、処理するファイルをフィルタリングするために異なる戦略を使用できます。 +最も簡単なアプローチは、**除外**したいすべてのファイルとディレクトリを削除するために、 +`exclude` ルールのみを使用することです。例: +

+# `*.unrecoverable` という名前の任意のファイルを除外
+exclude *.unrecoverable
+# ルートディレクトリ `/lost+found` を除外
+exclude /lost+found/
+# `tmp` という名前の任意のサブディレクトリを除外
+exclude tmp/
+
+

反対のアプローチは、`include` ルールのみを使用して、**処理したいファイルのみ**を +定義することです。例: +

+# 一部のディレクトリのみを含める
+include /movies/
+include /musics/
+include /pictures/
+
+

最後の方法としては、`exclude` と `include` ルールを混在させます。この場合、 +**ルールの順序が重要**です。前のルールは後のルールよりも優先されます。 +簡素化するために、すべての `exclude` ルールを最初にリストし、次にすべての `include` +ルールをリストできます。例: +

+# `*.unrecoverable` という名前の任意のファイルを除外
+exclude *.unrecoverable
+# `tmp` という名前の任意のサブディレクトリを除外
+exclude tmp/
+# 一部のディレクトリのみを含める
+include /movies/
+include /musics/
+include /pictures/
+
+

コマンドラインで -f オプションを使用する場合、`include` パターンのみを +使用できます。例: +

+# .mp3 ファイルのみをチェック。
+# Unixでは、シェルによるグロブ展開を防ぐために引用符を使用。
+snapraid -f "*.mp3" check
+
+

Unixでは、コマンドラインでグロブ文字を使用する場合、シェルがそれらを展開するのを +防ぐために引用符で囲む必要があります。 +

+
+

+Ignore File +

+

設定ファイルのグローバルルールに加えて、アレイ内の任意のディレクトリに +.snapraidignore ファイルを配置して、分散型の除外ルールを定義できます。 +

`.snapraidignore` で定義されたルールは、設定ファイルのルールの後に +適用されます。これは、それらがより高い優先度を持ち、グローバル設定で +以前に含まれていたファイルを除外するために使用できることを意味します。 +事実上、ローカルルールが一致する場合、グローバルな包含設定に関係なく、 +ファイルは除外されます。 +

`.snapraidignore` のパターンロジックはグローバル設定を反映していますが、 +パターンはそのファイルが配置されているディレクトリに固定されます: +

+
+
+FILE +
+このディレクトリまたはその下にある、FILE という名前の任意のファイルを +選択します。これは、グローバルパターンと同じグロッビングルールに従います。 +
+
+
+
+
+
+DIR/ +
+このディレクトリまたはその下にある、DIR という名前の任意のディレクトリと +その中のすべてを選択します。 +
+
+
+
+
+
+/PATH/FILE +
+`.snapraidignore` ファイルの場所を基準にして、指定された正確な +ファイルを選択します。 +
+
+
+
+
+
+/PATH/DIR/ +
+`.snapraidignore` ファイルの場所を基準にして、指定された正確な +ディレクトリとその中のすべてを選択します。 +
+
+
+

グローバル設定とは異なり、`.snapraidignore` ファイルは除外ルールのみを +サポートします。`include` パターンや否定 (!) は使用できません。 +

たとえば、`/mnt/disk1/projects/` に `.snapraidignore` がある場合: +

+# /mnt/disk1/projects/output.bin のみを除外
+/output.bin
+# projects/ 内の 'build' という名前のディレクトリをすべて除外
+build/
+# projects/ またはそのサブフォルダ内のすべての .tmp ファイルを除外
+*.tmp
+
+
+
+

+Content +

+

SnapRAIDは、ファイルの一覧とチェックサムをコンテンツファイルに保存します。 +

これはバイナリファイルであり、ディスクアレイに存在するすべてのファイルと、 +それらの整合性を検証するためのすべてのチェックサムを一覧表示します。 +

このファイルは `sync` および `scrub` コマンドによって読み書きされ、 +`fix`、`check`、および `status` コマンドによって読み取られます。 +

+
+

+Parity +

+

SnapRAIDは、アレイのパリティ情報をパリティファイルに保存します。 +

これらはバイナリファイルであり、`content` ファイルで定義されたすべてのブロックの +計算されたパリティが含まれています。 +

これらのファイルは `sync` および `fix` コマンドによって読み書きされ、 +`scrub` および `check` コマンドによって**読み取られるだけ**です。 +

+
+

+Encoding +

+

UnixのSnapRAIDは、エンコーディングを無視します。ファイルシステムで使用されている +のと同じエンコーディングでファイル名を読み取り、保存します。 +

Windowsでは、ファイルシステムから読み取られたすべての名前はUTF-8形式に変換され、 +処理されます。 +

ファイル名を正しく出力するには、`chcp 65001` コマンドでWindowsコンソールをUTF-8モードに設定し、 +コンソールフォントとして `Lucida Console` などのTrueTypeフォントを**使用する**必要があります。 +これは出力されるファイル名にのみ影響します。コンソール出力をファイルにリダイレクトする場合、 +結果のファイルは常にUTF-8形式になります。 +

+ + +
+
+
+ + + + + + + diff --git a/beta/manual-ko.html b/beta/manual-ko.html new file mode 100644 index 00000000..1baec749 --- /dev/null +++ b/beta/manual-ko.html @@ -0,0 +1,1973 @@ + + + + + + + + SnapRAID Manual + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + +
+ +
+ +
+

+Synopsis +

+
+snapraid [-c, --conf CONFIG]
+    [-f, --filter PATTERN] [-d, --filter-disk NAME]
+    [-m, --filter-missing] [-e, --filter-error]
+    [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR]
+    [-p, --plan PERC|bad|new|full]
+    [-o, --older-than DAYS] [-l, --log FILE]
+    [-s, --spin-down-on-error] [-w, --bw-limit RATE]
+    [-Z, --force-zero] [-E, --force-empty]
+    [-U, --force-uuid] [-D, --force-device]
+    [-N, --force-nocopy] [-F, --force-full]
+    [-R, --force-realloc]
+    [-S, --start BLKSTART] [-B, --count BLKCOUNT]
+    [-L, --error-limit NUMBER]
+    [-A, --stats]
+    [-v, --verbose] [-q, --quiet]
+    status|smart|probe|up|down|diff|sync|scrub|fix|check
+    |list|dup|pool|devices|touch|rehash
+
+
+snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT]
+
+
+
+

+Description +

+

SnapRAID는 디스크 어레이를 위해 설계된 백업 프로그램으로, +최대 6개의 디스크 오류가 발생해도 데이터를 복구하기 위한 +패리티 정보를 저장합니다. +

주로 크고 자주 변경되지 않는 파일을 가진 홈 미디어 센터를 +위해 고안된 SnapRAID는 다음과 같은 몇 가지 기능을 제공합니다: +

    +
  • +파일을 다시 포맷할 필요 없이 이미 파일로 채워진 디스크를 +활용할 수 있으며, 평소처럼 액세스할 수 있습니다. +
  • +
  • +데이터 무결성을 보장하고 무단 손상을 방지하기 위해 모든 데이터가 +해시됩니다. +
  • +
  • +실패한 디스크의 수가 패리티 수를 초과하는 경우, 데이터 손실은 +영향을 받은 디스크로 제한되며, 다른 디스크의 데이터는 +계속 액세스할 수 있습니다. +
  • +
  • +실수로 디스크의 파일을 삭제한 경우에도 복구가 가능합니다. +
  • +
  • +디스크는 서로 다른 크기를 가질 수 있습니다. +
  • +
  • +언제든지 디스크를 추가할 수 있습니다. +
  • +
  • +SnapRAID는 데이터를 가두지 않습니다. 언제든지 포맷하거나 데이터를 +이동할 필요 없이 사용을 중단할 수 있습니다. +
  • +
  • +파일에 액세스하려면 단일 디스크만 회전하면 되므로, 전력을 절약하고 +소음을 줄일 수 있습니다. +
  • +
+

더 자세한 정보는 공식 SnapRAID 사이트를 방문하십시오: +

+https://www.snapraid.it/
+
+
+
+

+Limitations +

+

SnapRAID는 RAID와 백업 프로그램의 하이브리드로, 두 가지의 장점을 +결합하는 것을 목표로 합니다. 하지만, 사용 전에 고려해야 할 몇 가지 +제한 사항이 있습니다. +

주요 제한 사항은 디스크가 실패하고 최근에 동기화(sync)하지 않은 경우, +완전히 복구하지 못할 수 있다는 것입니다. +더 구체적으로, 마지막 동기화 작업 이후 변경되거나 삭제된 파일의 +크기만큼 복구가 불가능할 수 있습니다. +이는 변경되거나 삭제된 파일이 실패한 디스크에 있지 않더라도 발생합니다. +이것이 SnapRAID가 **거의 변경되지 않는 데이터**에 더 적합한 이유입니다. +

반면에, 새로 추가된 파일은 이미 존재하는 파일의 복구를 방해하지 않습니다. +새로 추가된 파일이 실패한 디스크에 있는 경우에만 해당 파일을 잃게 됩니다. +

기타 SnapRAID 제한 사항은 다음과 같습니다: +

    +
  • +SnapRAID를 사용하면 여전히 각 디스크에 대해 별도의 파일 시스템이 +있습니다. RAID를 사용하면 하나의 큰 파일 시스템을 얻습니다. +
  • +
  • +SnapRAID는 데이터를 스트라이핑하지 않습니다. +RAID를 사용하면 스트라이핑으로 속도 향상을 얻습니다. +
  • +
  • +SnapRAID는 실시간 복구를 지원하지 않습니다. +RAID를 사용하면 디스크가 실패했을 때 작업을 멈출 필요가 없습니다. +
  • +
  • +SnapRAID는 제한된 수의 디스크 오류에서만 데이터를 복구할 수 있습니다. +백업을 사용하면 전체 디스크 어레이의 완전한 오류로부터 +복구할 수 있습니다. +
  • +
  • +파일 이름, 타임스탬프, 심볼릭 링크, 하드 링크만 저장됩니다. +권한, 소유권, 확장 속성은 저장되지 않습니다. +
  • +
+
+
+

+Getting Started +

+

SnapRAID를 사용하려면, 먼저 디스크 어레이에서 하나의 디스크를 +`parity`(패리티) 정보 전용으로 선택해야 합니다. 하나의 패리티 디스크로 +RAID5와 유사하게 단일 디스크 오류로부터 복구할 수 있습니다. +

RAID6와 유사하게 더 많은 디스크 오류로부터 복구하려면, +추가 디스크를 패리티용으로 예약해야 합니다. 추가 패리티 디스크 +하나당 하나의 디스크 오류에 대한 복구를 더 허용합니다. +

패리티 디스크로는 어레이에서 가장 큰 디스크를 선택해야 합니다. +패리티 정보가 어레이에서 가장 큰 **데이터 디스크**의 크기만큼 +커질 수 있기 때문입니다. +

이 디스크들은 `parity` 파일을 저장하는 데 전념하게 됩니다. +여기에 데이터를 저장해서는 안 됩니다. +

다음으로, SnapRAID로 보호하려는 `data`(데이터) 디스크를 정의해야 합니다. +이 디스크들이 **거의 변경되지 않는 데이터**를 포함할 때 보호 효과가 +더 좋습니다. 이러한 이유로, Windows C:\ 디스크나 Unix의 /home, /var, +/tmp 디렉토리를 포함하지 않는 것이 좋습니다. +

파일 목록은 `content` 파일에 저장되며, 보통 데이터, 패리티, 또는 부트 +디스크에 저장됩니다. +이 파일에는 무결성을 확인하기 위한 모든 체크섬을 포함하여 +백업에 대한 세부 정보가 들어 있습니다. +`content` 파일은 여러 복사본으로 저장되며, 다중 디스크 오류의 경우에도 +적어도 하나의 복사본을 사용할 수 있도록 각 복사본은 서로 다른 디스크에 +있어야 합니다. +

예를 들어, 하나의 패리티 보호 수준만 원하고 디스크가 다음과 같이 +위치한다고 가정해 봅시다: +

+/mnt/diskp <- 패리티용으로 선택된 디스크
+/mnt/disk1 <- 보호할 첫 번째 디스크
+/mnt/disk2 <- 보호할 두 번째 디스크
+/mnt/disk3 <- 보호할 세 번째 디스크
+
+

다음 옵션으로 설정 파일 /etc/snapraid.conf를 생성해야 합니다: +

+parity /mnt/diskp/snapraid.parity
+content /var/snapraid/snapraid.content
+content /mnt/disk1/snapraid.content
+content /mnt/disk2/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+
+

Windows를 사용하는 경우, 슬래시 대신 드라이브 문자 및 백슬래시를 사용하는 +Windows 경로 형식을 사용해야 합니다. +

+parity E:\snapraid.parity
+content C:\snapraid\snapraid.content
+content F:\array\snapraid.content
+content G:\array\snapraid.content
+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+
+

디스크가 많아 드라이브 문자가 부족한 경우, 디스크를 하위 폴더에 +직접 마운트할 수 있습니다. 다음을 참조하십시오: +

+https://www.google.com/search?q=Windows+mount+point
+
+

이 시점에서, 패리티 정보를 빌드하기 위해 `sync` 명령을 실행할 +준비가 되었습니다. +

+snapraid sync
+
+

이 프로세스는 디스크에 이미 존재하는 데이터의 크기에 따라 첫 실행 시 +몇 시간이 걸릴 수 있습니다. 디스크가 비어 있으면 프로세스는 즉시 +완료됩니다. +

Ctrl+C를 눌러 언제든지 중지할 수 있으며, 다음 실행 시 중단된 +곳에서 재개됩니다. +

이 명령이 완료되면 데이터는 **SAFE**합니다. +

이제 어레이를 원하는 대로 사용하고 주기적으로 `sync` 명령을 +실행하여 패리티 정보를 업데이트할 수 있습니다. +

+

+Scrubbing +

+

주기적으로 데이터 및 패리티의 오류를 확인하려면 `scrub` 명령을 +실행할 수 있습니다. +

+snapraid scrub
+
+

이 명령은 데이터 무결성을 확인하기 위해 어레이의 데이터를 `sync` 명령 +중에 계산된 해시와 비교합니다. +

이 명령을 실행할 때마다 이전에 10일 이내에 스크럽된 데이터를 제외하고 +어레이의 약 8%를 확인합니다. +다른 양을 지정하려면 -p, --plan 옵션을 사용하고, 다른 일령(days)을 +지정하려면 -o, --older-than 옵션을 사용할 수 있습니다. +예를 들어, 20일보다 오래된 블록에 대해 어레이의 5%를 확인하려면 +다음과 같이 사용합니다: +

+snapraid -p 5 -o 20 scrub
+
+

이 프로세스 중에 무단 또는 입출력 오류가 발견되면, 해당 블록은 +`content` 파일에 bad로 표시되며 `status` 명령에 나열됩니다. +

+snapraid status
+
+

이들을 수정하려면 -e, --filter-error 옵션으로 bad 블록을 필터링하여 +`fix` 명령을 사용할 수 있습니다. +

+snapraid -e fix
+
+

다음 `scrub` 시에 오류가 실제로 수정되면 `status` 보고서에서 +사라집니다. 더 빠르게 하려면, `-p bad`를 사용하여 bad로 표시된 블록만 +스크럽할 수 있습니다. +

+snapraid -p bad scrub
+
+

동기화되지 않은 어레이에서 `scrub`을 실행하면 제거되거나 수정된 파일로 +인한 오류가 보고될 수 있습니다. 이러한 오류는 `scrub` 출력에는 +보고되지만, 관련 블록은 bad로 표시되지 않습니다. +

+
+

+Pooling +

+

참고: 아래에 설명된 풀링(pooling) 기능은 **mergefs** 도구로 대체되었으며, +이는 SnapRAID 커뮤니티에서 Linux 사용자를 위한 권장 옵션입니다. +Mergefs는 여러 드라이브를 단일 통합 마운트 지점으로 풀링하는 더 유연하고 +효율적인 방법을 제공하여, 심볼릭 링크에 의존하지 않고 어레이 전체의 +파일에 대한 원활한 액세스를 허용합니다. 이는 패리티 보호를 위한 +SnapRAID와 잘 통합되며, OpenMediaVault (OMV) 또는 사용자 정의 NAS +구성과 같은 설정에서 흔히 사용됩니다. +

어레이의 모든 파일을 동일한 디렉토리 트리에 표시하려면, +`pooling` 기능을 활성화할 수 있습니다. 이 기능은 심볼릭 링크를 사용하여 +어레이의 모든 파일에 대한 읽기 전용 가상 뷰를 생성합니다. +

설정 파일에서 `pooling` 디렉토리를 다음과 같이 구성할 수 있습니다: +

+pool /pool
+
+

또는 Windows에서 다음과 같이 합니다: +

+pool C:\pool
+
+

그리고 나서 `pool` 명령을 실행하여 가상 뷰를 생성하거나 업데이트합니다. +

+snapraid pool
+
+

Unix 플랫폼을 사용하고 이 디렉토리를 Windows 또는 Unix 컴퓨터에 +네트워크를 통해 공유하려면, /etc/samba/smb.conf에 다음 옵션을 +추가해야 합니다: +

+# smb.conf의 global 섹션에서
+unix extensions = no
+
+
+# smb.conf의 share 섹션에서
+[pool]
+comment = Pool
+path = /pool
+read only = yes
+guest ok = yes
+wide links = yes
+follow symlinks = yes
+
+

Windows에서 네트워크를 통해 심볼릭 링크를 공유하려면 클라이언트가 +원격으로 이들을 해석해야 합니다. 이를 활성화하기 위해, 풀 디렉토리를 +공유하는 것 외에도, 설정 파일에 정의된 디스크 이름을 공유 지점으로 +사용하여 모든 디스크를 독립적으로 공유해야 합니다. 또한 설정 파일의 +`share` 옵션에서 원격 클라이언트가 이러한 공유 디스크에 액세스하는 데 +필요한 Windows UNC 경로를 지정해야 합니다. +

예를 들어, `darkstar`라는 서버에서 작업하는 경우, 다음 옵션을 +사용할 수 있습니다: +

+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+pool C:\pool
+share \\darkstar
+
+

그리고 네트워크를 통해 다음 디렉토리를 공유합니다: +

+\\darkstar\pool -> C:\pool
+\\darkstar\d1 -> F:\array
+\\darkstar\d2 -> G:\array
+\\darkstar\d3 -> H:\array
+
+

이렇게 하면 원격 클라이언트가 \\darkstar\pool에서 모든 파일에 액세스할 +수 있습니다. +

또한 다음 명령으로 원격 클라이언트를 구성하여 원격 심볼릭 링크에 +대한 액세스를 활성화해야 할 수도 있습니다: +

+fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
+
+
+
+

+Undeleting +

+

SnapRAID는 RAID 시스템보다는 백업 프로그램처럼 작동하며, +-f, --filter 옵션을 사용하여 파일이나 디렉토리를 이전 상태로 복원하거나 +삭제 취소할 수 있습니다: +

+snapraid fix -f FILE
+
+

또는 디렉토리에 대해: +

+snapraid fix -f DIR/
+
+

또한 -m, --filter-missing 옵션을 사용하여 디렉토리 내에서 실수로 +삭제된 파일만 복구할 수도 있습니다. 이 옵션은 누락된 파일만 복원하고 +다른 파일은 그대로 둡니다. +

+snapraid fix -m -f DIR/
+
+

또는 모든 드라이브에서 삭제된 모든 파일을 다음으로 복구합니다: +

+snapraid fix -m
+
+
+
+

+Recovering +

+

최악의 상황이 발생하여 하나 이상의 디스크를 잃었습니다! +

**패닉하지 마십시오!** 복구할 수 있습니다! +

가장 먼저 해야 할 일은 디스크 어레이에 대한 추가 변경을 피하는 것입니다. +모든 원격 연결과 SnapRAID 야간 동기화 또는 스크럽을 포함한 모든 예약된 +프로세스를 비활성화하십시오. +

그런 다음 다음 단계를 진행하십시오. +

+

+STEP 1 -> Reconfigure +

+

복구할 공간이 필요하며, 이상적으로는 추가 예비 디스크에, +하지만 외부 USB 디스크 또는 원격 디스크로도 충분합니다. +

SnapRAID 설정 파일을 수정하여 실패한 디스크의 `data` 또는 `parity` +옵션이 파일을 복구할 수 있는 충분한 빈 공간이 있는 위치를 +가리키도록 합니다. +

예를 들어, 디스크 `d1`이 실패한 경우, 다음에서 변경합니다: +

+data d1 /mnt/disk1/
+
+

다음으로: +

+data d1 /mnt/new_spare_disk/
+
+

복구할 디스크가 패리티 디스크인 경우, 적절한 `parity` 옵션을 +업데이트합니다. +여러 개의 실패한 디스크가 있는 경우, 모든 구성 옵션을 업데이트합니다. +

+
+

+STEP 2 -> Fix +

+

로그를 외부 파일에 저장하면서 fix 명령을 실행합니다: +

+snapraid -d NAME -l fix.log fix
+
+

여기서 NAME은 이전 예제의 `d1`과 같은 디스크 이름입니다. +복구할 디스크가 패리티 디스크인 경우, `parity`, `2-parity` 등의 이름을 +사용합니다. +여러 개의 실패한 디스크가 있는 경우, 여러 -d 옵션을 사용하여 +모두 지정합니다. +

이 명령은 오랜 시간이 걸립니다. +

fix.log 파일을 저장할 몇 기가바이트의 여유 공간이 있는지 확인하십시오. +충분한 여유 공간이 있는 디스크에서 실행하십시오. +

이제 복구할 수 있는 모든 것을 복구했습니다. 일부 파일이 부분적으로 +또는 완전히 복구 불가능한 경우, `.unrecoverable` 확장자가 추가되어 +이름이 변경됩니다. +

`unrecoverable:`로 시작하는 모든 줄을 확인하여 fix.log 파일에서 +복구 불가능한 모든 블록의 자세한 목록을 찾을 수 있습니다. +

복구가 만족스럽지 않으면, 원하는 만큼 여러 번 재시도할 수 있습니다. +

예를 들어, 마지막 `sync` 이후 어레이에서 파일을 제거한 경우, +일부 파일이 복구되지 않을 수 있습니다. +이 경우, -i, --import 옵션을 사용하여 `fix`를 재시도하고, +이 파일들이 현재 어디에 있는지 지정하여 복구 프로세스에 다시 포함시킬 +수 있습니다. +

복구가 만족스럽다면 계속 진행할 수 있지만, 동기화 후에는 `fix` 명령을 +더 이상 재시도할 수 없다는 점에 유의하십시오! +

+
+

+STEP 3 -> Check +

+

조심스러운 확인으로, 이제 `check` 명령을 실행하여 복구된 디스크의 +모든 것이 올바른지 확인할 수 있습니다. +

+snapraid -d NAME -a check
+
+

여기서 NAME은 이전 예제의 `d1`과 같은 디스크 이름입니다. +

+
+
+-d 및 -a 옵션은 SnapRAID에게 지정된 디스크만 확인하고 모든 패리티 +
+
+
+
+

데이터를 무시하도록 지시합니다. +

이 명령은 오랜 시간이 걸리지만, 지나치게 조심스럽지 않다면 건너뛸 수 +있습니다. +

+
+

+STEP 4 -> Sync +

+

`sync` 명령을 실행하여 새 디스크로 어레이를 재동기화합니다. +

+snapraid sync
+
+

모든 것이 복구되면 이 명령은 즉시 완료됩니다. +

+
+
+
+

+Commands +

+

SnapRAID는 다음을 허용하는 몇 가지 간단한 명령을 제공합니다: +

    +
  • +어레이의 상태 출력 -> `status` +
  • +
  • +디스크 제어 -> `smart`, `probe`, `up`, `down` +
  • +
  • +백업/스냅샷 생성 -> `sync` +
  • +
  • +주기적으로 데이터 확인 -> `scrub` +
  • +
  • +마지막 백업/스냅샷 복원 -> `fix`. +
  • +
+

명령은 소문자로 작성해야 합니다. +

+

+status +

+

디스크 어레이의 상태 요약을 출력합니다. +

패리티 단편화, 확인 없이 블록이 얼마나 오래되었는지, 그리고 +스크럽 중에 발생한 모든 기록된 무단 오류에 대한 정보를 포함합니다. +

제시된 정보는 마지막으로 `sync`를 실행했을 때를 나타냅니다. +나중에 수정된 내용은 고려되지 않습니다. +

bad 블록이 감지되면 해당 블록 번호가 나열됩니다. +이들을 수정하려면 `fix -e` 명령을 사용할 수 있습니다. +

또한 각 블록이 마지막으로 스크럽되거나 동기화된 시간을 나타내는 +그래프를 보여줍니다. 스크럽된 블록은 '*', 동기화되었지만 아직 +스크럽되지 않은 블록은 'o'로 표시됩니다. +

아무것도 수정되지 않습니다. +

+
+

+smart +

+

시스템의 모든 디스크에 대한 SMART 보고서를 출력합니다. +

향후 1년 동안의 실패 확률 추정치를 포함하여, 의심스러운 속성을 +보이는 디스크의 유지 보수 교체를 계획할 수 있습니다. +

이 확률 추정치는 다음에서 사용 가능한 Backblaze 데이터와 디스크의 +SMART 속성을 상호 연관시켜 얻습니다: +

+https://www.backblaze.com/hard-drive-test-data.html
+
+

SMART가 디스크가 실패하고 있다고 보고하면, 해당 디스크에 대해 +`FAIL` 또는 `PREFAIL`이 출력되며, SnapRAID는 오류를 반환하며 종료됩니다. +이 경우, 디스크의 즉각적인 교체가 강력히 권장됩니다. +

다른 가능한 상태 문자열은 다음과 같습니다: +

+
+
+logfail +
+과거에 일부 속성이 임계값보다 낮았습니다. +
+
+
+
+logerr +
+장치 오류 로그에 오류가 포함되어 있습니다. +
+
+
+
+selferr +
+장치 자체 테스트 로그에 오류가 포함되어 있습니다. +
+
+
+
+
+
+-v, --verbose 옵션이 지정되면, 더 깊은 통계 분석이 제공됩니다. +
+
+
+
+

이 분석은 더 많거나 적은 패리티가 필요한지 결정하는 데 도움이 될 수 있습니다. +

이 명령은 `smartctl` 도구를 사용하며, 모든 장치에서 `smartctl -a`를 +실행하는 것과 동일합니다. +

장치가 올바르게 자동 감지되지 않으면, 설정 파일에서 `smartctl` 옵션을 +사용하여 사용자 정의 명령을 지정할 수 있습니다. +

아무것도 수정되지 않습니다. +

+
+

+probe +

+

시스템의 모든 디스크의 POWER 상태를 출력합니다. +

`Standby`는 디스크가 회전하지 않음을 의미합니다. `Active`는 +디스크가 회전하고 있음을 의미합니다. +

이 명령은 `smartctl` 도구를 사용하며, 모든 장치에서 `smartctl -n standby -i`를 +실행하는 것과 동일합니다. +

장치가 올바르게 자동 감지되지 않으면, 설정 파일에서 `smartctl` 옵션을 +사용하여 사용자 정의 명령을 지정할 수 있습니다. +

아무것도 수정되지 않습니다. +

+
+

+up +

+

어레이의 모든 디스크를 회전시킵니다(spin up). +

+
+
+-d, --filter-disk 옵션을 사용하여 특정 디스크만 회전시킬 수 있습니다. +
+
+
+
+

모든 디스크를 동시에 회전시키려면 많은 전력이 필요합니다. +전원 공급 장치가 이를 지탱할 수 있는지 확인하십시오. +

아무것도 수정되지 않습니다. +

+
+

+down +

+

어레이의 모든 디스크를 회전 중지합니다(spin down). +

이 명령은 `smartctl` 도구를 사용하며, 모든 장치에서 `smartctl -s standby,now`를 +실행하는 것과 동일합니다. +

+
+
+-d, --filter-disk 옵션을 사용하여 특정 디스크만 회전 중지할 수 있습니다. +
+
+
+
+

오류 발생 시 자동으로 회전 중지하려면, 다른 명령과 함께 -s, --spin-down-on-error +옵션을 사용할 수 있습니다. 이는 오류 발생 시 수동으로 `down`을 실행하는 것과 +동일합니다. +

아무것도 수정되지 않습니다. +

+
+

+diff +

+

마지막 `sync` 이후 수정되어 패리티 데이터를 재계산해야 하는 모든 파일을 +나열합니다. +

이 명령은 파일 데이터를 확인하지 않고, 파일 타임스탬프, 크기 및 +아이노드(inode)만 확인합니다. +

모든 변경된 파일을 나열한 후, 다음과 같이 그룹화된 변경 사항 요약이 +제시됩니다: +

+
+
+equal +
+이전과 변경되지 않은 파일. +
+
+
+
+added +
+이전에 없던 추가된 파일. +
+
+
+
+removed +
+제거된 파일. +
+
+
+
+updated +
+크기 또는 타임스탬프가 다른 파일, 즉 수정된 파일. +
+
+
+
+moved +
+동일한 디스크의 다른 디렉토리로 이동된 파일. +이들은 이름, 크기, 타임스탬프 및 아이노드가 동일하지만 +디렉토리가 다른 것으로 식별됩니다. +
+
+
+
+copied +
+동일하거나 다른 디스크에 복사된 파일. 다른 디스크로 +실제로 이동된 경우 `removed`에도 포함된다는 점에 유의하십시오. +이들은 이름, 크기 및 타임스탬프가 동일한 것으로 식별됩니다. +하위 초 타임스탬프(sub-second timestamp)가 0인 경우, +이름뿐만 아니라 전체 경로가 일치해야 합니다. +
+
+
+
+restored +
+아이노드는 다르지만 이름, 크기 및 타임스탬프가 일치하는 파일. +이들은 일반적으로 삭제 후 복원된 파일입니다. +
+
+
+

`sync`가 필요한 경우, 프로세스 반환 코드는 기본 0 대신 2입니다. +반환 코드 1은 일반적인 오류 조건에 사용됩니다. +

아무것도 수정되지 않습니다. +

+
+

+sync +

+

패리티 정보를 업데이트합니다. 디스크 어레이의 모든 수정된 파일을 +읽고 해당 패리티 데이터를 업데이트합니다. +

이미 수행된 작업을 잃지 않고 Ctrl+C를 눌러 언제든지 이 프로세스를 +중지할 수 있습니다. +다음 실행 시 `sync` 프로세스는 중단된 곳에서 재개됩니다. +

이 프로세스 중에 무단 또는 입출력 오류가 발견되면, +해당 블록은 bad로 표시됩니다. +

파일은 경로 및/또는 아이노드로 식별되며 크기와 타임스탬프로 +확인됩니다. +파일 크기 또는 타임스탬프가 다르면 전체 파일에 대해 패리티 데이터가 +재계산됩니다. +파일이 동일한 디스크에서 이동되거나 이름이 변경되고 동일한 아이노드를 +유지하면 패리티는 재계산되지 않습니다. +파일이 다른 디스크로 이동되면 패리티는 재계산되지만, 이전에 계산된 +해시 정보는 유지됩니다. +

`content` 및 `parity` 파일은 필요한 경우 수정됩니다. +어레이의 파일은 수정되지 않습니다. +

+
+

+scrub +

+

어레이를 스크럽하여 데이터 및 패리티 디스크의 무단 또는 입출력 오류를 +확인합니다. +

각 호출은 이전에 10일 이내에 스크럽된 데이터를 제외하고 어레이의 +약 8%를 확인합니다. +이는 일주일에 한 번 스크럽하면 모든 데이터 비트가 적어도 3개월마다 +한 번씩 확인됨을 의미합니다. +

+
+
+-p, --plan 옵션을 사용하여 다른 스크럽 계획 또는 양을 정의할 수 있으며, +
+
+
+
+

다음 값을 허용합니다: +bad - bad로 표시된 블록 스크럽. +new - 동기화되었지만 아직 스크럽되지 않은 블록 스크럽. +full - 모든 것 스크럽. +0-100 - 지정된 비율의 블록 스크럽. +

백분율 양을 지정하면, -o, --older-than 옵션을 사용하여 블록이 +얼마나 오래되었는지 정의할 수도 있습니다. +가장 오래된 블록이 먼저 스크럽되어 최적의 확인을 보장합니다. +동기화되었지만 아직 스크럽되지 않은 블록만 스크럽하려면, +`-p new` 옵션을 사용하십시오. +

스크럽 상태의 세부 정보를 얻으려면 `status` 명령을 사용하십시오. +

발견된 모든 무단 또는 입출력 오류에 대해, 해당 블록은 `content` 파일에 +bad로 표시됩니다. +이러한 bad 블록은 `status`에 나열되며 `fix -e`로 수정할 수 있습니다. +수정 후, 다음 스크럽 시에 다시 확인되며, 수정된 것으로 발견되면 bad +표시는 제거됩니다. +bad 블록만 스크럽하려면 `scrub -p bad` 명령을 사용할 수 있습니다. +

동기화되지 않은 데이터로 인한 보고된 오류를 피하기 위해 동기화된 +어레이에서만 `scrub`을 실행하는 것이 좋습니다. 이러한 오류는 무단 +오류가 아닌 것으로 인식되며, 블록은 bad로 표시되지 않지만, +이러한 오류는 명령의 출력에 보고됩니다. +

`content` 파일은 각 블록의 마지막 확인 시간을 업데이트하고 bad 블록을 +표시하기 위해 수정됩니다. +`parity` 파일은 수정되지 않습니다. +어레이의 파일은 수정되지 않습니다. +

+
+

+fix +

+

모든 파일과 패리티 데이터를 수정합니다. +

모든 파일과 패리티 데이터는 마지막 `sync`에 저장된 스냅샷 +상태와 비교됩니다. +차이가 발견되면 저장된 스냅샷으로 되돌려집니다. +

**경고!** `fix` 명령은 오류와 의도적인 수정 사이를 구별하지 +않습니다. 파일 상태를 무조건 마지막 `sync`로 되돌립니다. +

다른 옵션이 지정되지 않으면 전체 어레이가 처리됩니다. +필터 옵션을 사용하여 처리할 파일 또는 디스크의 하위 집합을 선택하십시오. +

`sync` 및 `scrub` 중에 bad로 표시된 블록만 수정하려면, +-e, --filter-error 옵션을 사용하십시오. +다른 필터 옵션과 달리, 이 옵션은 최신 `sync` 이후 변경되지 않은 +파일에만 수정을 적용합니다. +

SnapRAID는 수정할 수 없는 모든 파일에 `.unrecoverable` 확장자를 +추가하여 이름을 변경합니다. +

수정하기 전에, 전체 어레이를 스캔하여 마지막 `sync` 이후 이동된 +파일을 찾습니다. +이 파일들은 이름과 디렉토리를 무시하고 타임스탬프로 식별되며, +필요한 경우 복구 프로세스에 사용됩니다. +일부 파일을 어레이 외부로 이동한 경우, -i, --import 옵션을 사용하여 +추가로 스캔할 디렉토리를 지정할 수 있습니다. +

파일은 아이노드가 아닌 경로로만 식별됩니다. +

`content` 파일은 수정되지 않습니다. +`parity` 파일은 필요한 경우 수정됩니다. +어레이의 파일은 필요한 경우 수정됩니다. +

+
+

+check +

+

모든 파일과 패리티 데이터를 확인합니다. +

`fix`처럼 작동하지만, 복구를 시뮬레이션할 뿐이며 어레이에 +어떤 변경 사항도 기록되지 않습니다. +

이 명령은 주로 복구 프로세스 후 또는 기타 특별한 조건에서와 같이 +수동 확인을 위한 것입니다. +주기적이고 예약된 확인을 위해서는 `scrub`을 사용하십시오. +

+
+
+-a, --audit-only 옵션을 사용하면 파일 데이터만 확인하고 +
+
+
+
+

패리티 데이터는 무시하여 실행 속도를 높일 수 있습니다. +

파일은 아이노드가 아닌 경로로만 식별됩니다. +

아무것도 수정되지 않습니다. +

+
+

+list +

+

마지막 `sync` 시점에 어레이에 포함된 모든 파일을 나열합니다. +

+
+
+-v 또는 --verbose를 사용하면 하위 초 시간도 표시됩니다. +
+
+
+
+

아무것도 수정되지 않습니다. +

+
+

+dup +

+

모든 중복 파일을 나열합니다. 두 파일의 해시가 일치하면 동일한 것으로 +간주됩니다. 파일 데이터는 읽지 않고, 미리 계산된 해시만 +사용됩니다. +

아무것도 수정되지 않습니다. +

+
+

+pool +

+

`pooling` 디렉토리에서 디스크 어레이의 모든 파일에 대한 가상 뷰를 +생성하거나 업데이트합니다. +

파일은 복사되지 않고 심볼릭 링크를 사용하여 연결됩니다. +

업데이트 시, 모든 기존 심볼릭 링크와 빈 하위 디렉토리는 삭제되고 +어레이의 새 뷰로 대체됩니다. 다른 일반 파일은 제자리에 남습니다. +

풀 디렉토리 외부에서는 아무것도 수정되지 않습니다. +

+
+

+devices +

+

어레이에서 사용되는 저수준(low-level) 장치를 출력합니다. +

이 명령은 어레이의 장치 연결을 표시하며, 주로 스크립트 인터페이스를 +위한 것입니다. +

처음 두 열은 저수준 장치 ID 및 경로입니다. +다음 두 열은 고수준(high-level) 장치 ID 및 경로입니다. +마지막 열은 어레이의 디스크 이름입니다. +

대부분의 경우, 어레이의 각 디스크에 대해 하나의 저수준 장치가 +있지만, 일부 더 복잡한 구성에서는 단일 어레이 디스크에 의해 사용되는 +여러 저수준 장치가 있을 수 있습니다. +

아무것도 수정되지 않습니다. +

+
+

+touch +

+

하위 초 타임스탬프가 0으로 설정된 모든 파일에 임의의 하위 초 타임스탬프를 +설정합니다. +

이는 타임스탬프를 거의 고유하게 만들어 가능한 중복을 줄이므로, +SnapRAID가 이동되거나 복사된 파일을 인식하는 능력을 향상시킵니다. +

더 구체적으로, 하위 초 타임스탬프가 0이 아닌 경우, 이동되거나 복사된 +파일은 이름, 크기 및 타임스탬프가 일치하면 그렇게 식별됩니다. +하위 초 타임스탬프가 0인 경우, 전체 경로, 크기 및 타임스탬프가 +모두 일치하는 경우에만 복사본으로 간주됩니다. +

초 단위 정밀도의 타임스탬프는 수정되지 않으므로, 파일의 모든 날짜와 +시간은 보존됩니다. +

+
+

+rehash +

+

전체 어레이의 재해시(rehash)를 예약합니다. +

이 명령은 사용되는 해시 종류를 변경하며, 일반적으로 32비트 시스템에서 +64비트 시스템으로 업그레이드할 때 MurmurHash3에서 더 빠른 SpookyHash로 +전환하기 위해 사용됩니다. +

이미 최적의 해시를 사용하고 있다면, 이 명령은 아무것도 하지 않고 +조치가 필요하지 않음을 알려줍니다. +

재해시는 즉시 수행되지 않고 `sync` 및 `scrub` 중에 점진적으로 +진행됩니다. +

`status`를 사용하여 재해시 상태를 확인할 수 있습니다. +

재해시 중에도 SnapRAID는 전체 기능을 유지하며, 유일한 예외는 +`dup`가 다른 해시를 사용하는 중복 파일을 감지할 수 없다는 것입니다. +

+
+
+

+Options +

+

SnapRAID는 다음 옵션을 제공합니다: +

+
+
+-c, --conf CONFIG +
+사용할 설정 파일을 선택합니다. 지정하지 않으면 Unix에서는 +`/usr/local/etc/snapraid.conf` 파일이 존재하면 사용하고, +그렇지 않으면 `/etc/snapraid.conf`를 사용합니다. +Windows에서는 `snapraid.exe`와 같은 디렉토리에 있는 +`snapraid.conf` 파일을 사용합니다. +
+
+
+
+
+
+-f, --filter PATTERN +
+`check` 및 `fix`에서 처리할 파일을 필터링합니다. +지정된 패턴과 일치하는 파일만 처리됩니다. +이 옵션은 여러 번 사용될 수 있습니다. +패턴 사양에 대한 자세한 내용은 PATTERN 섹션을 참조하십시오. +Unix에서는 글로빙 문자가 사용되는 경우 따옴표로 묶어야 합니다. +이 옵션은 `check` 및 `fix`에서만 사용할 수 있습니다. +`sync` 및 `scrub`은 항상 전체 어레이를 처리하므로 사용할 수 없습니다. +
+
+
+
+
+
+-d, --filter-disk NAME +
+`check`, `fix`, `up`, 및 `down`에서 처리할 디스크를 필터링합니다. +설정 파일에 정의된 디스크 이름을 지정해야 합니다. +또한 `parity`, `2-parity`, `3-parity` 등의 이름으로 패리티 디스크를 +지정하여 특정 패리티 디스크로 작업을 제한할 수 있습니다. +여러 --filter, --filter-disk, --filter-missing 옵션을 결합하면, +모든 필터와 일치하는 파일만 선택됩니다. +이 옵션은 여러 번 사용될 수 있습니다. +이 옵션은 `check`, `fix`, `up`, 및 `down`에서만 사용할 수 있습니다. +`sync` 및 `scrub`은 항상 전체 어레이를 처리하므로 사용할 수 없습니다. +
+
+
+
+
+
+-m, --filter-missing +
+`check` 및 `fix`에서 처리할 파일을 필터링합니다. +어레이에서 누락되거나 삭제된 파일만 처리됩니다. +`fix`와 함께 사용하면, 이 옵션은 `undelete` 명령 역할을 합니다. +여러 --filter, --filter-disk, --filter-missing 옵션을 결합하면, +모든 필터와 일치하는 파일만 선택됩니다. +이 옵션은 `check` 및 `fix`에서만 사용할 수 있습니다. +`sync` 및 `scrub`은 항상 전체 어레이를 처리하므로 사용할 수 없습니다. +
+
+
+
+
+
+-e, --filter-error +
+`check` 및 `fix`에서 오류가 있는 파일을 처리합니다. +`status`에 나열된 대로 `sync` 및 `scrub` 중에 무단 또는 입출력 오류가 +표시된 블록을 가진 파일만 처리합니다. +이 옵션은 `check` 및 `fix`에서만 사용할 수 있습니다. +
+
+
+
+
+
+-p, --plan PERC|bad|new|full +
+스크럽 계획을 선택합니다. PERC가 0에서 100 사이의 숫자 값인 경우, +스크럽할 블록의 백분율로 해석됩니다. +백분율 대신 계획을 지정할 수 있습니다: +`bad`는 bad 블록을 스크럽하고, `new`는 아직 스크럽되지 않은 +막 동기화된 블록을 스크럽하며, `full`은 모든 것을 스크럽합니다. +이 옵션은 `scrub`에서만 사용할 수 있습니다. +
+
+
+
+
+
+-o, --older-than DAYS +
+`scrub`에서 처리할 어레이의 가장 오래된 부분을 선택합니다. +DAYS는 블록이 스크럽되어야 하는 최소 일령(days)이며, +기본값은 10입니다. +bad로 표시된 블록은 이 옵션에 관계없이 항상 스크럽됩니다. +이 옵션은 `scrub`에서만 사용할 수 있습니다. +
+
+
+
+
+
+-a, --audit-only +
+`check`에서 패리티 데이터를 확인하지 않고 파일의 해시를 +확인합니다. +파일 데이터만 확인하는 데 관심이 있다면, 이 옵션은 확인 프로세스의 +속도를 상당히 높일 수 있습니다. +이 옵션은 `check`에서만 사용할 수 있습니다. +
+
+
+
+
+
+-h, --pre-hash +
+`sync`에서 패리티 계산 전에 추가 확인을 위해 모든 새 데이터에 대한 +예비 해시 단계를 실행합니다. +일반적으로 `sync`에서는 예비 해시가 수행되지 않으며, 새 데이터는 +패리티 계산 직전에 처음 읽을 때 해시됩니다. +이 프로세스는 모든 디스크가 회전하고 CPU가 바쁜, 시스템이 +과부하 상태일 때 발생합니다. +이는 기계의 극한 조건이며, 잠재된 하드웨어 문제가 있는 경우 +데이터가 아직 해시되지 않았기 때문에 무단 오류가 감지되지 않고 +지나갈 수 있습니다. +이러한 위험을 피하려면, `pre-hash` 모드를 활성화하여 모든 데이터를 +두 번 읽어 무결성을 보장할 수 있습니다. +이 옵션은 또한 어레이 내에서 이동된 파일을 확인하여 이동 작업이 +성공했는지 확인하고, 필요한 경우 계속 진행하기 전에 fix 작업을 +실행할 수 있도록 합니다. +이 옵션은 `sync`에서만 사용할 수 있습니다. +
+
+
+
+
+
+-i, --import DIR +
+지정된 디렉토리에서 마지막 `sync` 이후 어레이에서 삭제된 파일을 +가져옵니다. +이러한 파일이 여전히 있는 경우, 이들은 `check` 및 `fix`에 의해 +복구 프로세스를 개선하는 데 사용될 수 있습니다. +파일은 하위 디렉토리를 포함하여 읽히며, 이름에 관계없이 +식별됩니다. +이 옵션은 `check` 및 `fix`에서만 사용할 수 있습니다. +
+
+
+
+
+
+-s, --spin-down-on-error +
+오류 발생 시, 0이 아닌 상태 코드로 종료하기 전에 관리되는 모든 +디스크를 회전 중지합니다. 이는 중단된 작업 후에 드라이브가 계속 +활성 상태로 회전하는 것을 방지하여 불필요한 열 축적 및 전력 +소비를 방지하는 데 도움이 됩니다. 명령이 실패하더라도 디스크가 +안전하게 중지되도록 이 옵션을 사용하십시오. +
+
+
+
+
+
+-w, --bw-limit RATE +
+모든 디스크에 대한 전역 대역폭 제한을 적용합니다. RATE는 +초당 바이트 수입니다. K, M, 또는 G와 같은 승수(예: --bw-limit 1G)를 +지정할 수 있습니다. +
+
+
+
+
+
+-A, --stats +
+추가 정보를 보여주는 확장된 상태 보기를 활성화합니다. +화면에는 두 개의 그래프가 표시됩니다: +첫 번째 그래프는 각 디스크에 대한 버퍼링된 스트라이프 수와 함께 +해당 디스크에서 현재 액세스 중인 파일의 경로를 보여줍니다. +일반적으로 가장 느린 디스크는 사용 가능한 버퍼가 없으며, +이는 달성 가능한 최대 대역폭을 결정합니다. +두 번째 그래프는 지난 100초 동안 대기하는 데 소비된 시간의 +백분율을 보여줍니다. 가장 느린 디스크가 대부분의 대기 시간을 +유발할 것으로 예상되며, 다른 디스크는 버퍼링된 스트라이프를 +사용할 수 있으므로 대기 시간이 거의 또는 전혀 없어야 합니다. +이 그래프는 또한 해시 계산 및 RAID 계산을 위해 소비된 시간을 +보여줍니다. +모든 계산은 디스크 작업과 병렬로 실행됩니다. +따라서 적어도 하나의 디스크에 대해 측정 가능한 대기 시간이 +있는 한, 이는 CPU가 워크로드에 충분히 빠르다는 것을 나타냅니다. +
+
+
+
+
+
+-Z, --force-zero +
+이전에 0이 아니었던 크기가 0인 파일의 동기화라는 안전하지 않은 +작업을 강제합니다. +SnapRAID가 이러한 조건을 감지하면, 이 옵션을 지정하지 않는 한 +진행을 중지합니다. +이는 시스템 충돌 후 일부 액세스된 파일이 잘렸을 때 쉽게 감지할 +수 있도록 합니다. +이는 ext3/ext4 파일 시스템을 사용하는 Linux에서 가능한 조건입니다. +이 옵션은 `sync`에서만 사용할 수 있습니다. +
+
+
+
+
+
+-E, --force-empty +
+원래 디스크에 있던 모든 파일이 누락된 디스크의 동기화라는 +안전하지 않은 작업을 강제합니다. +SnapRAID가 디스크에 원래 있던 모든 파일이 누락되거나 다시 +작성되었음을 감지하면, 이 옵션을 지정하지 않는 한 진행을 +중지합니다. +이는 데이터 파일 시스템이 마운트되지 않았을 때 쉽게 감지할 +수 있도록 합니다. +이 옵션은 `sync`에서만 사용할 수 있습니다. +
+
+
+
+
+
+-U, --force-uuid +
+UUID가 변경된 디스크를 사용하여 동기화, 확인 및 수정을 강제하는 +안전하지 않은 작업입니다. +SnapRAID가 일부 디스크의 UUID가 변경되었음을 감지하면, +이 옵션을 지정하지 않는 한 진행을 중지합니다. +이는 디스크가 잘못된 마운트 지점에 마운트되었을 때 감지할 +수 있도록 합니다. +그러나 단일 패리티를 사용하는 경우 하나의 UUID 변경이 허용되며, +여러 패리티를 사용하는 경우 더 많은 변경이 허용됩니다. 이는 +복구 후 디스크를 교체할 때의 일반적인 경우이기 때문입니다. +이 옵션은 `sync`, `check`, 또는 `fix`에서만 사용할 수 있습니다. +
+
+
+
+
+
+-D, --force-device +
+액세스할 수 없는 디스크 또는 동일한 물리적 장치에 있는 디스크로 +수정을 강제하는 안전하지 않은 작업입니다. +예를 들어, 두 개의 데이터 디스크를 잃고 첫 번째 디스크만 +복구하기 위해 예비 디스크가 있는 경우, 두 번째 액세스할 수 없는 +디스크를 무시할 수 있습니다. +또는 이미 사용 중인 디스크에 남은 여유 공간에 디스크를 복구하려는 +경우, 동일한 물리적 장치를 공유합니다. +이 옵션은 `fix`에서만 사용할 수 있습니다. +
+
+
+
+
+
+-N, --force-nocopy +
+`sync`, `check`, 및 `fix`에서 복사 감지 발견법(heuristic)을 +비활성화합니다. +이 옵션이 없으면 SnapRAID는 이름, 크기 및 타임스탬프와 같은 +동일한 속성을 가진 파일이 동일한 데이터를 가진 복사본이라고 +가정합니다. +이는 한 디스크에서 다른 디스크로 복사되거나 이동된 파일을 +식별하고, 이미 계산된 해시 정보를 재사용하여 무단 오류를 +감지하거나 누락된 파일을 복구할 수 있도록 합니다. +일부 드문 경우에 이 동작은 오탐(false positives) 또는 많은 +해시 확인으로 인한 느린 프로세스를 초래할 수 있으며, 이 옵션을 +사용하면 이러한 문제를 해결할 수 있습니다. +이 옵션은 `sync`, `check`, 및 `fix`에서만 사용할 수 있습니다. +
+
+
+
+
+
+-F, --force-full +
+`sync`에서 패리티의 전체 재계산을 강제합니다. +이 옵션은 새 패리티 수준을 추가하거나, 더 최근의 패리티 데이터를 +사용하여 이전 content 파일로 되돌렸을 때 사용할 수 있습니다. +처음부터 패리티를 다시 생성하는 대신, 이 옵션을 사용하면 +content 파일에 있는 해시를 재사용하여 데이터를 검증하고 +기존 패리티 데이터를 사용하여 `sync` 프로세스 중에 데이터 보호를 +유지할 수 있습니다. +이 옵션은 `sync`에서만 사용할 수 있습니다. +
+
+
+
+
+
+-R, --force-realloc +
+`sync`에서 파일의 전체 재할당 및 패리티 재빌드를 강제합니다. +이 옵션은 content 파일에 있는 해시를 재사용하여 데이터를 +검증하면서 단편화를 제거하고 모든 파일을 완전히 재할당하는 데 +사용될 수 있습니다. +이 옵션은 `sync`에서만 사용할 수 있습니다. +**경고!** 이 옵션은 전문가 전용이며, 사용하지 않는 것이 +강력히 권장됩니다. +`sync` 작업 중에는 데이터 보호가 없습니다. +
+
+
+
+
+
+-l, --log FILE +
+지정된 파일에 자세한 로그를 기록합니다. +이 옵션을 지정하지 않으면 예상치 못한 오류가 화면에 출력되어, +많은 오류가 발생하는 경우 과도한 출력이 발생할 수 있습니다. +-l, --log가 지정되면 SnapRAID가 중지되는 치명적인 오류만 +화면에 출력됩니다. +경로가 '>>'로 시작하면 파일이 추가 모드로 열립니다. +이름의 '%D'와 '%T'는 YYYYMMDD 및 HHMMSS 형식의 날짜 및 +시간으로 대체됩니다. Windows 배치 파일에서는 '%' 문자를 +두 배로 늘려야 합니다(예: result-%%D.log). '>>'를 사용하려면 +이름을 따옴표로 묶어야 합니다(예: `">>result.log"`). +로그를 표준 출력 또는 표준 오류로 출력하려면 각각 `">&1"` 및 `">&2"`를 +사용할 수 있습니다. +로그 태그 설명은 snapraid_log.txt 파일 또는 man 페이지를 참조하십시오. +
+
+
+
+
+
+-L, --error-limit NUMBER +
+실행을 중지하기 전에 새로운 오류 제한을 설정합니다. +기본적으로 SnapRAID는 100개 이상의 입출력 오류가 발생하면 중지됩니다. +이는 디스크가 실패할 가능성이 있음을 나타냅니다. +이 옵션은 `sync` 및 `scrub`에 영향을 미치며, 첫 번째 디스크 오류 +세트 후에 계속 진행하여 작업을 완료하려고 시도할 수 있도록 +허용합니다. +그러나 `check` 및 `fix`는 항상 첫 번째 오류에서 중지됩니다. +
+
+
+
+
+
+-S, --start BLKSTART +
+지정된 블록 번호부터 처리를 시작합니다. +이는 손상된 디스크의 경우 특정 블록을 다시 확인하거나 수정하는 데 +유용할 수 있습니다. +이 옵션은 주로 고급 수동 복구를 위한 것입니다. +
+
+
+
+
+
+-B, --count BLKCOUNT +
+지정된 수의 블록만 처리합니다. +이 옵션은 주로 고급 수동 복구를 위한 것입니다. +
+
+
+
+
+
+-C, --gen-conf CONTENT +
+기존 content 파일에서 더미 설정 파일을 생성합니다. +설정 파일은 표준 출력으로 작성되며 기존 파일을 덮어쓰지 않습니다. +이 설정 파일에는 전체 시스템을 잃을 경우 디스크 마운트 지점을 +재구성하는 데 필요한 정보도 포함되어 있습니다. +
+
+
+
+
+
+-v, --verbose +
+화면에 더 많은 정보를 출력합니다. +한 번 지정하면 제외된 파일 및 추가 통계를 출력합니다. +이 옵션은 로그 파일에는 영향을 미치지 않습니다. +
+
+
+
+
+
+-q, --quiet +
+화면에 더 적은 정보를 출력합니다. +한 번 지정하면 진행률 표시줄을 제거하고, 두 번 지정하면 +실행 중인 작업을 제거하며, 세 번 지정하면 정보 메시지를 +제거하고, 네 번 지정하면 상태 메시지를 제거합니다. +치명적인 오류는 항상 화면에 출력됩니다. +이 옵션은 로그 파일에는 영향을 미치지 않습니다. +
+
+
+
+
+
+-H, --help +
+간단한 도움말 화면을 출력합니다. +
+
+
+
+
+
+-V, --version +
+프로그램 버전을 출력합니다. +
+
+
+
+
+

+Configuration +

+

SnapRAID는 디스크 어레이의 위치와 패리티 정보를 저장할 위치를 +알기 위해 설정 파일이 필요합니다. +

Unix에서는 `/usr/local/etc/snapraid.conf` 파일이 존재하면 사용하고, +그렇지 않으면 `/etc/snapraid.conf`를 사용합니다. +Windows에서는 `snapraid.exe`와 같은 디렉토리에 있는 +`snapraid.conf` 파일을 사용합니다. +

다음 옵션이 포함되어야 합니다(대소문자 구분): +

+

+parity FILE [,FILE] ... +

+

패리티 정보를 저장하는 데 사용할 파일을 정의합니다. +패리티는 RAID5와 유사하게 단일 디스크 오류로부터 보호를 +가능하게 합니다. +

여러 파일을 지정할 수 있으며, 이들은 서로 다른 디스크에 +있어야 합니다. +하나의 파일이 더 이상 커질 수 없을 때 다음 파일이 사용됩니다. +총 사용 가능한 공간은 어레이에서 가장 큰 데이터 디스크보다 +적어도 커야 합니다. +

나중에 추가 패리티 파일을 추가할 수 있지만, 순서를 바꾸거나 +제거할 수는 없습니다. +

패리티 디스크를 패리티용으로 예약하면 단편화되지 않아 성능이 +향상됩니다. +

Windows에서는 디스크가 가득 찼다는 경고를 피하기 위해 각 디스크에 +256MB가 사용되지 않은 채로 남습니다. +

이 옵션은 필수이며 한 번만 사용할 수 있습니다. +

+
+

+(2,3,4,5,6)-parity FILE [,FILE] ... +

+

추가 패리티 정보를 저장하는 데 사용할 파일을 정의합니다. +

지정된 각 패리티 수준에 대해 하나의 추가 보호 수준이 +활성화됩니다: +

    +
  • +2-parity는 RAID6 이중 패리티를 활성화합니다. +
  • +
  • +3-parity는 삼중 패리티를 활성화합니다. +
  • +
  • +4-parity는 쿼드(4중) 패리티를 활성화합니다. +
  • +
  • +5-parity는 펜타(5중) 패리티를 활성화합니다. +
  • +
  • +6-parity는 헥사(6중) 패리티를 활성화합니다. +
  • +
+

각 패리티 수준은 모든 이전 패리티 수준의 존재를 +필요로 합니다. +

`parity` 옵션과 동일한 고려 사항이 적용됩니다. +

이 옵션은 선택 사항이며 한 번만 사용할 수 있습니다. +

+
+

+z-parity FILE [,FILE] ... +

+

삼중 패리티를 저장하는 대체 파일 및 형식을 정의합니다. +

이 옵션은 '3-parity'의 대안이며, 주로 SSSE3 명령어 세트를 지원하지 +않는 ARM 또는 AMD Phenom, Athlon, Opteron과 같은 저가형 CPU를 +위한 것입니다. 이러한 경우 더 나은 성능을 제공합니다. +

이 형식은 ZFS RAIDZ3에서 사용되는 것과 유사하지만 더 빠릅니다. +ZFS와 마찬가지로 삼중 패리티 이상에서는 작동하지 않습니다. +

'3-parity'를 사용할 때 성능 향상을 위해 'z-parity' 형식을 사용하는 +것이 권장되는 경우 경고를 받게 됩니다. +

원하는 z-parity 또는 3-parity 파일로 설정 파일을 조정하고 +'fix'를 사용하여 다시 생성함으로써 한 형식에서 다른 형식으로 +변환할 수 있습니다. +

+
+

+content FILE +

+

디스크 어레이에 있는 모든 파일의 목록과 체크섬을 저장하는 데 사용할 +파일을 정의합니다. +

데이터, 패리티 또는 사용 가능한 다른 디스크에 배치할 수 있습니다. +데이터 디스크를 사용하는 경우, 이 파일은 `sync` 프로세스에서 +자동으로 제외됩니다. +

이 옵션은 필수이며 동일한 파일의 여러 복사본을 저장하기 위해 +여러 번 사용될 수 있습니다. +

사용된 각 패리티 디스크에 대해 최소한 하나의 복사본을 +저장해야 하며, 하나를 더 추가해야 합니다. 추가 복사본을 +사용해도 해롭지 않습니다. +

+
+

+data NAME DIR +

+

어레이의 데이터 디스크의 이름과 마운트 지점을 정의합니다. +NAME은 디스크를 식별하는 데 사용되며 고유해야 합니다. DIR은 +파일 시스템에서 디스크의 마운트 지점입니다. +

NAME을 고정된 상태로 유지하는 한, 필요에 따라 마운트 지점을 +변경할 수 있습니다. +

어레이의 각 데이터 디스크에 대해 하나의 옵션을 사용해야 합니다. +

나중에 설정 파일에서 직접 NAME을 변경하고 'sync' 명령을 +실행하여 디스크의 이름을 바꿀 수 있습니다. +이름 변경의 경우, 디스크의 저장된 UUID를 사용하여 연결됩니다. +

+
+

+nohidden +

+

모든 숨겨진 파일 및 디렉토리를 제외합니다. +Unix에서는 숨겨진 파일은 '.'으로 시작하는 파일입니다. +Windows에서는 숨김 속성을 가진 파일입니다. +

+
+

+exclude/include PATTERN +

+

sync 프로세스에서 제외하거나 포함할 파일 또는 디렉토리 패턴을 +정의합니다. +모든 패턴은 지정된 순서대로 처리됩니다. +

일치하는 첫 번째 패턴이 `exclude` 패턴이면 파일은 제외됩니다. +`include` 패턴이면 파일은 포함됩니다. +일치하는 패턴이 없으면, 지정된 마지막 패턴이 `include`이면 +파일은 제외되고, `exclude`이면 포함됩니다. +

패턴 사양에 대한 자세한 내용은 PATTERN 섹션을 참조하십시오. +

이 옵션은 여러 번 사용될 수 있습니다. +

+
+

+blocksize SIZE_IN_KIBIBYTES +

+

패리티의 기본 블록 크기를 키비바이트(kibibyte) 단위로 정의합니다. +1키비바이트는 1024바이트입니다. +

기본 블록 크기는 256이며, 대부분의 경우에 작동해야 합니다. +

**경고!** 이 옵션은 전문가 전용이며, 이 값을 변경하지 않는 것이 +강력히 권장됩니다. 나중에 이 값을 변경하려면 전체 패리티를 +다시 생성해야 합니다! +

다른 블록 크기를 사용하는 이유는 수백만 개의 작은 파일이 많은 +경우입니다. +

각 파일에 대해, 몇 바이트만 있어도 전체 패리티 블록이 할당되며, +파일이 많으면 상당한 미사용 패리티 공간이 발생할 수 있습니다. +패리티 디스크를 완전히 채우면 데이터 디스크에 더 이상 파일을 +추가할 수 없습니다. +그러나 낭비된 패리티는 데이터 디스크 전체에 걸쳐 축적되지 않습니다. +데이터 디스크의 많은 파일로 인해 발생하는 낭비된 공간은 다른 +데이터 디스크가 아닌 해당 데이터 디스크의 데이터 양만 제한합니다. +

대략적으로, 각 파일에 대해 블록 크기의 절반이 낭비된다고 가정할 수 +있습니다. 예를 들어, 100,000개의 파일과 256KiB 블록 크기로 +12.8GB의 패리티가 낭비되며, 이는 데이터 디스크에서 12.8GB의 사용 가능한 +공간이 줄어들 수 있음을 의미합니다. +

`status`를 사용하여 각 디스크의 낭비된 공간의 양을 확인할 수 있습니다. +이는 데이터 디스크에 비워 두거나 어레이에 포함되지 않은 파일에 +사용해야 하는 공간의 양입니다. +이 값이 음수이면 패리티를 거의 채우고 있음을 의미하며, 여전히 +낭비할 수 있는 공간을 나타냅니다. +

이 문제를 피하려면 패리티에 대해 더 큰 파티션을 사용할 수 있습니다. +예를 들어, 패리티 파티션이 데이터 디스크보다 12.8GB 더 큰 경우, +각 데이터 디스크에 최대 100,000개의 파일을 낭비되는 공간 없이 +처리할 수 있는 충분한 추가 공간이 있습니다. +

Linux에서 더 큰 패리티 파티션을 얻는 트릭은 다음 명령으로 포맷하는 +것입니다: +

+mkfs.ext4 -m 0 -T largefile4 DEVICE
+
+

이로 인해 약 1.5%의 추가 공간이 발생하며, 4TB 디스크의 경우 약 60GB로, +낭비되는 공간 없이 각 데이터 디스크에 약 460,000개의 파일을 +허용합니다. +

+
+

+hashsize SIZE_IN_BYTES +

+

저장된 블록의 해시 크기를 바이트 단위로 정의합니다. +

기본 해시 크기는 16바이트(128비트)이며, 대부분의 경우에 작동해야 합니다. +

**경고!** 이 옵션은 전문가 전용이며, 이 값을 변경하지 않는 것이 +강력히 권장됩니다. 나중에 이 값을 변경하려면 전체 패리티를 +다시 생성해야 합니다! +

다른 해시 크기를 사용하는 이유는 시스템의 메모리가 제한적인 경우입니다. +경험상 SnapRAID는 어레이의 16TB 데이터당 일반적으로 1GiB의 RAM을 +필요로 합니다. +

구체적으로, 데이터의 해시를 저장하기 위해 SnapRAID는 대략 +TS*(1+HS)/BS 바이트의 RAM을 필요로 합니다. +여기서 TS는 디스크 어레이의 총 크기(바이트), BS는 블록 크기(바이트), +HS는 해시 크기(바이트)입니다. +

예를 들어, 4TB 디스크 8개, 블록 크기 256KiB +(1KiB = 1024바이트), 해시 크기 16인 경우 다음과 같습니다: +

+RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB
+
+

해시 크기를 8로 전환하면 다음과 같습니다: +

+RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB
+
+

블록 크기를 512로 전환하면 다음과 같습니다: +

+RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB
+
+

해시 크기를 8로, 블록 크기를 512로 모두 전환하면 다음과 같습니다: +

+RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB
+
+
+
+

+autosave SIZE_IN_GIGABYTES +

+

지정된 GB 양이 처리된 후 동기화 또는 스크럽 시 상태를 자동으로 저장합니다. +이 옵션은 기계 충돌 또는 기타 이벤트로 인해 중단된 경우 긴 `sync` +명령을 처음부터 다시 시작하는 것을 방지하는 데 유용합니다. +

+
+

+temp_limit TEMPERATURE_CELSIUS +

+

허용되는 최대 디스크 온도를 섭씨로 설정합니다. 지정되면 SnapRAID는 +smartctl 도구를 사용하여 주기적으로 모든 디스크의 온도를 확인합니다. +SnapRAID가 작동하는 동안 현재 디스크 온도가 표시됩니다. +어떤 디스크라도 이 제한을 초과하면 모든 작업이 중지되고, 디스크는 +`temp_sleep` 옵션으로 정의된 기간 동안 회전 중지됩니다(대기 모드로 +전환됨). 절전 기간 후 작업이 재개되며, 온도 제한에 다시 도달하면 +다시 일시 중지될 수 있습니다. +

작동 중에 SnapRAID는 각 디스크의 가열 곡선을 분석하고 활동이 계속되면 +도달할 것으로 예상되는 장기 정상 온도를 추정합니다. +추정은 디스크 온도가 네 번 증가한 후에만 수행되어, 신뢰할 수 있는 +추세를 설정하기에 충분한 데이터 포인트가 확보되도록 합니다. +이 예측된 정상 온도는 현재 값 옆에 괄호 안에 표시되며, 시스템의 +냉각이 적절한지 평가하는 데 도움이 됩니다. 이 추정 온도는 정보 제공 +목적일 뿐이며 SnapRAID의 동작에는 영향을 미치지 않습니다. +프로그램의 동작은 오로지 실제 측정된 디스크 온도에 기반합니다. +

이 분석을 수행하려면 SnapRAID는 시스템 온도에 대한 참조가 필요합니다. +먼저 사용 가능한 하드웨어 센서에서 읽으려고 시도합니다. +시스템 센서에 액세스할 수 없는 경우, 실행 시작 시 측정된 가장 낮은 +디스크 온도를 대체 참조로 사용합니다. +

일반적으로 SnapRAID는 가장 뜨거운 디스크의 온도만 표시합니다. +모든 디스크의 온도를 표시하려면 -A 또는 --stats 옵션을 사용하십시오. +

+
+

+temp_sleep TIME_IN_MINUTES +

+

온도 제한에 도달했을 때의 대기 시간(분)을 설정합니다. 이 기간 동안 +디스크는 회전 중지 상태를 유지합니다. 기본값은 5분입니다. +

+
+

+pool DIR +

+

`pool` 명령을 사용하여 디스크 어레이의 가상 뷰가 생성되는 풀링 +디렉토리를 정의합니다. +

디렉토리는 이미 존재해야 합니다. +

+
+

+share UNC_DIR +

+

디스크에 원격으로 액세스하는 데 필요한 Windows UNC 경로를 정의합니다. +

이 옵션이 지정되면 풀 디렉토리에 생성된 심볼릭 링크는 이 UNC 경로를 +사용하여 디스크에 액세스합니다. +이 옵션이 없으면 생성된 심볼릭 링크는 로컬 경로만 사용하며, 이는 +네트워크를 통해 풀 디렉토리를 공유하는 것을 허용하지 않습니다. +

심볼릭 링크는 지정된 UNC 경로를 사용하여 형성되며, `data` 옵션에 +지정된 디스크 이름이 추가되고, 마지막으로 파일 디렉토리와 이름이 +추가됩니다. +

이 옵션은 Windows에만 필요합니다. +

+
+

+smartctl DISK/PARITY OPTIONS... +

+

각 디스크에 대한 SMART 속성을 얻기 위한 사용자 정의 smartctl 옵션을 +정의합니다. 이는 RAID 컨트롤러 및 일부 자동 감지할 수 없는 USB 디스크에 +필요할 수 있습니다. %s 자리 표시자는 장치 이름으로 대체되지만, +RAID 컨트롤러와 같은 고정된 장치에서는 선택 사항입니다. +

DISK는 `data` 옵션에 지정된 것과 동일한 디스크 이름입니다. +PARITY는 `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, +`6-parity`, 또는 `z-parity` 중 하나의 패리티 이름입니다. +

지정된 OPTIONS에서 `%s` 문자열은 장치 이름으로 대체됩니다. +RAID 컨트롤러의 경우 장치가 고정되어 있을 가능성이 높으므로 +`%s`를 사용할 필요가 없을 수 있습니다. +

가능한 옵션은 smartmontools 설명서를 참조하십시오: +

+https://www.smartmontools.org/wiki/Supported_RAID-Controllers
+https://www.smartmontools.org/wiki/Supported_USB-Devices
+
+

예: +

+smartctl parity -d sat %s
+
+
+
+

+smartignore DISK/PARITY ATTR [ATTR...] +

+

디스크 실패 확률을 계산할 때 지정된 SMART 속성을 무시합니다. +이 옵션은 디스크가 특정 속성에 대해 특이하거나 오해의 소지가 있는 +값을 보고하는 경우에 유용합니다. +

DISK는 `data` 옵션에 지정된 것과 동일한 디스크 이름입니다. +PARITY는 `parity`, `2-parity`, `3-parity`, `4-parity`, `5-parity`, +`6-parity`, 또는 `z-parity` 중 하나의 패리티 이름입니다. +특수 값 *는 모든 디스크에서 속성을 무시하는 데 사용될 수 있습니다. +

예를 들어, 모든 디스크에서 `Current Pending Sector Count` 속성을 +무시하려면: +

+smartignore * 197
+
+

첫 번째 패리티 디스크에서만 무시하려면: +

+smartignore parity 197
+
+
+
+

+Examples +

+

Unix의 일반적인 설정 예는 다음과 같습니다: +

+parity /mnt/diskp/snapraid.parity
+content /mnt/diskp/snapraid.content
+content /var/snapraid/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+exclude /lost+found/
+exclude /tmp/
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/sg0
+smartctl 2-parity -d areca,2/1 /dev/sg0
+
+

Windows의 일반적인 설정 예는 다음과 같습니다: +

+parity E:\snapraid.parity
+content E:\snapraid.content
+content C:\snapraid\snapraid.content
+data d1 G:\array\
+data d2 H:\array\
+data d3 I:\array\
+exclude Thumbs.db
+exclude \$RECYCLE.BIN
+exclude \System Volume Information
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/arcmsr0
+smartctl 2-parity -d areca,2/1 /dev/arcmsr0
+
+
+
+
+

+Pattern +

+

패턴은 포함하거나 제외할 파일을 필터링하는 유연한 방법을 제공합니다. +글로빙(globbing) 문자를 사용하면 모든 경로를 일일이 나열하지 않고도 +특정 파일 이름이나 전체 디렉토리 구조와 일치하는 규칙을 정의할 수 있습니다. +

물음표 `?`는 디렉토리 구분 기호를 제외한 모든 단일 문자와 일치합니다. +이는 패턴을 단일 디렉토리 수준으로 제한하면서 가변 문자가 포함된 +파일 이름을 일치시키는 데 유용합니다. +

단일 별표 `*`는 모든 문자 시퀀스와 일치하지만, 물음표와 마찬가지로 +디렉토리 경계를 넘지 않습니다. 슬래시에서 멈추므로 단일 경로 구성 요소 +내에서의 일치에 적합합니다. 이는 쉘 글로빙에서 익숙한 표준 와일드카드 +동작입니다. +

이중 별표 `**`는 더 강력하며 디렉토리 구분 기호를 포함한 모든 문자 +시퀀스와 일치합니다. 이를 통해 패턴이 여러 디렉토리 수준에서 일치할 수 +있습니다. `**`가 패턴 내에 직접 포함된 경우, 주변 리터럴 텍스트 사이의 +슬래시를 포함하여 0개 이상의 문자와 일치할 수 있습니다. +

`**`의 가장 중요한 용도는 특수 형식인 `/**/`입니다. 이는 0개 이상의 +전체 디렉토리 수준과 일치하므로 정확한 경로 구조를 모르더라도 +디렉토리 트리의 모든 깊이에서 파일과 일치시킬 수 있습니다. +예를 들어, `src/**/main.js` 패턴은 `src/main.js`(0개의 디렉토리 건너뜀), +`src/ui/main.js`(1개의 디렉토리 건너뜀), `src/ui/components/main.js` +(2개의 디렉토리 건너뜀)와 일치합니다. +

대괄호 `[]`를 사용하는 문자 클래스는 지정된 세트 또는 범위에서 +단일 문자와 일치합니다. 다른 단일 문자 패턴과 마찬가지로 디렉토리 +구분 기호와는 일치하지 않습니다. 클래스는 범위 및 느낌표를 사용한 +부정을 지원합니다. +

기억해야 할 근본적인 차이점은 `*`, `?` 및 문자 클래스는 모두 +디렉토리 경계를 준수하고 단일 경로 구성 요소 내에서만 일치하는 반면, +`**`는 디렉토리 구분 기호를 가로질러 일치할 수 있는 유일한 패턴이라는 것입니다. +

네 가지 유형의 패턴이 있습니다: +

+
+
+FILE +
+FILE이라는 이름의 모든 파일을 선택합니다. +이 패턴은 디렉토리가 아닌 파일에만 적용됩니다. +
+
+
+
+
+
+DIR/ +
+DIR이라는 이름의 모든 디렉토리와 그 안의 모든 것을 선택합니다. +이 패턴은 파일이 아닌 디렉토리에만 적용됩니다. +
+
+
+
+
+
+/PATH/FILE +
+지정된 정확한 파일 경로를 선택합니다. 이 패턴은 디렉토리가 아닌 +파일에만 적용됩니다. +
+
+
+
+
+
+/PATH/DIR/ +
+지정된 정확한 디렉토리 경로와 그 안의 모든 것을 선택합니다. +이 패턴은 파일이 아닌 디렉토리에만 적용됩니다. +
+
+
+
+
+
+/로 시작하는 절대 경로를 지정하면 로컬 파일 시스템의 루트 디렉토리가 +
+
+
+
+

아닌 어레이 루트 디렉토리에 적용됩니다. +

Windows에서는 정방향 슬래시 / 대신 역슬래시 \를 사용할 수 있습니다. +Windows 시스템 디렉토리, 접합점(junctions), 마운트 지점 및 기타 +Windows 특수 디렉토리는 파일로 취급됩니다. 즉, 이들을 제외하려면 +디렉토리 규칙이 아닌 파일 규칙을 사용해야 합니다. +

파일 이름에 '*', '?', '[', +또는 ']' 문자가 포함된 경우, 글로빙 문자로 해석되는 것을 피하기 위해 +이스케이프해야 합니다. Unix에서는 이스케이프 문자가 '\'이고, +Windows에서는 '^'입니다. +패턴이 명령줄에 있는 경우, 명령 셸에 의해 해석되는 것을 피하기 위해 +이스케이프 문자를 두 배로 늘려야 합니다. +

설정 파일에서는 처리할 파일을 필터링하기 위해 다른 전략을 사용할 수 +있습니다. +가장 간단한 접근 방식은 원하지 않는 모든 파일과 디렉토리를 제거하기 +위해 `exclude` 규칙만 사용하는 것입니다. 예를 들어: +

+# `*.unrecoverable`이라는 이름의 모든 파일 제외
+exclude *.unrecoverable
+# 루트 디렉토리 `/lost+found` 제외
+exclude /lost+found/
+# `tmp`라는 이름의 모든 하위 디렉토리 제외
+exclude tmp/
+
+

반대 접근 방식은 `include` 규칙만 사용하여 처리하려는 파일만 +정의하는 것입니다. 예를 들어: +

+# 일부 디렉토리만 포함
+include /movies/
+include /musics/
+include /pictures/
+
+

최종 접근 방식은 `exclude` 및 `include` 규칙을 혼합하는 것입니다. +이 경우 규칙의 순서가 중요합니다. 앞선 규칙이 뒤의 규칙보다 +우선합니다. +단순화를 위해 모든 `exclude` 규칙을 먼저 나열한 다음 모든 +`include` 규칙을 나열할 수 있습니다. 예를 들어: +

+# `*.unrecoverable`이라는 이름의 모든 파일 제외
+exclude *.unrecoverable
+# `tmp`라는 이름의 모든 하위 디렉토리 제외
+exclude tmp/
+# 일부 디렉토리만 포함
+include /movies/
+include /musics/
+include /pictures/
+
+

명령줄에서 -f 옵션을 사용할 때 `include` 패턴만 사용할 수 있습니다. +예를 들어: +

+# .mp3 파일만 확인.
+# Unix에서는 셸에 의한 글로빙 확장을 피하기 위해 따옴표를 사용합니다.
+snapraid -f "*.mp3" check
+
+

Unix에서는 명령줄에서 글로빙 문자를 사용할 때 셸이 확장하는 것을 +방지하기 위해 따옴표로 묶어야 합니다. +

+
+

+Ignore File +

+

설정 파일의 전역 규칙 외에도, 배열 내의 모든 디렉토리에 `.snapraidignore` +파일을 배치하여 분산된 제외 규칙을 정의할 수 있습니다. +

`.snapraidignore`에 정의된 규칙은 설정 파일의 규칙 다음에 적용됩니다. +이는 해당 규칙들이 더 높은 우선순위를 가지며, 전역 설정에 의해 이전에 +포함되었던 파일들을 제외하는 데 사용될 수 있음을 의미합니다. 사실상 +로컬 규칙이 일치하면, 전역 포함 설정과 관계없이 해당 파일은 제외됩니다. +

`.snapraidignore`의 패턴 로직은 전역 설정을 따르지만, 패턴은 해당 파일이 +위치한 디렉토리를 기준으로 고정됩니다: +

+
+
+FILE +
+이 디렉토리 또는 그 하위에서 FILE이라는 이름의 모든 파일을 선택합니다. +이는 전역 패턴과 동일한 글로빙(globbing) 규칙을 따릅니다. +
+
+
+
+
+
+DIR/ +
+이 디렉토리 또는 그 하위에서 DIR이라는 이름의 모든 디렉토리와 +그 안의 모든 항목을 선택합니다. +
+
+
+
+
+
+/PATH/FILE +
+`.snapraidignore` 파일의 위치를 기준으로 지정된 정확한 파일을 +선택합니다. +
+
+
+
+
+
+/PATH/DIR/ +
+`.snapraidignore` 파일의 위치를 기준으로 지정된 정확한 디렉토리와 +그 안의 모든 항목을 선택합니다. +
+
+
+

전역 설정과 달리, `.snapraidignore` 파일은 제외 규칙만 지원합니다. +`include` 패턴이나 부정(!)은 사용할 수 없습니다. +

예를 들어, `/mnt/disk1/projects/`에 `.snapraidignore`가 있는 경우: +

+# /mnt/disk1/projects/output.bin만 제외
+/output.bin
+# projects/ 내부의 'build'라는 이름의 모든 디렉토리 제외
+build/
+# projects/ 또는 그 하위 폴더의 모든 .tmp 파일 제외
+*.tmp
+
+
+
+

+Content +

+

SnapRAID는 content 파일에 파일 목록과 체크섬을 저장합니다. +

이것은 디스크 어레이에 있는 모든 파일의 목록과 무결성을 확인하기 위한 +모든 체크섬을 나열하는 이진 파일입니다. +

이 파일은 `sync` 및 `scrub` 명령에 의해 읽고 쓰여지며, +`fix`, `check`, 및 `status` 명령에 의해 읽혀집니다. +

+
+

+Parity +

+

SnapRAID는 패리티 파일에 어레이의 패리티 정보를 저장합니다. +

이들은 `content` 파일에 정의된 모든 블록의 계산된 패리티를 포함하는 +이진 파일입니다. +

이 파일들은 `sync` 및 `fix` 명령에 의해 읽고 쓰여지며, +`scrub` 및 `check` 명령에 의해서만 읽혀집니다. +

+
+

+Encoding +

+

Unix의 SnapRAID는 인코딩을 무시합니다. 파일 시스템에서 사용되는 +것과 동일한 인코딩으로 파일 이름을 읽고 저장합니다. +

Windows에서는 파일 시스템에서 읽은 모든 이름이 UTF-8 형식으로 +변환되고 처리됩니다. +

파일 이름이 올바르게 출력되도록 하려면, `chcp 65001` 명령으로 +Windows 콘솔을 UTF-8 모드로 설정하고 콘솔 글꼴로 `Lucida Console`과 +같은 TrueType 글꼴을 사용해야 합니다. +이는 출력되는 파일 이름에만 영향을 미치며, 콘솔 출력을 파일로 +리디렉션하는 경우 결과 파일은 항상 UTF-8 형식입니다. +

+ + +
+
+
+ + + + + + + diff --git a/beta/manual-pl.html b/beta/manual-pl.html new file mode 100644 index 00000000..d05ef6b9 --- /dev/null +++ b/beta/manual-pl.html @@ -0,0 +1,1966 @@ + + + + + + + + SnapRAID Manual + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + +
+ +
+ +
+

+Synopsis +

+
+snapraid [-c, --conf CONFIG]
+    [-f, --filter PATTERN] [-d, --filter-disk NAME]
+    [-m, --filter-missing] [-e, --filter-error]
+    [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR]
+    [-p, --plan PERC|bad|new|full]
+    [-o, --older-than DAYS] [-l, --log FILE]
+    [-s, --spin-down-on-error] [-w, --bw-limit RATE]
+    [-Z, --force-zero] [-E, --force-empty]
+    [-U, --force-uuid] [-D, --force-device]
+    [-N, --force-nocopy] [-F, --force-full]
+    [-R, --force-realloc]
+    [-S, --start BLKSTART] [-B, --count BLKCOUNT]
+    [-L, --error-limit NUMBER]
+    [-A, --stats]
+    [-v, --verbose] [-q, --quiet]
+    status|smart|probe|up|down|diff|sync|scrub|fix|check
+    |list|dup|pool|devices|touch|rehash
+
+
+snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT]
+
+
+
+

+Description +

+

SnapRAID to program do tworzenia kopii zapasowych przeznaczony +dla macierzy dyskowych, przechowujący informacje parzystości +do odzyskiwania danych w przypadku awarii do sześciu dysków. +

Przeznaczony głównie dla domowych centrów multimedialnych z dużymi, +rzadko zmieniającymi się plikami, SnapRAID oferuje kilka funkcji: +

    +
  • +Możesz używać dysków już wypełnionych plikami bez +konieczności ich ponownego formatowania, uzyskując do nich dostęp jak zwykle. +
  • +
  • +Wszystkie Twoje dane są haszowane, aby zapewnić integralność danych i zapobiec +cichej korupcji. +
  • +
  • +Gdy liczba uszkodzonych dysków przekracza liczbę parzystości, +utrata danych ogranicza się do dotkniętych dysków; dane na +innych dyskach pozostają dostępne. +
  • +
  • +Jeśli przypadkowo usuniesz pliki na dysku, możliwe jest ich odzyskanie. +
  • +
  • +Dyski mogą mieć różne rozmiary. +
  • +
  • +Możesz dodawać dyski w dowolnym momencie. +
  • +
  • +SnapRAID nie blokuje Twoich danych; możesz przestać go używać +w dowolnym momencie bez ponownego formatowania ani przenoszenia danych. +
  • +
  • +Aby uzyskać dostęp do pliku, wystarczy, że zakręci się tylko jeden dysk, +co oszczędza energię i zmniejsza hałas. +
  • +
+

Więcej informacji można znaleźć na oficjalnej stronie SnapRAID: +

+https://www.snapraid.it/
+
+
+
+

+Limitations +

+

SnapRAID to hybryda programu RAID i programu do tworzenia kopii zapasowych, +której celem jest połączenie najlepszych zalet obu. Ma jednak pewne +ograniczenia, które należy wziąć pod uwagę przed jego użyciem. +

Głównym ograniczeniem jest to, że jeśli dysk ulegnie awarii, a Ty nie wykonałeś +niedawno synchronizacji, możesz nie być w stanie w pełni odzyskać danych. +Dokładniej, możesz nie być w stanie odzyskać danych o wielkości +zmienionych lub usuniętych plików od czasu ostatniej operacji synchronizacji. +Dzieje się tak, nawet jeśli zmienione lub usunięte pliki nie znajdują się na +uszkodzonym dysku. Dlatego SnapRAID jest lepiej dostosowany do +danych, które rzadko się zmieniają. +

Z drugiej strony, nowo dodane pliki nie uniemożliwiają odzyskania już +istniejących plików. Stracisz tylko ostatnio dodane pliki, jeśli +znajdują się one na uszkodzonym dysku. +

Inne ograniczenia SnapRAID to: +

    +
  • +W SnapRAID nadal masz oddzielne systemy plików dla każdego dysku. +W RAID otrzymujesz jeden duży system plików. +
  • +
  • +SnapRAID nie rozdziela danych. +W RAID uzyskujesz wzrost prędkości dzięki rozdzielaniu. +
  • +
  • +SnapRAID nie obsługuje odzyskiwania w czasie rzeczywistym. +W RAID nie musisz przerywać pracy, gdy dysk ulegnie awarii. +
  • +
  • +SnapRAID może odzyskać dane tylko z ograniczonej liczby awarii dysków. +W przypadku kopii zapasowej możesz odzyskać dane po całkowitej +awarii całej macierzy dysków. +
  • +
  • +Zapisywane są tylko nazwy plików, znaczniki czasu, dowiązania symboliczne +i dowiązania twarde. +Uprawnienia, właścicielstwo i rozszerzone atrybuty nie są zapisywane. +
  • +
+
+
+

+Getting Started +

+

Aby użyć SnapRAID, musisz najpierw wybrać jeden dysk w swojej macierzy +dysków, który zostanie przeznaczony na informacje o `parzystości`. Z jednym dyskiem +na parzystość będziesz w stanie odzyskać dane po awarii pojedynczego dysku, +podobnie jak w RAID5. +

Jeśli chcesz odzyskać dane po większej liczbie awarii dysków, podobnie jak +w RAID6, musisz zarezerwować dodatkowe dyski na parzystość. Każdy dodatkowy +dysk parzystości umożliwia odzyskanie danych po jeszcze jednej awarii dysku. +

Jako dyski parzystości musisz wybrać największe dyski w macierzy, +ponieważ informacje o parzystości mogą urosnąć do rozmiaru największego +dysku danych w macierzy. +

Dyski te będą przeznaczone do przechowywania plików `parzystości`. +Nie powinieneś na nich przechowywać swoich danych. +

Następnie musisz zdefiniować dyski `danych`, które chcesz chronić +za pomocą SnapRAID. Ochrona jest bardziej skuteczna, jeśli te dyski +zawierają dane, które rzadko się zmieniają. Z tego powodu lepiej jest +NIE włączać dysku C:\ w systemie Windows ani katalogów /home, /var i /tmp +w systemie Unix. +

Lista plików jest zapisywana w plikach `zawartości`, zwykle +przechowywanych na dyskach danych, parzystości lub rozruchowych. +Plik ten zawiera szczegóły Twojej kopii zapasowej, w tym wszystkie +sumy kontrolne w celu weryfikacji jej integralności. +Plik `zawartości` jest przechowywany w wielu kopiach, a każda kopia musi +znajdować się na innym dysku, aby zapewnić, że nawet w przypadku wielu +awarii dysków, przynajmniej jedna kopia jest dostępna. +

Na przykład, załóżmy, że interesuje Cię tylko jeden poziom parzystości +i Twoje dyski znajdują się w: +

+/mnt/diskp <- wybrany dysk dla parzystości
+/mnt/disk1 <- pierwszy dysk do ochrony
+/mnt/disk2 <- drugi dysk do ochrony
+/mnt/disk3 <- trzeci dysk do ochrony
+
+

Musisz utworzyć plik konfiguracyjny /etc/snapraid.conf z +następującymi opcjami: +

+parity /mnt/diskp/snapraid.parity
+content /var/snapraid/snapraid.content
+content /mnt/disk1/snapraid.content
+content /mnt/disk2/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+
+

Jeśli używasz systemu Windows, powinieneś użyć formatu ścieżek Windows, +z literami dysków i ukośnikami odwrotnymi zamiast ukośników: +

+parity E:\snapraid.parity
+content C:\snapraid\snapraid.content
+content F:\array\snapraid.content
+content G:\array\snapraid.content
+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+
+

Jeśli masz wiele dysków i zabrakło Ci liter dysków, możesz zamontować +dyski bezpośrednio w podfolderach. Zobacz: +

+https://www.google.com/search?q=Windows+mount+point
+
+

W tym momencie jesteś gotowy do uruchomienia polecenia `sync`, aby zbudować +informacje o parzystości. +

+snapraid sync
+
+

Ten proces może zająć kilka godzin za pierwszym razem, w zależności od rozmiaru +danych już obecnych na dyskach. Jeśli dyski są puste, +proces jest natychmiastowy. +

Możesz go zatrzymać w dowolnym momencie, naciskając Ctrl+C, a przy następnym +uruchomieniu wznowi się w miejscu, w którym został przerwany. +

Kiedy to polecenie się zakończy, Twoje dane są BEZPIECZNE. +

Teraz możesz zacząć używać swojej macierzy, jak chcesz, i okresowo +aktualizować informacje o parzystości, uruchamiając polecenie `sync`. +

+

+Scrubbing +

+

Aby okresowo sprawdzać dane i parzystość pod kątem błędów, możesz +uruchomić polecenie `scrub`. +

+snapraid scrub
+
+

To polecenie porównuje dane w Twojej macierzy z haszem obliczonym +podczas polecenia `sync`, aby zweryfikować integralność. +

Każde uruchomienie polecenia sprawdza około 8% macierzy, z wyłączeniem danych +już sprawdzonych w ciągu poprzednich 10 dni. +Możesz użyć opcji -p, --plan, aby określić inną ilość, +oraz opcji -o, --older-than, aby określić inny wiek w dniach. +Na przykład, aby sprawdzić 5% macierzy dla bloków starszych niż 20 dni, użyj: +

+snapraid -p 5 -o 20 scrub
+
+

Jeśli podczas procesu zostaną znalezione ciche błędy lub błędy wejścia/wyjścia, +odpowiednie bloki zostaną oznaczone jako złe w pliku `content` +i wymienione w poleceniu `status`. +

+snapraid status
+
+

Aby je naprawić, możesz użyć polecenia `fix`, filtrując złe bloki +za pomocą opcji -e, --filter-error: +

+snapraid -e fix
+
+

Przy następnym `scrub`, błędy znikną z raportu `status`, +jeśli zostały faktycznie naprawione. Aby przyspieszyć, możesz użyć -p bad, aby +sprawdzić tylko bloki oznaczone jako złe. +

+snapraid -p bad scrub
+
+

Uruchomienie `scrub` na niezsynchronizowanej macierzy może zgłosić błędy +spowodowane usuniętymi lub zmodyfikowanymi plikami. Błędy te są zgłaszane +w wyniku `scrub`, ale powiązane bloki nie są oznaczane jako złe. +

+
+

+Pooling +

+

Uwaga: Funkcja łączenia w pulę opisana poniżej została zastąpiona przez +narzędzie mergefs, które jest obecnie zalecaną opcją dla użytkowników Linuksa +w społeczności SnapRAID. Mergefs zapewnia bardziej elastyczny i wydajny +sposób łączenia wielu dysków w jeden ujednolicony punkt montowania, +umożliwiając bezproblemowy dostęp do plików w całej macierzy bez polegania +na dowiązaniach symbolicznych. Dobrze integruje się z SnapRAID w celu ochrony +parzystości i jest powszechnie używane w konfiguracjach takich jak +OpenMediaVault (OMV) lub niestandardowe konfiguracje NAS. +

Aby wszystkie pliki w Twojej macierzy były widoczne w tym samym drzewie katalogów, +możesz włączyć funkcję `pooling`. Tworzy ona wirtualny, tylko do odczytu, +widok wszystkich plików w Twojej macierzy za pomocą dowiązań symbolicznych. +

Katalog `pooling` możesz skonfigurować w pliku konfiguracyjnym za pomocą: +

+pool /pool
+
+

lub, jeśli używasz systemu Windows, za pomocą: +

+pool C:\pool
+
+

a następnie uruchom polecenie `pool`, aby utworzyć lub zaktualizować wirtualny widok. +

+snapraid pool
+
+

Jeśli używasz platformy Unix i chcesz udostępnić ten katalog +przez sieć maszynom Windows lub Unix, powinieneś dodać +następujące opcje do swojego /etc/samba/smb.conf: +

+# W sekcji globalnej smb.conf
+unix extensions = no
+
+
+# W sekcji udziału smb.conf
+[pool]
+comment = Pula
+path = /pool
+read only = yes
+guest ok = yes
+wide links = yes
+follow symlinks = yes
+
+

W systemie Windows udostępnianie dowiązań symbolicznych przez sieć wymaga od klientów +zdalnego ich rozwiązywania. Aby to umożliwić, oprócz udostępnienia katalogu puli, +musisz również udostępnić wszystkie dyski niezależnie, używając nazw dysków +zdefiniowanych w pliku konfiguracyjnym jako punkty udostępniania. Musisz również +określić w opcji `share` w pliku konfiguracyjnym ścieżkę UNC Windows, +której klienci zdalni muszą użyć, aby uzyskać dostęp do tych udostępnionych dysków. +

Na przykład, działając z serwera o nazwie `darkstar`, możesz użyć +opcji: +

+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+pool C:\pool
+share \\darkstar
+
+

i udostępnić w sieci następujące katalogi: +

+\\darkstar\pool -> C:\pool
+\\darkstar\d1 -> F:\array
+\\darkstar\d2 -> G:\array
+\\darkstar\d3 -> H:\array
+
+

aby umożliwić zdalnym klientom dostęp do wszystkich plików pod adresem \\darkstar\pool. +

Możesz również potrzebować skonfigurować klientów zdalnych, aby umożliwić dostęp +do zdalnych dowiązań symbolicznych za pomocą polecenia: +

+fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
+
+
+
+

+Undeleting +

+

SnapRAID działa bardziej jak program do tworzenia kopii zapasowych niż system RAID +i może być użyty do przywrócenia lub odzyskania usuniętych plików do ich poprzedniego +stanu za pomocą opcji -f, --filter: +

+snapraid fix -f FILE
+
+

lub dla katalogu: +

+snapraid fix -f DIR/
+
+

Możesz go również użyć do odzyskania tylko przypadkowo usuniętych plików wewnątrz +katalogu za pomocą opcji -m, --filter-missing, która przywraca +tylko brakujące pliki, pozostawiając wszystkie inne nienaruszone. +

+snapraid fix -m -f DIR/
+
+

Lub aby odzyskać wszystkie usunięte pliki na wszystkich dyskach za pomocą: +

+snapraid fix -m
+
+
+
+

+Recovering +

+

Najgorsze się wydarzyło i straciłeś jeden lub więcej dysków! +

NIE PANIKUJ! Będziesz w stanie je odzyskać! +

Pierwszą rzeczą, którą musisz zrobić, to unikać dalszych zmian w Twojej macierzy dysków. +Wyłącz wszelkie zdalne połączenia z nią i wszelkie zaplanowane procesy, w tym +jakąkolwiek zaplanowaną nocną synchronizację lub scrub SnapRAID. +

Następnie postępuj zgodnie z poniższymi krokami. +

+

+KROK 1 -> Ponowna konfiguracja +

+

Potrzebujesz trochę miejsca do odzyskania, najlepiej na dodatkowych +zapasowych dyskach, ale wystarczy zewnętrzny dysk USB lub dysk zdalny. +

Zmodyfikuj plik konfiguracyjny SnapRAID, aby opcja `data` lub `parity` +uszkodzonego dysku wskazywała na lokalizację z wystarczającą ilością pustego +miejsca do odzyskania plików. +

Na przykład, jeśli dysk `d1` uległ awarii, zmień z: +

+data d1 /mnt/disk1/
+
+

na: +

+data d1 /mnt/new_spare_disk/
+
+

Jeśli dysk do odzyskania jest dyskiem parzystości, zaktualizuj odpowiednią +opcję `parity`. +Jeśli masz wiele uszkodzonych dysków, zaktualizuj wszystkie ich opcje konfiguracyjne. +

+
+

+KROK 2 -> Naprawa +

+

Uruchom polecenie fix, zapisując log w pliku zewnętrznym za pomocą: +

+snapraid -d NAME -l fix.log fix
+
+

Gdzie NAME to nazwa dysku, taka jak `d1` w naszym poprzednim przykładzie. +Jeśli dysk do odzyskania jest dyskiem parzystości, użyj nazw `parity`, `2-parity`, +itp. +Jeśli masz wiele uszkodzonych dysków, użyj wielu opcji -d, aby określić +wszystkie z nich. +

To polecenie zajmie dużo czasu. +

Upewnij się, że masz kilka gigabajtów wolnego miejsca na zapisanie pliku fix.log. +Uruchom je z dysku z wystarczającą ilością wolnego miejsca. +

Teraz odzyskałeś wszystko, co jest możliwe do odzyskania. Jeśli niektóre pliki +są częściowo lub całkowicie nie do odzyskania, zostaną one przemianowane +poprzez dodanie rozszerzenia `.unrecoverable`. +

Szczegółową listę wszystkich nie do odzyskania bloków znajdziesz w pliku fix.log, +sprawdzając wszystkie linie zaczynające się od `unrecoverable:`. +

Jeśli nie jesteś zadowolony z odzyskiwania, możesz spróbować ponownie +tyle razy, ile chcesz. +

Na przykład, jeśli usunąłeś pliki z macierzy po ostatniej +`sync`, może to spowodować, że niektóre pliki nie zostaną odzyskane. +W tym przypadku możesz ponowić próbę `fix` za pomocą opcji -i, --import, +określając, gdzie te pliki znajdują się teraz, aby włączyć je ponownie +do procesu odzyskiwania. +

Jeśli jesteś zadowolony z odzyskiwania, możesz kontynuować, +ale pamiętaj, że po synchronizacji nie możesz już ponowić próby polecenia `fix`! +

+
+

+KROK 3 -> Sprawdzenie +

+

Jako ostrożne sprawdzenie, możesz teraz uruchomić polecenie `check`, aby upewnić się, że +wszystko jest poprawne na odzyskanym dysku. +

+snapraid -d NAME -a check
+
+

Gdzie NAME to nazwa dysku, taka jak `d1` w naszym poprzednim przykładzie. +

Opcje -d i -a mówią SnapRAID, aby sprawdził tylko określony dysk +i zignorował wszystkie dane parzystości. +

To polecenie zajmie dużo czasu, ale jeśli nie jesteś zbyt ostrożny, +możesz je pominąć. +

+
+

+KROK 4 -> Synchronizacja +

+

Uruchom polecenie `sync`, aby ponownie zsynchronizować macierz z nowym dyskiem. +

+snapraid sync
+
+

Jeśli wszystko zostanie odzyskane, to polecenie jest natychmiastowe. +

+
+
+
+

+Commands +

+

SnapRAID udostępnia kilka prostych poleceń, które pozwalają na: +

    +
  • +Wyświetlenie statusu macierzy -> `status` +
  • +
  • +Kontrolę dysków -> `smart`, `probe`, `up`, `down` +
  • +
  • +Wykonanie kopii zapasowej/migawki -> `sync` +
  • +
  • +Okresowe sprawdzanie danych -> `scrub` +
  • +
  • +Przywrócenie ostatniej kopii zapasowej/migawki -> `fix`. +
  • +
+

Polecenia muszą być zapisane małymi literami. +

+

+status +

+

Wyświetla podsumowanie stanu macierzy dysków. +

Zawiera informacje o fragmentacji parzystości, jak stare +są bloki bez sprawdzenia i wszystkie zarejestrowane ciche +błędy napotkane podczas scrubbingu. +

Prezentowane informacje odnoszą się do ostatniego momentu, w którym +uruchomiłeś `sync`. Późniejsze modyfikacje nie są brane pod uwagę. +

Jeśli wykryto złe bloki, ich numery bloków są wymienione. +Aby je naprawić, możesz użyć polecenia `fix -e`. +

Pokazuje również wykres reprezentujący ostatni raz, kiedy każdy blok +został sprawdzony lub zsynchronizowany. Sprawdzone bloki są pokazane +za pomocą '*', bloki zsynchronizowane, ale jeszcze niesprawdzone, za pomocą 'o'. +

Nic nie jest modyfikowane. +

+
+

+smart +

+

Wyświetla raport SMART wszystkich dysków w systemie. +

Zawiera oszacowanie prawdopodobieństwa awarii w następnym +roku, co pozwala zaplanować wymianę konserwacyjną dysków, które wykazują +podejrzane atrybuty. +

To oszacowanie prawdopodobieństwa uzyskuje się poprzez skorelowanie atrybutów SMART +dysków z danymi Backblaze dostępnymi pod adresem: +

+https://www.backblaze.com/hard-drive-test-data.html
+
+

Jeśli SMART zgłosi, że dysk ulega awarii, dla tego dysku +wyświetlane jest `FAIL` lub `PREFAIL`, a SnapRAID zwraca błąd. +W takim przypadku natychmiastowa wymiana dysku jest wysoce zalecana. +

Inne możliwe ciągi statusu to: +

+
+
+logfail +
+W przeszłości niektóre atrybuty były niższe niż +próg. +
+
+
+
+logerr +
+Dziennik błędów urządzenia zawiera błędy. +
+
+
+
+selferr +
+Dziennik autotestu urządzenia zawiera błędy. +
+
+
+

Jeśli określono opcję -v, --verbose, dostarczana jest głębsza analiza +statystyczna. Ta analiza może pomóc Ci zdecydować, czy potrzebujesz +więcej czy mniej parzystości. +

To polecenie używa narzędzia `smartctl` i jest równoważne +uruchomieniu `smartctl -a` na wszystkich urządzeniach. +

Jeśli Twoje urządzenia nie zostaną poprawnie wykryte automatycznie, możesz określić +niestandardowe polecenie za pomocą opcji `smartctl` w pliku konfiguracyjnym. +

Nic nie jest modyfikowane. +

+
+

+probe +

+

Wyświetla stan ZASILANIA wszystkich dysków w systemie. +

`Standby` oznacza, że dysk się nie kręci. `Active` oznacza, +że dysk się kręci. +

To polecenie używa narzędzia `smartctl` i jest równoważne +uruchomieniu `smartctl -n standby -i` na wszystkich urządzeniach. +

Jeśli Twoje urządzenia nie zostaną poprawnie wykryte automatycznie, możesz określić +niestandardowe polecenie za pomocą opcji `smartctl` w pliku konfiguracyjnym. +

Nic nie jest modyfikowane. +

+
+

+up +

+

Rozpędza wszystkie dyski macierzy. +

Możesz rozpędzić tylko określone dyski za pomocą opcji -d, --filter-disk. +

Rozpędzanie wszystkich dysków w tym samym czasie wymaga dużo energii. +Upewnij się, że Twój zasilacz jest w stanie to wytrzymać. +

Nic nie jest modyfikowane. +

+
+

+down +

+

Zatrzymuje wszystkie dyski macierzy. +

To polecenie używa narzędzia `smartctl` i jest równoważne +uruchomieniu `smartctl -s standby,now` na wszystkich urządzeniach. +

Możesz zatrzymać tylko określone dyski za pomocą opcji -d, --filter-disk. +

Aby automatycznie zatrzymać dyski w przypadku błędu, możesz użyć +opcji -s, --spin-down-on-error z dowolnym innym poleceniem, co jest +równoważne ręcznemu uruchomieniu `down`, gdy wystąpi błąd. +

Nic nie jest modyfikowane. +

+
+

+diff +

+

Wyświetla listę wszystkich plików zmodyfikowanych od ostatniej `sync`, które +wymagają ponownego obliczenia danych parzystości. +

To polecenie nie sprawdza danych pliku, a jedynie znacznik czasu pliku, +rozmiar i inode. +

Po wyświetleniu listy wszystkich zmienionych plików, prezentowane jest +podsumowanie zmian, pogrupowane według: +

+
+
+equal +
+Pliki niezmienione od wcześniej. +
+
+
+
+added +
+Pliki dodane, których wcześniej nie było. +
+
+
+
+removed +
+Pliki usunięte. +
+
+
+
+updated +
+Pliki o innym rozmiarze lub znaczniku czasu, co oznacza, że +zostały zmodyfikowane. +
+
+
+
+moved +
+Pliki przeniesione do innego katalogu na tym samym dysku. +Są one identyfikowane przez tę samą nazwę, rozmiar, znacznik czasu +i inode, ale inny katalog. +
+
+
+
+copied +
+Pliki skopiowane na tym samym lub innym dysku. Zauważ, że jeśli +zostały faktycznie przeniesione na inny dysk, zostaną również +policzone w `removed`. +Są one identyfikowane przez tę samą nazwę, rozmiar i +znacznik czasu. Jeśli znacznik czasu z dokładnością do podsekundy wynosi zero, +musi pasować pełna ścieżka, a nie tylko nazwa. +
+
+
+
+restored +
+Pliki o innym inode, ale pasującej nazwie, rozmiarze i znaczniku czasu. +Są to zazwyczaj pliki przywrócone po usunięciu. +
+
+
+

Jeśli wymagana jest `sync`, kod powrotu procesu wynosi 2, zamiast +domyślnego 0. Kod powrotu 1 jest używany dla ogólnego stanu błędu. +

Nic nie jest modyfikowane. +

+
+

+sync +

+

Aktualizuje informacje o parzystości. Wszystkie zmodyfikowane pliki +w macierzy dysków są odczytywane, a odpowiednie dane parzystości +są aktualizowane. +

Możesz zatrzymać ten proces w dowolnym momencie, naciskając Ctrl+C, +bez utraty już wykonanej pracy. +Przy następnym uruchomieniu proces `sync` wznowi się w miejscu, w którym +został przerwany. +

Jeśli podczas procesu zostaną znalezione ciche błędy lub błędy wejścia/wyjścia, +odpowiednie bloki zostaną oznaczone jako złe. +

Pliki są identyfikowane po ścieżce i/lub inode i sprawdzane +po rozmiarze i znaczniku czasu. +Jeśli rozmiar pliku lub znacznik czasu się różni, dane parzystości +są ponownie obliczane dla całego pliku. +Jeśli plik zostanie przeniesiony lub zmieniony na tym samym dysku, zachowując ten sam inode, +parzystość nie jest ponownie obliczana. +Jeśli plik zostanie przeniesiony na inny dysk, parzystość jest ponownie obliczana, +ale wcześniej obliczone informacje o haszu są zachowywane. +

Pliki `content` i `parity` są modyfikowane w razie potrzeby. +Pliki w macierzy NIE są modyfikowane. +

+
+

+scrub +

+

Sprawdza macierz, szukając cichych błędów lub błędów wejścia/wyjścia w danych +i dyskach parzystości. +

Każde wywołanie sprawdza około 8% macierzy, z wyłączeniem +danych już sprawdzonych w ciągu ostatnich 10 dni. +Oznacza to, że sprawdzanie raz w tygodniu zapewnia sprawdzenie każdego bitu danych +przynajmniej raz na trzy miesiące. +

Możesz zdefiniować inny plan sprawdzania lub ilość za pomocą opcji -p, --plan, +która akceptuje: +bad - Sprawdza bloki oznaczone jako złe. +new - Sprawdza bloki właśnie zsynchronizowane, jeszcze niesprawdzone. +full - Sprawdza wszystko. +0-100 - Sprawdza określony procent bloków. +

Jeśli określisz wartość procentową, możesz również użyć opcji -o, --older-than, +aby zdefiniować, jak stary powinien być blok. +Najpierw sprawdzane są najstarsze bloki, co zapewnia optymalne sprawdzenie. +Jeśli chcesz sprawdzić tylko bloki właśnie zsynchronizowane, jeszcze niesprawdzone, +użyj opcji `-p new`. +

Aby uzyskać szczegóły statusu sprawdzania, użyj polecenia `status`. +

Dla każdego znalezionego cichego błędu lub błędu wejścia/wyjścia, odpowiednie bloki +są oznaczane jako złe w pliku `content`. +Te złe bloki są wymienione w `status` i mogą zostać naprawione za pomocą `fix -e`. +Po naprawie, przy następnym sprawdzeniu, zostaną one ponownie sprawdzone, a jeśli okaże się, +że zostały poprawione, oznaczenie złego zostanie usunięte. +Aby sprawdzić tylko złe bloki, możesz użyć polecenia `scrub -p bad`. +

Zaleca się uruchamianie `scrub` tylko na zsynchronizowanej macierzy, aby uniknąć +zgłaszania błędów spowodowanych przez niezsynchronizowane dane. Błędy te są rozpoznawane +jako nie będące cichymi błędami, a bloki nie są oznaczane jako złe, +ale takie błędy są zgłaszane w wyniku polecenia. +

Plik `content` jest modyfikowany w celu zaktualizowania czasu ostatniego sprawdzenia +dla każdego bloku i oznaczenia złych bloków. +Pliki `parity` NIE są modyfikowane. +Pliki w macierzy NIE są modyfikowane. +

+
+

+fix +

+

Naprawia wszystkie pliki i dane parzystości. +

Wszystkie pliki i dane parzystości są porównywane ze stanem migawki +zapisanym w ostatniej `sync`. +Jeśli zostanie znaleziona różnica, jest ona przywracana do zapisanego stanu migawki. +

OSTRZEŻENIE! Polecenie `fix` nie rozróżnia błędów od +celowych modyfikacji. Bezwarunkowo przywraca stan pliku +do ostatniej `sync`. +

Jeśli nie określono żadnej innej opcji, przetwarzana jest cała macierz. +Użyj opcji filtra, aby wybrać podzbiór plików lub dysków do operacji. +

Aby naprawić tylko bloki oznaczone jako złe podczas `sync` i `scrub`, +użyj opcji -e, --filter-error. +W przeciwieństwie do innych opcji filtra, ta stosuje poprawki tylko do plików, które są +niezmienione od ostatniej `sync`. +

SnapRAID zmienia nazwy wszystkich plików, których nie można naprawić, dodając +rozszerzenie `.unrecoverable`. +

Przed naprawą, cała macierz jest skanowana w celu znalezienia wszelkich plików przeniesionych +od ostatniej operacji `sync`. +Pliki te są identyfikowane na podstawie ich znacznika czasu, ignorując ich nazwę +i katalog, i są używane w procesie odzyskiwania, jeśli to konieczne. +Jeśli przeniosłeś niektóre z nich poza macierz, możesz użyć opcji -i, --import, +aby określić dodatkowe katalogi do skanowania. +

Pliki są identyfikowane tylko po ścieżce, a nie po inode. +

Plik `content` NIE jest modyfikowany. +Pliki `parity` są modyfikowane w razie potrzeby. +Pliki w macierzy są modyfikowane w razie potrzeby. +

+
+

+check +

+

Weryfikuje wszystkie pliki i dane parzystości. +

Działa jak `fix`, ale tylko symuluje odzyskiwanie i żadne zmiany +nie są zapisywane w macierzy. +

To polecenie jest przeznaczone głównie do ręcznej weryfikacji, +takiej jak po procesie odzyskiwania lub w innych specjalnych warunkach. +Do okresowych i zaplanowanych sprawdzeń użyj `scrub`. +

Jeśli użyjesz opcji -a, --audit-only, sprawdzane są tylko +dane pliku, a dane parzystości są ignorowane, co zapewnia +szybsze działanie. +

Pliki są identyfikowane tylko po ścieżce, a nie po inode. +

Nic nie jest modyfikowane. +

+
+

+list +

+

Wyświetla listę wszystkich plików zawartych w macierzy w momencie +ostatniej `sync`. +

Z -v lub --verbose, wyświetlany jest również czas z dokładnością do podsekundy. +

Nic nie jest modyfikowane. +

+
+

+dup +

+

Wyświetla listę wszystkich zduplikowanych plików. Dwa pliki są uważane za równe, jeśli ich +hasze pasują. Dane pliku nie są odczytywane; używane są tylko +wcześniej obliczone hasze. +

Nic nie jest modyfikowane. +

+
+

+pool +

+

Tworzy lub aktualizuje wirtualny widok wszystkich +plików w Twojej macierzy dysków w katalogu `pooling`. +

Pliki nie są kopiowane, ale linkowane za pomocą +dowiązań symbolicznych. +

Podczas aktualizacji, wszystkie istniejące dowiązania symboliczne i puste +podkatalogi są usuwane i zastępowane nowym +widokiem macierzy. Wszelkie inne zwykłe pliki pozostają na swoim miejscu. +

Nic nie jest modyfikowane poza katalogiem puli. +

+
+

+devices +

+

Wyświetla urządzenia niskiego poziomu używane przez macierz. +

To polecenie wyświetla skojarzenia urządzeń w macierzy +i jest przeznaczone głównie jako interfejs skryptowy. +

Pierwsze dwie kolumny to identyfikator i ścieżka urządzenia niskiego poziomu. +Następne dwie kolumny to identyfikator i ścieżka urządzenia wysokiego poziomu. +Ostatnia kolumna to nazwa dysku w macierzy. +

W większości przypadków masz jedno urządzenie niskiego poziomu dla każdego dysku w +macierzy, ale w niektórych bardziej złożonych konfiguracjach możesz mieć wiele +urządzeń niskiego poziomu używanych przez pojedynczy dysk w macierzy. +

Nic nie jest modyfikowane. +

+
+

+touch +

+

Ustawia arbitralny znacznik czasu z dokładnością do podsekundy dla wszystkich plików, +które mają go ustawiony na zero. +

Poprawia to zdolność SnapRAID do rozpoznawania przeniesionych +i skopiowanych plików, ponieważ sprawia, że znacznik czasu jest prawie unikalny, +redukując możliwe duplikaty. +

Dokładniej, jeśli znacznik czasu z dokładnością do podsekundy nie jest zerowy, +przeniesiony lub skopiowany plik jest identyfikowany jako taki, jeśli pasuje do +nazwy, rozmiaru i znacznika czasu. Jeśli znacznik czasu z dokładnością do podsekundy +jest zerowy, jest uważany za kopię tylko wtedy, gdy pasują pełna ścieżka, +rozmiar i znacznik czasu. +

Znacznik czasu z dokładnością do sekundy nie jest modyfikowany, +więc wszystkie daty i czasy Twoich plików zostaną zachowane. +

+
+

+rehash +

+

Planuje ponowne haszowanie całej macierzy. +

To polecenie zmienia używany rodzaj hasza, zazwyczaj podczas aktualizacji +z systemu 32-bitowego na 64-bitowy, aby przełączyć się z +MurmurHash3 na szybszy SpookyHash. +

Jeśli używasz już optymalnego hasza, to polecenie +nic nie robi i informuje Cię, że nie jest potrzebne żadne działanie. +

Ponowne haszowanie nie jest wykonywane natychmiast, ale odbywa się +stopniowo podczas `sync` i `scrub`. +

Możesz sprawdzić stan ponownego haszowania za pomocą `status`. +

Podczas ponownego haszowania SnapRAID zachowuje pełną funkcjonalność, +z jedynym wyjątkiem, że `dup` nie może wykryć zduplikowanych +plików używających innego hasza. +

+
+
+

+Options +

+

SnapRAID udostępnia następujące opcje: +

+
+
+-c, --conf CONFIG +
+Wybiera plik konfiguracyjny do użycia. Jeśli nie określono, w systemie Unix +używa pliku `/usr/local/etc/snapraid.conf`, jeśli istnieje, +w przeciwnym razie `/etc/snapraid.conf`. +W systemie Windows używa pliku `snapraid.conf` w tym samym +katalogu co `snapraid.exe`. +
+
+
+
+
+
+-f, --filter PATTERN +
+Filtruje pliki do przetworzenia w `check` i `fix`. +Przetwarzane są tylko pliki pasujące do określonego wzorca. +Ta opcja może być używana wielokrotnie. +Zobacz sekcję PATTERN, aby uzyskać więcej szczegółów na temat +specyfikacji wzorców. +W systemie Unix upewnij się, że znaki globbing są cytowane, jeśli są używane. +Ta opcja może być używana tylko z `check` i `fix`. +Nie może być używana z `sync` i `scrub`, ponieważ zawsze +przetwarzają całą macierz. +
+
+
+
+
+
+-d, --filter-disk NAME +
+Filtruje dyski do przetworzenia w `check`, `fix`, `up` i `down`. +Musisz określić nazwę dysku zdefiniowaną w pliku konfiguracyjnym. +Możesz również określić dyski parzystości za pomocą nazw: `parity`, `2-parity`, +`3-parity`, itp., aby ograniczyć operacje do określonego dysku parzystości. +Jeśli połączysz wiele opcji --filter, --filter-disk i --filter-missing, +wybrane zostaną tylko pliki pasujące do wszystkich filtrów. +Ta opcja może być używana wielokrotnie. +Ta opcja może być używana tylko z `check`, `fix`, `up` i `down`. +Nie może być używana z `sync` i `scrub`, ponieważ zawsze +przetwarzają całą macierz. +
+
+
+
+
+
+-m, --filter-missing +
+Filtruje pliki do przetworzenia w `check` i `fix`. +Przetwarzane są tylko pliki brakujące lub usunięte z macierzy. +Użyte z `fix`, działa to jako polecenie `undelete`. +Jeśli połączysz wiele opcji --filter, --filter-disk i --filter-missing, +wybrane zostaną tylko pliki pasujące do wszystkich filtrów. +Ta opcja może być używana tylko z `check` i `fix`. +Nie może być używana z `sync` i `scrub`, ponieważ zawsze +przetwarzają całą macierz. +
+
+
+
+
+
+-e, --filter-error +
+Przetwarza pliki z błędami w `check` i `fix`. +Przetwarza tylko pliki, które mają bloki oznaczone cichymi +błędami lub błędami wejścia/wyjścia podczas `sync` i `scrub`, jak wymieniono w `status`. +Ta opcja może być używana tylko z `check` i `fix`. +
+
+
+
+
+
+-p, --plan PERC|bad|new|full +
+Wybiera plan sprawdzania. Jeśli PERC jest wartością numeryczną od 0 do 100, +jest interpretowany jako procent bloków do sprawdzenia. +Zamiast wartości procentowej możesz określić plan: +`bad` sprawdza złe bloki, `new` sprawdza bloki jeszcze niesprawdzone, +a `full` sprawdza wszystko. +Ta opcja może być używana tylko z `scrub`. +
+
+
+
+
+
+-o, --older-than DAYS +
+Wybiera najstarszą część macierzy do przetworzenia w `scrub`. +DAYS to minimalny wiek w dniach dla bloku, który ma być sprawdzony; +domyślnie jest to 10. +Bloki oznaczone jako złe są zawsze sprawdzane niezależnie od tej opcji. +Ta opcja może być używana tylko z `scrub`. +
+
+
+
+
+
+-a, --audit-only +
+W `check`, weryfikuje hasz plików bez +sprawdzania danych parzystości. +Jeśli interesuje Cię tylko sprawdzenie danych pliku, ta +opcja może znacznie przyspieszyć proces sprawdzania. +Ta opcja może być używana tylko z `check`. +
+
+
+
+
+
+-h, --pre-hash +
+W `sync`, uruchamia wstępną fazę haszowania wszystkich nowych danych +w celu dodatkowej weryfikacji przed obliczeniem parzystości. +Zazwyczaj w `sync` nie jest wykonywane wstępne haszowanie, a nowe +dane są haszowane tuż przed obliczeniem parzystości, gdy są odczytywane +po raz pierwszy. +Ten proces zachodzi, gdy system jest pod +dużym obciążeniem, wszystkie dyski się kręcą, a CPU jest zajęte. +Jest to ekstremalny warunek dla maszyny, a jeśli ma +ukryty problem sprzętowy, ciche błędy mogą pozostać niewykryte, +ponieważ dane nie są jeszcze haszowane. +Aby uniknąć tego ryzyka, możesz włączyć tryb `pre-hash`, aby +wszystkie dane były odczytywane dwukrotnie w celu zapewnienia ich integralności. +Ta opcja weryfikuje również pliki przeniesione wewnątrz macierzy, +aby upewnić się, że operacja przeniesienia zakończyła się pomyślnie, i, jeśli to konieczne, +umożliwia uruchomienie operacji fix przed kontynuowaniem. +Ta opcja może być używana tylko z `sync`. +
+
+
+
+
+
+-i, --import DIR +
+Importuje z określonego katalogu wszelkie pliki usunięte +z macierzy po ostatniej `sync`. +Jeśli nadal masz takie pliki, mogą być użyte przez `check` +i `fix`, aby poprawić proces odzyskiwania. +Pliki są odczytywane, w tym w podkatalogach, i są +identyfikowane niezależnie od ich nazwy. +Ta opcja może być używana tylko z `check` i `fix`. +
+
+
+
+
+
+-s, --spin-down-on-error +
+W przypadku każdego błędu, zatrzymuje wszystkie zarządzane dyski przed wyjściem +z niezerowym kodem statusu. Zapobiega to pozostawaniu dysków +aktywnymi i kręcącymi się po przerwanej operacji, +pomagając uniknąć niepotrzebnego gromadzenia się ciepła i zużycia +energii. Użyj tej opcji, aby upewnić się, że dyski są bezpiecznie +zatrzymane, nawet gdy polecenie zakończy się niepowodzeniem. +
+
+
+
+
+
+-w, --bw-limit RATE +
+Stosuje globalne ograniczenie przepustowości dla wszystkich dysków. RATE to +liczba bajtów na sekundę. Możesz określić mnożnik, +taki jak K, M lub G (np. --bw-limit 1G). +
+
+
+
+
+
+-A, --stats +
+Włącza rozszerzony widok statusu, który pokazuje dodatkowe informacje. +Ekran wyświetla dwa wykresy: +Pierwszy wykres pokazuje liczbę buforowanych pasków dla każdego +dysku, wraz ze ścieżką pliku, do którego aktualnie uzyskuje się dostęp +na tym dysku. Zazwyczaj najwolniejszy dysk nie będzie miał dostępnego +bufora, co determinuje maksymalną osiągalną przepustowość. +Drugi wykres pokazuje procent czasu spędzonego na czekaniu +w ciągu ostatnich 100 sekund. Oczekuje się, że najwolniejszy dysk +spowoduje większość czasu oczekiwania, podczas gdy inne dyski powinny mieć +niewielki lub żaden czas oczekiwania, ponieważ mogą używać swoich buforowanych pasków. +Ten wykres pokazuje również czas spędzony na czekaniu na obliczenia +hasza i obliczenia RAID. +Wszystkie obliczenia są wykonywane równolegle z operacjami dyskowymi. +Dlatego, dopóki istnieje mierzalny czas oczekiwania dla +przynajmniej jednego dysku, oznacza to, że CPU jest wystarczająco szybkie, aby +nadążyć za obciążeniem. +
+
+
+
+
+
+-Z, --force-zero +
+Wymusza niebezpieczną operację synchronizacji pliku o zerowym +rozmiarze, który wcześniej był niezerowy. +Jeśli SnapRAID wykryje taki stan, zatrzymuje przetwarzanie, +chyba że określisz tę opcję. +Pozwala to łatwo wykryć, kiedy po awarii systemu +niektóre dostępne pliki zostały obcięte. +Jest to możliwy stan w systemie Linux z systemami plików ext3/ext4. +Ta opcja może być używana tylko z `sync`. +
+
+
+
+
+
+-E, --force-empty +
+Wymusza niebezpieczną operację synchronizacji dysku z brakującymi +wszystkimi oryginalnymi plikami. +Jeśli SnapRAID wykryje, że brakuje wszystkich plików pierwotnie obecnych +na dysku lub zostały przepisane, zatrzymuje przetwarzanie, +chyba że określisz tę opcję. +Pozwala to łatwo wykryć, kiedy system plików danych nie jest +zamontowany. +Ta opcja może być używana tylko z `sync`. +
+
+
+
+
+
+-U, --force-uuid +
+Wymusza niebezpieczną operację synchronizacji, sprawdzania i naprawiania +z dyskami, które zmieniły swój UUID. +Jeśli SnapRAID wykryje, że niektóre dyski zmieniły UUID, +zatrzymuje przetwarzanie, chyba że określisz tę opcję. +Pozwala to wykryć, kiedy Twoje dyski są zamontowane w +niewłaściwych punktach montowania. +Dozwolona jest jednak pojedyncza zmiana UUID z +pojedynczą parzystością i więcej z wielokrotną parzystością, ponieważ jest to +normalny przypadek podczas wymiany dysków po odzyskaniu. +Ta opcja może być używana tylko z `sync`, `check` lub +`fix`. +
+
+
+
+
+
+-D, --force-device +
+Wymusza niebezpieczną operację naprawiania z niedostępnymi dyskami +lub z dyskami na tym samym urządzeniu fizycznym. +Na przykład, jeśli straciłeś dwa dyski danych i masz zapasowy dysk do odzyskania +tylko pierwszego, możesz zignorować drugi niedostępny dysk. +Lub, jeśli chcesz odzyskać dysk w wolnym miejscu pozostawionym na +już używanym dysku, współdzielącym to samo urządzenie fizyczne. +Ta opcja może być używana tylko z `fix`. +
+
+
+
+
+
+-N, --force-nocopy +
+W `sync`, `check` i `fix`, wyłącza heurystykę wykrywania kopii. +Bez tej opcji SnapRAID zakłada, że pliki o tych samych +atrybutach, takich jak nazwa, rozmiar i znacznik czasu, są kopiami z tymi +samymi danymi. +Pozwala to na identyfikację skopiowanych lub przeniesionych plików z jednego dysku +na inny i ponowne wykorzystanie już obliczonych informacji o haszu +w celu wykrycia cichych błędów lub odzyskania brakujących plików. +W niektórych rzadkich przypadkach to zachowanie może prowadzić do fałszywych alarmów +lub spowolnienia procesu z powodu wielu weryfikacji hasza, a ta +opcja pozwala rozwiązać takie problemy. +Ta opcja może być używana tylko z `sync`, `check` i `fix`. +
+
+
+
+
+
+-F, --force-full +
+W `sync`, wymusza pełne ponowne obliczenie parzystości. +Ta opcja może być używana, gdy dodajesz nowy poziom parzystości lub jeśli +powróciłeś do starego pliku zawartości, używając nowszych danych parzystości. +Zamiast ponownego tworzenia parzystości od podstaw, pozwala to +na ponowne wykorzystanie haszy obecnych w pliku zawartości do walidacji danych +i utrzymania ochrony danych podczas procesu `sync` za pomocą +istniejących danych parzystości. +Ta opcja może być używana tylko z `sync`. +
+
+
+
+
+
+-R, --force-realloc +
+W `sync`, wymusza pełną realokację plików i przebudowę parzystości. +Ta opcja może być używana do całkowitej realokacji wszystkich plików, +usuwając fragmentację, jednocześnie ponownie wykorzystując hasze obecne w pliku zawartości +do walidacji danych. +Ta opcja może być używana tylko z `sync`. +OSTRZEŻENIE! Ta opcja jest tylko dla ekspertów i jest wysoce +zalecane, aby jej nie używać. +NIE MASZ ochrony danych podczas operacji `sync`. +
+
+
+
+
+
+-l, --log FILE +
+Zapisuje szczegółowy log do określonego pliku. +Jeśli ta opcja nie jest określona, nieoczekiwane błędy są drukowane +na ekranie, potencjalnie prowadząc do nadmiernego wyjścia w przypadku +wielu błędów. Gdy -l, --log jest określone, tylko +krytyczne błędy, które powodują zatrzymanie SnapRAID, są drukowane +na ekranie. +Jeśli ścieżka zaczyna się od '>>', plik jest otwierany +w trybie dołączania. Wystąpienia '%D' i '%T' w nazwie są +zastępowane datą i czasem w formacie RRRRMMDD i +GGMMSS. W plikach wsadowych Windows musisz podwoić +znak '%', np. result-%%D.log. Aby użyć '>>', musisz +ujęć nazwę w cudzysłów, np. `">>result.log"`. +Aby wyprowadzić log do standardowego wyjścia lub standardowego błędu, +możesz użyć odpowiednio `">&1"` i `">&2"`. +Opisy tagów logu znajdziesz w pliku snapraid_log.txt lub na stronie podręcznika. +
+
+
+
+
+
+-L, --error-limit NUMBER +
+Ustawia nowy limit błędów przed zatrzymaniem wykonania. +Domyślnie SnapRAID zatrzymuje się, jeśli napotka więcej niż 100 +błędów wejścia/wyjścia, co wskazuje, że dysk prawdopodobnie ulega awarii. +Ta opcja dotyczy `sync` i `scrub`, które mogą +kontynuować po pierwszym zestawie błędów dysku, aby spróbować +ukończyć swoje operacje. +Jednak `check` i `fix` zawsze zatrzymują się przy pierwszym błędzie. +
+
+
+
+
+
+-S, --start BLKSTART +
+Zaczyna przetwarzanie od określonego +numeru bloku. Może to być przydatne do ponownej próby sprawdzenia +lub naprawy określonych bloków w przypadku uszkodzonego dysku. +Ta opcja jest przeznaczona głównie do zaawansowanego ręcznego odzyskiwania. +
+
+
+
+
+
+-B, --count BLKCOUNT +
+Przetwarza tylko określoną liczbę bloków. +Ta opcja jest przeznaczona głównie do zaawansowanego ręcznego odzyskiwania. +
+
+
+
+
+
+-C, --gen-conf CONTENT +
+Generuje atrapę pliku konfiguracyjnego z istniejącego +pliku zawartości. +Plik konfiguracyjny jest zapisywany na standardowe wyjście +i nie nadpisuje istniejącego. +Ten plik konfiguracyjny zawiera również informacje +potrzebne do rekonstrukcji punktów montowania dysków na wypadek +utraty całego systemu. +
+
+
+
+
+
+-v, --verbose +
+Wyświetla więcej informacji na ekranie. +Jeśli określono raz, drukuje wykluczone pliki +i dodatkowe statystyki. +Ta opcja nie ma wpływu na pliki logów. +
+
+
+
+
+
+-q, --quiet +
+Wyświetla mniej informacji na ekranie. +Jeśli określono raz, usuwa pasek postępu; dwa razy, +bieżące operacje; trzy razy, komunikaty informacyjne; cztery razy, +komunikaty statusu. +Krytyczne błędy są zawsze drukowane na ekranie. +Ta opcja nie ma wpływu na pliki logów. +
+
+
+
+
+
+-H, --help +
+Wyświetla krótki ekran pomocy. +
+
+
+
+
+
+-V, --version +
+Wyświetla wersję programu. +
+
+
+
+
+

+Configuration +

+

SnapRAID wymaga pliku konfiguracyjnego, aby wiedzieć, gdzie znajduje się Twoja macierz +dysków i gdzie przechowywać informacje o parzystości. +

W systemie Unix używa pliku `/usr/local/etc/snapraid.conf`, jeśli istnieje, +w przeciwnym razie `/etc/snapraid.conf`. +W systemie Windows używa pliku `snapraid.conf` w tym samym +katalogu co `snapraid.exe`. +

Musi zawierać następujące opcje (uwzględniające wielkość liter): +

+

+parity FILE [,FILE] ... +

+

Definiuje pliki do użycia do przechowywania informacji o parzystości. +Parzystość umożliwia ochronę przed awarią pojedynczego dysku, +podobnie jak w RAID5. +

Możesz określić wiele plików, które muszą znajdować się na różnych dyskach. +Gdy plik nie może już rosnąć, używany jest następny. +Całkowita dostępna przestrzeń musi być co najmniej tak duża jak największy dysk danych w +macierzy. +

Możesz dodać dodatkowe pliki parzystości później, ale nie możesz +ich zmieniać kolejności ani usuwać. +

Trzymanie dysków parzystości zarezerwowanych dla parzystości zapewnia, że +nie ulegną fragmentacji, co poprawia wydajność. +

W systemie Windows 256 MB jest pozostawione niewykorzystane na każdym dysku, aby uniknąć +ostrzeżenia o pełnych dyskach. +

Ta opcja jest obowiązkowa i może być używana tylko raz. +

+
+

+(2,3,4,5,6)-parity FILE [,FILE] ... +

+

Definiuje pliki do użycia do przechowywania dodatkowych informacji o parzystości. +

Dla każdego określonego poziomu parzystości włączany jest jeden dodatkowy +poziom ochrony: +

    +
  • +2-parity włącza podwójną parzystość RAID6. +
  • +
  • +3-parity włącza potrójną parzystość. +
  • +
  • +4-parity włącza poczwórną (cztery) parzystość. +
  • +
  • +5-parity włącza pięciokrotną (pięć) parzystość. +
  • +
  • +6-parity włącza sześciokrotną (sześć) parzystość. +
  • +
+

Każdy poziom parzystości wymaga obecności wszystkich poprzednich poziomów parzystości. +

Obowiązują te same uwagi, co dla opcji 'parity'. +

Te opcje są opcjonalne i mogą być używane tylko raz. +

+
+

+z-parity FILE [,FILE] ... +

+

Definiuje alternatywny plik i format do przechowywania potrójnej parzystości. +

Ta opcja jest alternatywą dla '3-parity', przeznaczoną głównie dla +procesorów niskiej klasy, takich jak ARM lub AMD Phenom, Athlon i Opteron, +które nie obsługują zestawu instrukcji SSSE3. W takich przypadkach zapewnia +lepszą wydajność. +

Ten format jest podobny, ale szybszy niż ten używany przez ZFS RAIDZ3. +Podobnie jak ZFS, nie działa powyżej potrójnej parzystości. +

Podczas używania '3-parity' zostaniesz ostrzeżony, jeśli zaleca się użycie +formatu 'z-parity' w celu poprawy wydajności. +

Możliwa jest konwersja z jednego formatu na inny poprzez dostosowanie +pliku konfiguracyjnego z pożądanym plikiem z-parity lub 3-parity +i użycie 'fix' do jego ponownego utworzenia. +

+
+

+content FILE +

+

Definiuje plik do użycia do przechowywania listy i sum kontrolnych wszystkich +plików obecnych w Twojej macierzy dysków. +

Może być umieszczony na dysku używanym do danych, parzystości lub +każdym innym dostępnym dysku. +Jeśli użyjesz dysku danych, ten plik jest automatycznie wykluczony +z procesu `sync`. +

Ta opcja jest obowiązkowa i może być używana wielokrotnie do zapisania +wielu kopii tego samego pliku. +

Musisz przechowywać co najmniej jedną kopię dla każdego używanego dysku parzystości +plus jeden. Używanie dodatkowych kopii nie szkodzi. +

+
+

+data NAME DIR +

+

Definiuje nazwę i punkt montowania dysków danych w +macierzy. NAME służy do identyfikacji dysku i musi +być unikalna. DIR to punkt montowania dysku w +systemie plików. +

Możesz zmieniać punkt montowania w razie potrzeby, o ile +zachowasz stałą nazwę NAME. +

Powinieneś użyć jednej opcji dla każdego dysku danych w macierzy. +

Możesz później zmienić nazwę dysku, zmieniając bezpośrednio nazwę NAME +w pliku konfiguracyjnym, a następnie uruchamiając polecenie 'sync'. +W przypadku zmiany nazwy, skojarzenie odbywa się za pomocą zapisanego +UUID dysków. +

+
+

+nohidden +

+

Wyklucza wszystkie ukryte pliki i katalogi. +W systemie Unix ukryte pliki to te zaczynające się od `.`. +W systemie Windows są to te z atrybutem ukrycia. +

+
+

+exclude/include PATTERN +

+

Definiuje wzorce plików lub katalogów do wykluczenia lub włączenia +do procesu synchronizacji. +Wszystkie wzorce są przetwarzane w określonej kolejności. +

Jeśli pierwszy pasujący wzorzec jest `exclude`, plik +jest wykluczony. Jeśli jest to `include`, plik jest włączony. +Jeśli żaden wzorzec nie pasuje, plik jest wykluczony, jeśli ostatni określony +wzorzec to `include`, lub włączony, jeśli ostatni określony wzorzec to `exclude`. +

Zobacz sekcję PATTERN, aby uzyskać więcej szczegółów na temat specyfikacji +wzorców. +

Ta opcja może być używana wielokrotnie. +

+
+

+blocksize SIZE_IN_KIBIBYTES +

+

Definiuje podstawowy rozmiar bloku w kibibajtach dla parzystości. +Jeden kibibajt to 1024 bajty. +

Domyślny rozmiar bloku to 256, co powinno działać w większości przypadków. +

OSTRZEŻENIE! Ta opcja jest tylko dla ekspertów i jest wysoce +zalecane, aby nie zmieniać tej wartości. Aby zmienić tę wartość w przyszłości, +będziesz musiał ponownie utworzyć całą parzystość! +

Powodem użycia innego rozmiaru bloku jest posiadanie wielu małych +plików, rzędu milionów. +

Dla każdego pliku, nawet jeśli ma tylko kilka bajtów, alokowany jest cały blok parzystości, +a przy wielu plikach może to skutkować znaczną nieużywaną przestrzenią parzystości. +Kiedy całkowicie wypełnisz dysk parzystości, nie możesz +dodawać więcej plików do dysków danych. +Jednak marnowana parzystość nie gromadzi się na dyskach danych. Marnowane miejsce +wynikające z dużej liczby plików na dysku danych ogranicza tylko +ilość danych na tym dysku danych, a nie na innych. +

Jako przybliżenie, możesz założyć, że połowa rozmiaru bloku jest +marnowana dla każdego pliku. Na przykład, z 100 000 plików i rozmiarem bloku 256 KiB, +zmarnujesz 12,8 GB parzystości, co może skutkować +12,8 GB mniejszą dostępną przestrzenią na dysku danych. +

Możesz sprawdzić ilość zmarnowanego miejsca na każdym dysku za pomocą `status`. +Jest to ilość miejsca, którą musisz pozostawić wolną na dyskach danych +lub użyć dla plików nie włączonych do macierzy. +Jeśli ta wartość jest ujemna, oznacza to, że jesteś blisko wypełnienia +parzystości i reprezentuje to przestrzeń, którą nadal możesz zmarnować. +

Aby uniknąć tego problemu, możesz użyć większej partycji dla parzystości. +Na przykład, jeśli partycja parzystości jest o 12,8 GB większa niż dyski danych, +masz wystarczająco dużo dodatkowego miejsca, aby obsłużyć do 100 000 +plików na każdym dysku danych bez marnowania miejsca. +

Sztuczką, aby uzyskać większą partycję parzystości w systemie Linux, jest sformatowanie jej +za pomocą polecenia: +

+mkfs.ext4 -m 0 -T largefile4 DEVICE
+
+

Daje to około 1,5% dodatkowego miejsca, około 60 GB dla +dysku 4 TB, co pozwala na około 460 000 plików na każdym dysku danych bez +marnowania miejsca. +

+
+

+hashsize SIZE_IN_BYTES +

+

Definiuje rozmiar hasza w bajtach dla zapisanych bloków. +

Domyślny rozmiar hasza to 16 bajtów (128 bitów), co powinno działać +w większości przypadków. +

OSTRZEŻENIE! Ta opcja jest tylko dla ekspertów i jest wysoce +zalecane, aby nie zmieniać tej wartości. Aby zmienić tę wartość w przyszłości, +będziesz musiał ponownie utworzyć całą parzystość! +

Powodem użycia innego rozmiaru hasza jest to, że Twój system ma +ograniczoną pamięć. Z reguły, SnapRAID zwykle wymaga +1 GiB pamięci RAM na każde 16 TB danych w macierzy. +

Konkretnie, aby przechowywać hasze danych, SnapRAID wymaga +około TS*(1+HS)/BS bajtów pamięci RAM, +gdzie TS to całkowity rozmiar w bajtach Twojej macierzy dysków, BS to +rozmiar bloku w bajtach, a HS to rozmiar hasza w bajtach. +

Na przykład, z 8 dyskami po 4 TB, rozmiarem bloku 256 KiB +(1 KiB = 1024 bajty) i rozmiarem hasza 16, otrzymujesz: +

+RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1,93 GiB
+
+

Przełączając się na rozmiar hasza 8, otrzymujesz: +

+RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1,02 GiB
+
+

Przełączając się na rozmiar bloku 512, otrzymujesz: +

+RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0,96 GiB
+
+

Przełączając się zarówno na rozmiar hasza 8, jak i rozmiar bloku 512, otrzymujesz: +

+RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0,51 GiB
+
+
+
+

+autosave SIZE_IN_GIGABYTES +

+

Automatycznie zapisuje stan podczas synchronizacji lub sprawdzania po przetworzeniu +określonej ilości GB. +Ta opcja jest przydatna, aby uniknąć ponownego uruchamiania długich poleceń `sync` +od zera, jeśli zostaną przerwane przez awarię maszyny lub inne zdarzenie. +

+
+

+temp_limit TEMPERATURE_CELSIUS +

+

Ustawia maksymalną dozwoloną temperaturę dysku w stopniach Celsjusza. Po określeniu, +SnapRAID okresowo sprawdza temperaturę wszystkich dysków za pomocą +narzędzia smartctl. Aktualne temperatury dysków są wyświetlane podczas +działania SnapRAID. Jeśli którykolwiek dysk przekroczy ten limit, wszystkie operacje +zostają zatrzymane, a dyski są zatrzymywane (przechodzą w stan gotowości) na czas +zdefiniowany przez opcję `temp_sleep`. Po okresie uśpienia, operacje +są wznawiane, potencjalnie ponownie zatrzymując się, jeśli limit temperatury +zostanie ponownie osiągnięty. +

Podczas działania SnapRAID analizuje również krzywą nagrzewania każdego +dysku i szacuje długoterminową stałą temperaturę, którą mają +osiągnąć, jeśli aktywność będzie kontynuowana. Oszacowanie jest wykonywane tylko po +czterokrotnym wzroście temperatury dysku, co zapewnia, że +dostępnych jest wystarczająco dużo punktów danych do ustalenia wiarygodnego trendu. +Ta przewidywana stała temperatura jest pokazywana w nawiasach obok +aktualnej wartości i pomaga ocenić, czy chłodzenie systemu jest +odpowiednie. Ta szacowana temperatura ma charakter wyłącznie informacyjny +i nie ma wpływu na zachowanie SnapRAID. Działania programu +opierają się wyłącznie na faktycznie zmierzonych temperaturach dysków. +

Aby wykonać tę analizę, SnapRAID potrzebuje odniesienia dla temperatury systemu. +Najpierw próbuje odczytać ją z dostępnych czujników sprzętowych. +Jeśli nie można uzyskać dostępu do żadnego czujnika systemu, jako awaryjne odniesienie +wykorzystuje najniższą temperaturę dysku zmierzoną na początku uruchomienia. +

Normalnie SnapRAID pokazuje tylko temperaturę najgorętszego dysku. +Aby wyświetlić temperaturę wszystkich dysków, użyj opcji -A lub --stats. +

+
+

+temp_sleep TIME_IN_MINUTES +

+

Ustawia czas gotowości, w minutach, po osiągnięciu limitu temperatury. +W tym okresie dyski pozostają zatrzymane. Domyślnie jest to 5 minut. +

+
+

+pool DIR +

+

Definiuje katalog puli, w którym tworzony jest wirtualny widok macierzy +dysków za pomocą polecenia `pool`. +

Katalog musi już istnieć. +

+
+

+share UNC_DIR +

+

Definiuje ścieżkę UNC Windows wymaganą do zdalnego dostępu do dysków. +

Jeśli ta opcja jest określona, dowiązania symboliczne utworzone w katalogu puli +używają tej ścieżki UNC do dostępu do dysków. +Bez tej opcji generowane dowiązania symboliczne używają tylko ścieżek lokalnych, +co nie pozwala na udostępnianie katalogu puli w sieci. +

Dowiązania symboliczne są tworzone przy użyciu określonej ścieżki UNC, +dodając nazwę dysku określoną w opcji `data`, a na końcu dodając +katalog i nazwę pliku. +

Ta opcja jest wymagana tylko dla systemu Windows. +

+
+

+smartctl DISK/PARITY OPTIONS... +

+

Definiuje niestandardowe opcje smartctl do uzyskania atrybutów SMART dla +każdego dysku. Może to być wymagane dla kontrolerów RAID i niektórych dysków USB, +których nie można wykryć automatycznie. Symbol zastępczy %s jest zastępowany +nazwą urządzenia, ale jest opcjonalny dla stałych urządzeń, takich jak kontrolery RAID. +

DISK to ta sama nazwa dysku określona w opcji `data`. +PARITY to jedna z nazw parzystości: `parity`, `2-parity`, `3-parity`, +`4-parity`, `5-parity`, `6-parity` lub `z-parity`. +

W określonych OPCJACH ciąg `%s` jest zastępowany +nazwą urządzenia. W przypadku kontrolerów RAID, urządzenie jest +prawdopodobnie stałe i może nie być konieczne użycie `%s`. +

Zapoznaj się z dokumentacją smartmontools, aby uzyskać możliwe opcje: +

+https://www.smartmontools.org/wiki/Supported_RAID-Controllers
+https://www.smartmontools.org/wiki/Supported_USB-Devices
+
+

Na przykład: +

+smartctl parity -d sat %s
+
+
+
+

+smartignore DISK/PARITY ATTR [ATTR...] +

+

Ignoruje określony atrybut SMART podczas obliczania prawdopodobieństwa +awarii dysku. Ta opcja jest przydatna, jeśli dysk zgłasza nietypowe lub +wprowadzające w błąd wartości dla określonego atrybutu. +

DISK to ta sama nazwa dysku określona w opcji `data`. +PARITY to jedna z nazw parzystości: `parity`, `2-parity`, `3-parity`, +`4-parity`, `5-parity`, `6-parity` lub `z-parity`. +Specjalna wartość * może być użyta do zignorowania atrybutu na wszystkich dyskach. +

Na przykład, aby zignorować atrybut `Current Pending Sector Count` na +wszystkich dyskach: +

+smartignore * 197
+
+

Aby zignorować go tylko na pierwszym dysku parzystości: +

+smartignore parity 197
+
+
+
+

+Examples +

+

Przykład typowej konfiguracji dla systemu Unix: +

+parity /mnt/diskp/snapraid.parity
+content /mnt/diskp/snapraid.content
+content /var/snapraid/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+exclude /lost+found/
+exclude /tmp/
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/sg0
+smartctl 2-parity -d areca,2/1 /dev/sg0
+
+

Przykład typowej konfiguracji dla systemu Windows: +

+parity E:\snapraid.parity
+content E:\snapraid.content
+content C:\snapraid\snapraid.content
+data d1 G:\array\
+data d2 H:\array\
+data d3 I:\array\
+exclude Thumbs.db
+exclude \$RECYCLE.BIN
+exclude \System Volume Information
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/arcmsr0
+smartctl 2-parity -d areca,2/1 /dev/arcmsr0
+
+
+
+
+

+Pattern +

+

Wzorce zapewniają elastyczny sposób filtrowania plików do uwzględnienia lub +wykluczenia. Używając znaków globbingowych, można zdefiniować reguły, które +pasują do określonych nazw plików lub całych struktur katalogów bez +ręcznego wymieniania każdej ścieżki. +

Znak zapytania `?` dopasowuje dowolny pojedynczy znak z wyjątkiem +separatora katalogów. Dzięki temu jest przydatny do dopasowywania nazw plików ze +zmiennymi znakami, przy jednoczesnym ograniczeniu wzorca do jednego poziomu katalogu. +

Pojedyncza gwiazdka `*` dopasowuje dowolną sekwencję znaków, ale podobnie jak +znak zapytania, nigdy nie przekracza granic katalogów. Zatrzymuje się na +ukośniku, co czyni ją odpowiednią do dopasowywania w obrębie jednego +składnika ścieżki. Jest to standardowe zachowanie symboli wieloznacznych znane +z globbingu powłoki (shell). +

Podwójna gwiazdka `**` jest potężniejsza, dopasowuje dowolną sekwencję +znaków, w tym separatory katalogów. Pozwala to wzorcom dopasowywać się +na wielu poziomach katalogów. Gdy `**` pojawia się bezpośrednio wewnątrz +wzorca, może dopasować zero lub więcej znaków, w tym ukośniki między +otaczającym tekstem dosłownym. +

Najważniejszym zastosowaniem `**` jest specjalna forma `/**/`. Dopasowuje ona +zero lub więcej pełnych poziomów katalogów, umożliwiając dopasowanie plików +na dowolnej głębokości w drzewie katalogów bez znajomości dokładnej struktury ścieżki. +Na przykład wzorzec `src/**/main.js` pasuje do `src/main.js` (pomijając +zero katalogów), `src/ui/main.js` (pomijając jeden katalog) oraz +`src/ui/components/main.js` (pomijając dwa katalogi). +

Klasy znaków używające nawiasów kwadratowych `[]` dopasowują pojedynczy znak z +określonego zestawu lub zakresu. Podobnie jak inne wzorce pojedynczych znaków, +nie pasują one do separatorów katalogów. Klasy obsługują zakresy i negację za pomocą +wykrzyknika. +

Podstawową różnicą, o której należy pamiętać, jest to, że `*`, `?` i klasy znaków +wszystkie respektują granice katalogów i dopasowują się tylko w obrębie jednego +składnika ścieżki, podczas gdy `**` jest jedynym wzorcem, który może dopasowywać się poprzez +separatory katalogów. +

Istnieją cztery różne typy wzorców: +

+
+
+FILE +
+Wybiera dowolny plik o nazwie FILE. +Ten wzorzec dotyczy tylko plików, a nie katalogów. +
+
+
+
+
+
+DIR/ +
+Wybiera dowolny katalog o nazwie DIR i wszystko, co się w nim znajduje. +Ten wzorzec dotyczy tylko katalogów, a nie plików. +
+
+
+
+
+
+/PATH/FILE +
+Wybiera dokładnie określoną ścieżkę pliku. Ten wzorzec dotyczy +tylko plików, a nie katalogów. +
+
+
+
+
+
+/PATH/DIR/ +
+Wybiera dokładnie określoną ścieżkę katalogu i wszystko, co się w nim +znajduje. Ten wzorzec dotyczy tylko katalogów, a nie plików. +
+
+
+

Gdy określisz ścieżkę bezwzględną zaczynającą się od /, jest ona stosowana w +katalogu głównym macierzy, a nie w katalogu głównym lokalnego systemu plików. +

W systemie Windows możesz użyć ukośnika odwrotnego \ zamiast ukośnika /. +Katalogi systemowe Windows, połączenia, punkty montowania i inne +specjalne katalogi Windows są traktowane jako pliki, co oznacza, że aby je +wykluczyć, musisz użyć reguły pliku, a nie katalogu. +

Jeśli nazwa pliku zawiera znak '*', '?', '[', +lub ']', musisz go uciec, aby uniknąć interpretacji jako +znaku globbing. W systemie Unix znakiem ucieczki jest '\'; w systemie Windows jest to '^'. +Gdy wzorzec znajduje się w wierszu poleceń, musisz podwoić znak ucieczki, +aby uniknąć interpretacji przez powłokę poleceń. +

W pliku konfiguracyjnym możesz użyć różnych strategii do filtrowania +plików do przetworzenia. +Najprostszym podejściem jest użycie tylko reguł `exclude`, aby usunąć wszystkie +pliki i katalogi, których nie chcesz przetwarzać. Na przykład: +

+# Wyklucza dowolny plik o nazwie `*.unrecoverable`
+exclude *.unrecoverable
+# Wyklucza katalog główny `/lost+found`
+exclude /lost+found/
+# Wyklucza dowolny podkatalog o nazwie `tmp`
+exclude tmp/
+
+

Odwrotnym podejściem jest zdefiniowanie tylko plików, które chcesz przetwarzać, +używając tylko reguł `include`. Na przykład: +

+# Włącza tylko niektóre katalogi
+include /movies/
+include /musics/
+include /pictures/
+
+

Ostatecznym podejściem jest mieszanie reguł `exclude` i `include`. W tym przypadku +kolejność reguł jest ważna. Wcześniejsze reguły mają +pierwszeństwo przed późniejszymi. +Aby uprościć, możesz najpierw wymienić wszystkie reguły `exclude`, a następnie +wszystkie reguły `include`. Na przykład: +

+# Wyklucza dowolny plik o nazwie `*.unrecoverable`
+exclude *.unrecoverable
+# Wyklucza dowolny podkatalog o nazwie `tmp`
+exclude tmp/
+# Włącza tylko niektóre katalogi
+include /movies/
+include /musics/
+include /pictures/
+
+

W wierszu poleceń, używając opcji -f, możesz użyć tylko wzorców `include`. +Na przykład: +

+# Sprawdza tylko pliki .mp3.
+# W systemie Unix użyj cudzysłowów, aby uniknąć rozszerzenia globbing przez powłokę.
+snapraid -f "*.mp3" check
+
+

W systemie Unix, używając znaków globbing w wierszu poleceń, musisz +je cytować, aby zapobiec ich rozszerzeniu przez powłokę. +

+
+

+Ignore File +

+

Oprócz reguł globalnych w pliku konfiguracyjnym, możesz umieścić pliki +`.snapraidignore` w dowolnym katalogu w macierzy, aby zdefiniować +zdecentralizowane reguły wykluczania. +

Reguły zdefiniowane w `.snapraidignore` są stosowane po regułach w pliku +konfiguracyjnym. Oznacza to, że mają one wyższy priorytet i mogą być używane +do wykluczania plików, które zostały wcześniej uwzględnione przez konfigurację +globalną. Skutecznie, jeśli reguła lokalna pasuje, plik jest wykluczany bez +względu na globalne ustawienia uwzględniania. +

Logika wzorców w `.snapraidignore` odzwierciedla konfigurację globalną, ale +zakotwicza wzorce w katalogu, w którym znajduje się plik: +

+
+
+FILE +
+Wybiera dowolny plik o nazwie FILE w tym katalogu lub poniżej. +Podlega to tym samym zasadom dopasowywania (globbing) co wzorzec globalny. +
+
+
+
+
+
+DIR/ +
+Wybiera dowolny katalog o nazwie DIR i wszystko w jego wnętrzu, +znajdujący się w tym katalogu lub poniżej. +
+
+
+
+
+
+/PATH/FILE +
+Wybiera dokładnie określony plik względem lokalizacji +pliku `.snapraidignore`. +
+
+
+
+
+
+/PATH/DIR/ +
+Wybiera dokładnie określony katalog i wszystko w jego wnętrzu, +względem lokalizacji pliku `.snapraidignore`. +
+
+
+

W przeciwieństwie do konfiguracji globalnej, pliki `.snapraidignore` obsługują +tylko reguły wykluczania; nie można używać wzorców `include` ani negacji (!). +

Na przykład, jeśli masz `.snapraidignore` w `/mnt/disk1/projects/`: +

+# Wyklucza TYLKO /mnt/disk1/projects/output.bin
+/output.bin
+# Wyklucza każdy katalog o nazwie 'build' wewnątrz projects/
+build/
+# Wyklucza każdy plik .tmp wewnątrz projects/ lub jego podfolderach
+*.tmp
+
+
+
+

+Content +

+

SnapRAID przechowuje listę i sumy kontrolne Twoich plików w pliku zawartości. +

Jest to plik binarny, który zawiera listę wszystkich plików obecnych w Twojej macierzy dysków, +wraz ze wszystkimi sumami kontrolnymi w celu weryfikacji ich integralności. +

Ten plik jest odczytywany i zapisywany przez polecenia `sync` i `scrub` +oraz odczytywany przez polecenia `fix`, `check` i `status`. +

+
+

+Parity +

+

SnapRAID przechowuje informacje o parzystości Twojej macierzy w plikach +parzystości. +

Są to pliki binarne zawierające obliczoną parzystość wszystkich +bloków zdefiniowanych w pliku `content`. +

Pliki te są odczytywane i zapisywane przez polecenia `sync` i `fix` +oraz tylko odczytywane przez polecenia `scrub` i `check`. +

+
+

+Encoding +

+

SnapRAID w systemie Unix ignoruje wszelkie kodowanie. Odczytuje i przechowuje +nazwy plików z tym samym kodowaniem używanym przez system plików. +

W systemie Windows wszystkie nazwy odczytane z systemu plików są konwertowane i +przetwarzane w formacie UTF-8. +

Aby nazwy plików były poprawnie drukowane, musisz ustawić konsolę Windows +na tryb UTF-8 za pomocą polecenia `chcp 65001` i użyć +czcionki TrueType, takiej jak `Lucida Console`, jako czcionki konsoli. +Dotyczy to tylko drukowanych nazw plików; jeśli +przekierujesz wyjście konsoli do pliku, wynikowy plik jest zawsze +w formacie UTF-8. +

+ + +
+
+
+ + + + + + + diff --git a/beta/manual-pt.html b/beta/manual-pt.html new file mode 100644 index 00000000..e3efab8d --- /dev/null +++ b/beta/manual-pt.html @@ -0,0 +1,2016 @@ + + + + + + + + SnapRAID Manual + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + +
+ +
+ +
+

+Sinopse +

+
+snapraid [-c, --conf CONFIG]
+    [-f, --filter PATTERN] [-d, --filter-disk NAME]
+    [-m, --filter-missing] [-e, --filter-error]
+    [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR]
+    [-p, --plan PERC|bad|new|full]
+    [-o, --older-than DAYS] [-l, --log FILE]
+    [-s, --spin-down-on-error] [-w, --bw-limit RATE]
+    [-Z, --force-zero] [-E, --force-empty]
+    [-U, --force-uuid] [-D, --force-device]
+    [-N, --force-nocopy] [-F, --force-full]
+    [-R, --force-realloc]
+    [-S, --start BLKSTART] [-B, --count BLKCOUNT]
+    [-L, --error-limit NUMBER]
+    [-A, --stats]
+    [-v, --verbose] [-q, --quiet]
+    status|smart|probe|up|down|diff|sync|scrub|fix|check
+    |list|dup|pool|devices|touch|rehash
+
+
+snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT]
+
+
+
+

+Descrição +

+

SnapRAID é um programa de backup projetado para arrays de disco, +armazenando informações de paridade para recuperação de dados no +caso de até seis falhas de disco. +

Destinado principalmente a centros de mídia domésticos com arquivos +grandes e que mudam com pouca frequência, o SnapRAID oferece vários recursos: +

    +
  • +Você pode utilizar discos já preenchidos com arquivos sem a +necessidade de reformatá-los, acessando-os normalmente. +
  • +
  • +Todos os seus dados são submetidos a hash para garantir a integridade +dos dados e prevenir corrupção silenciosa. +
  • +
  • +Quando o número de discos com falha excede a contagem de paridade, +a perda de dados é confinada aos discos afetados; os dados em +outros discos permanecem acessíveis. +
  • +
  • +Se você acidentalmente excluir arquivos em um disco, a recuperação é +possível. +
  • +
  • +Os discos podem ter tamanhos diferentes. +
  • +
  • +Você pode adicionar discos a qualquer momento. +
  • +
  • +O SnapRAID não prende seus dados; você pode parar de usá-lo +a qualquer momento sem reformatar ou mover dados. +
  • +
  • +Para acessar um arquivo, apenas um único disco precisa girar (spin), +economizando energia e reduzindo o ruído. +
  • +
+

Para mais informações, visite o site oficial do SnapRAID: +

+https://www.snapraid.it/
+
+
+
+

+Limitações +

+

SnapRAID é um híbrido entre um programa RAID e um programa de backup, +visando combinar os melhores benefícios de ambos. No entanto, ele tem +algumas limitações que você deve considerar antes de usá-lo. +

A principal limitação é que, se um disco falhar e você não tiver +sincronizado recentemente, talvez não consiga recuperar totalmente. +Mais especificamente, você pode não conseguir recuperar até o tamanho dos +arquivos alterados ou excluídos desde a última operação de sincronização. +Isso ocorre mesmo que os arquivos alterados ou excluídos não estejam no +disco com falha. É por isso que o SnapRAID é mais adequado para +dados que raramente mudam. +

Por outro lado, arquivos recém-adicionados não impedem a recuperação de +arquivos já existentes. Você perderá apenas os arquivos adicionados +recentemente se estiverem no disco com falha. +

Outras limitações do SnapRAID são: +

    +
  • +Com o SnapRAID, você ainda tem sistemas de arquivos separados para cada disco. +Com o RAID, você obtém um único sistema de arquivos grande. +
  • +
  • +O SnapRAID não faz striping de dados. +Com o RAID, você obtém um aumento de velocidade com striping. +
  • +
  • +O SnapRAID não suporta recuperação em tempo real. +Com o RAID, você não precisa parar de trabalhar quando um disco falha. +
  • +
  • +O SnapRAID pode recuperar dados apenas de um número limitado de falhas de disco. +Com um backup, você pode recuperar de uma falha completa +de todo o array de discos. +
  • +
  • +Apenas nomes de arquivos, carimbos de data/hora, symlinks e hardlinks +são salvos. Permissões, propriedade e atributos estendidos não são salvos. +
  • +
+
+
+

+Primeiros Passos +

+

Para usar o SnapRAID, você precisa primeiro selecionar um disco em seu array +de discos para dedicar às informações de `parity` (paridade). Com um +disco para paridade, você poderá recuperar de uma única falha de disco, +semelhante ao RAID5. +

Se você quiser recuperar de mais falhas de disco, semelhante ao RAID6, +você deve reservar discos adicionais para paridade. Cada disco de paridade +adicional permite a recuperação de mais uma falha de disco. +

Como discos de paridade, você deve escolher os maiores discos do array, +pois a informação de paridade pode crescer até o tamanho do maior +disco de dados no array. +

Esses discos serão dedicados a armazenar os arquivos de `parity`. +Você não deve armazenar seus dados neles. +

Em seguida, você deve definir os discos de `data` (dados) que deseja proteger +com o SnapRAID. A proteção é mais eficaz se esses discos +contiverem dados que raramente mudam. Por esse motivo, é melhor +NÃO incluir o disco C:\ do Windows ou os diretórios /home, /var e /tmp +do Unix. +

A lista de arquivos é salva nos arquivos de `content` (conteúdo), geralmente +armazenados nos discos de dados, paridade ou boot. +Este arquivo contém os detalhes do seu backup, incluindo todos os +checksums para verificar sua integridade. +O arquivo de `content` é armazenado em várias cópias, e cada cópia deve +estar em um disco diferente para garantir que, mesmo em caso de múltiplas +falhas de disco, pelo menos uma cópia esteja disponível. +

Por exemplo, suponha que você esteja interessado em apenas um nível de +proteção de paridade, e seus discos estejam localizados em: +

+/mnt/diskp <- disco selecionado para paridade
+/mnt/disk1 <- primeiro disco a proteger
+/mnt/disk2 <- segundo disco a proteger
+/mnt/disk3 <- terceiro disco a proteger
+
+

Você deve criar o arquivo de configuração /etc/snapraid.conf com +as seguintes opções: +

+parity /mnt/diskp/snapraid.parity
+content /var/snapraid/snapraid.content
+content /mnt/disk1/snapraid.content
+content /mnt/disk2/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+
+

Se você estiver no Windows, deve usar o formato de caminho do Windows, com +letras de unidade e barras invertidas em vez de barras. +

+parity E:\snapraid.parity
+content C:\snapraid\snapraid.content
+content F:\array\snapraid.content
+content G:\array\snapraid.content
+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+
+

Se você tiver muitos discos e ficar sem letras de unidade, pode montar +discos diretamente em subpastas. Consulte: +

+https://www.google.com/search?q=Windows+mount+point
+
+

Neste ponto, você está pronto para executar o comando `sync` para construir +as informações de paridade. +

+snapraid sync
+
+

Este processo pode levar várias horas na primeira vez, dependendo do +tamanho dos dados já presentes nos discos. Se os discos estiverem vazios, +o processo é imediato. +

Você pode pará-lo a qualquer momento pressionando Ctrl+C e, na próxima +execução, ele será retomado de onde foi interrompido. +

Quando este comando for concluído, seus dados estarão SEGUROS. +

Agora você pode começar a usar seu array como quiser e periodicamente +atualizar as informações de paridade executando o comando `sync`. +

+

+Scrubbing +

+

Para verificar periodicamente os dados e a paridade em busca de erros, +você pode executar o comando `scrub`. +

+snapraid scrub
+
+

Este comando compara os dados em seu array com o hash calculado +durante o comando `sync` para verificar a integridade. +

Cada execução do comando verifica aproximadamente 8% do array, excluindo +dados já examinados nos 10 dias anteriores. +Você pode usar a opção -p, --plan para especificar uma quantidade diferente +e a opção -o, --older-than para especificar uma idade diferente em dias. +Por exemplo, para verificar 5% do array em busca de blocos com mais de +20 dias, use: +

+snapraid -p 5 -o 20 scrub
+
+

Se erros silenciosos ou de entrada/saída forem encontrados durante o processo, +os blocos correspondentes serão marcados como ruins no arquivo de `content` +e listados no comando `status`. +

+snapraid status
+
+

Para corrigi-los, você pode usar o comando `fix`, filtrando por blocos +ruins com a opção -e, --filter-error: +

+snapraid -e fix
+
+

Na próxima execução de `scrub`, os erros desaparecerão do relatório de `status` +se estiverem realmente corrigidos. Para torná-lo mais rápido, você pode usar +-p bad para examinar apenas blocos marcados como ruins. +

+snapraid -p bad scrub
+
+

Executar `scrub` em um array não sincronizado pode relatar erros causados por +arquivos removidos ou modificados. Esses erros são relatados na saída de `scrub`, +mas os blocos relacionados não são marcados como ruins. +

+
+

+Pooling +

+

Nota: O recurso de pooling descrito abaixo foi substituído pela ferramenta +mergefs, que agora é a opção recomendada para usuários Linux na comunidade +SnapRAID. Mergefs oferece uma maneira mais flexível e eficiente de agrupar +várias unidades em um único ponto de montagem unificado, permitindo acesso +perfeito a arquivos em todo o seu array sem depender de links simbólicos. +Ele se integra bem ao SnapRAID para proteção de paridade e é comumente usado +em configurações como OpenMediaVault (OMV) ou configurações NAS personalizadas. +

Para ter todos os arquivos em seu array mostrados na mesma árvore de +diretórios, você pode habilitar o recurso de `pooling`. Ele cria uma +visualização virtual somente leitura de todos os arquivos em seu array +usando links simbólicos. +

Você pode configurar o diretório de `pooling` no arquivo de configuração com: +

+pool /pool
+
+

ou, se você estiver no Windows, com: +

+pool C:\pool
+
+

e, em seguida, executar o comando `pool` para criar ou atualizar a +visualização virtual. +

+snapraid pool
+
+

Se você estiver usando uma plataforma Unix e quiser compartilhar este +diretório pela rede com máquinas Windows ou Unix, você deve adicionar +as seguintes opções ao seu /etc/samba/smb.conf: +

+# Na seção global de smb.conf
+unix extensions = no
+
+
+# Na seção de compartilhamento de smb.conf
+[pool]
+comment = Pool
+path = /pool
+read only = yes
+guest ok = yes
+wide links = yes
+follow symlinks = yes
+
+

No Windows, compartilhar links simbólicos por uma rede requer que os +clientes os resolvam remotamente. Para habilitar isso, além de +compartilhar o diretório do pool, você também deve compartilhar todos +os discos de forma independente, usando os nomes de disco definidos no +arquivo de configuração como pontos de compartilhamento. Você também +deve especificar na opção `share` do arquivo de configuração o caminho +UNC do Windows que os clientes remotos precisam usar para acessar +esses discos compartilhados. +

Por exemplo, operando a partir de um servidor chamado `darkstar`, você +pode usar as opções: +

+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+pool C:\pool
+share \\darkstar
+
+

e compartilhar os seguintes diretórios pela rede: +

+\\darkstar\pool -> C:\pool
+\\darkstar\d1 -> F:\array
+\\darkstar\d2 -> G:\array
+\\darkstar\d3 -> H:\array
+
+

para permitir que clientes remotos acessem todos os arquivos em \\darkstar\pool. +

Você também pode precisar configurar clientes remotos para habilitar +o acesso a symlinks remotos com o comando: +

+fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
+
+
+
+

+Desexcluir (Undeleting) +

+

O SnapRAID funciona mais como um programa de backup do que como um sistema +RAID, e pode ser usado para restaurar ou desexcluir arquivos para seu +estado anterior usando a opção -f, --filter: +

+snapraid fix -f FILE
+
+

ou para um diretório: +

+snapraid fix -f DIR/
+
+

Você também pode usá-lo para recuperar apenas arquivos excluídos +acidentalmente dentro de um diretório usando a opção -m, --filter-missing, +que restaura apenas arquivos ausentes, deixando todos os outros intocados. +

+snapraid fix -m -f DIR/
+
+

Ou para recuperar todos os arquivos excluídos em todas as unidades com: +

+snapraid fix -m
+
+
+
+

+Recuperando +

+

O pior aconteceu e você perdeu um ou mais discos! +

NÃO ENTRE EM PÂNICO! Você será capaz de recuperá-los! +

A primeira coisa que você deve fazer é evitar mais alterações em seu array +de discos. Desabilite quaisquer conexões remotas a ele e quaisquer +processos agendados, incluindo qualquer sincronização noturna ou scrub +agendado do SnapRAID. +

Em seguida, prossiga com as seguintes etapas. +

+

+PASSO 1 -> Reconfigurar +

+

Você precisa de algum espaço para recuperar, idealmente em discos sobressalentes +adicionais, mas um disco USB externo ou um disco remoto será suficiente. +

Modifique o arquivo de configuração do SnapRAID para fazer com que a opção +`data` ou `parity` do disco com falha aponte para um local com espaço +vazio suficiente para recuperar os arquivos. +

Por exemplo, se o disco `d1` falhou, mude de: +

+data d1 /mnt/disk1/
+
+

para: +

+data d1 /mnt/new_spare_disk/
+
+

Se o disco a ser recuperado for um disco de paridade, atualize a opção +`parity` apropriada. +Se você tiver vários discos com falha, atualize todas as opções de +configuração deles. +

+
+

+PASSO 2 -> Corrigir +

+

Execute o comando fix, armazenando o log em um arquivo externo com: +

+snapraid -d NAME -l fix.log fix
+
+

Onde NAME é o nome do disco, como `d1` em nosso exemplo anterior. +Se o disco a ser recuperado for um disco de paridade, use os nomes +`parity`, `2-parity`, etc. +Se você tiver vários discos com falha, use várias opções -d para +especificar todos eles. +

Este comando levará muito tempo. +

Certifique-se de ter alguns gigabytes livres para armazenar o arquivo fix.log. +Execute-o a partir de um disco com espaço livre suficiente. +

Agora você recuperou tudo o que é recuperável. Se alguns arquivos estiverem +parcialmente ou totalmente irrecuperáveis, eles serão renomeados +adicionando a extensão `.unrecoverable`. +

Você pode encontrar uma lista detalhada de todos os blocos irrecuperáveis +no arquivo fix.log, verificando todas as linhas que começam com `unrecoverable:`. +

Se você não estiver satisfeito com a recuperação, pode tentar novamente +quantas vezes quiser. +

Por exemplo, se você removeu arquivos do array após a última +`sync`, isso pode resultar em alguns arquivos não sendo recuperados. +Neste caso, você pode tentar novamente o `fix` usando a opção -i, --import, +especificando onde esses arquivos estão agora para incluí-los novamente +no processo de recuperação. +

Se você estiver satisfeito com a recuperação, pode prosseguir, +mas observe que, após a sincronização, você não pode mais tentar +o comando `fix` novamente! +

+
+

+PASSO 3 -> Checar +

+

Como uma verificação cautelosa, você pode agora executar um comando +`check` para garantir que tudo esteja correto no disco recuperado. +

+snapraid -d NAME -a check
+
+

Onde NAME é o nome do disco, como `d1` em nosso exemplo anterior. +

As opções -d e -a dizem ao SnapRAID para verificar apenas o disco +especificado e ignorar todos os dados de paridade. +

Este comando levará muito tempo, mas se você não for excessivamente +cauteloso, pode pulá-lo. +

+
+

+PASSO 4 -> Sincronizar +

+

Execute o comando `sync` para ressincronizar o array com o novo disco. +

+snapraid sync
+
+

Se tudo for recuperado, este comando é imediato. +

+
+
+
+

+Comandos +

+

SnapRAID fornece alguns comandos simples que permitem a você: +

    +
  • +Imprimir o status do array -> `status` +
  • +
  • +Controlar os discos -> `smart`, `probe`, `up`, `down` +
  • +
  • +Fazer um backup/snapshot -> `sync` +
  • +
  • +Verificar periodicamente os dados -> `scrub` +
  • +
  • +Restaurar o último backup/snapshot -> `fix`. +
  • +
+

Os comandos devem ser escritos em letras minúsculas. +

+

+status +

+

Imprime um resumo do estado do array de discos. +

Inclui informações sobre a fragmentação da paridade, a idade +dos blocos sem verificação e todos os erros silenciosos registrados +encontrados durante o scrubbing. +

As informações apresentadas referem-se à última vez que você +executou `sync`. Modificações posteriores não são levadas em conta. +

Se blocos ruins foram detectados, seus números de bloco são listados. +Para corrigi-los, você pode usar o comando `fix -e`. +

Também mostra um gráfico que representa a última vez que cada bloco +foi examinado (scrubbed) ou sincronizado (synced). Blocos examinados +são mostrados com '*', blocos sincronizados, mas ainda não examinados, +com 'o'. +

Nada é modificado. +

+
+

+smart +

+

Imprime um relatório SMART de todos os discos no sistema. +

Inclui uma estimativa da probabilidade de falha no próximo +ano, permitindo que você planeje substituições de manutenção de +discos que mostrem atributos suspeitos. +

Esta estimativa de probabilidade é obtida correlacionando os atributos +SMART dos discos com os dados do Backblaze disponíveis em: +

+https://www.backblaze.com/hard-drive-test-data.html
+
+

Se o SMART relatar que um disco está falhando, `FAIL` ou `PREFAIL` é +impresso para esse disco, e o SnapRAID retorna com um erro. +Neste caso, a substituição imediata do disco é altamente recomendada. +

Outras possíveis strings de status são: +

+
+
+logfail +
+No passado, alguns atributos estavam abaixo do +limite. +
+
+
+
+logerr +
+O log de erros do dispositivo contém erros. +
+
+
+
+selferr +
+O log de autoteste do dispositivo contém erros. +
+
+
+

Se a opção -v, --verbose for especificada, uma análise estatística +mais profunda é fornecida. Esta análise pode ajudá-lo a decidir +se você precisa de mais ou menos paridade. +

Este comando usa a ferramenta `smartctl` e é equivalente a executar +`smartctl -a` em todos os dispositivos. +

Se seus dispositivos não forem detectados automaticamente corretamente, +você pode especificar um comando personalizado usando a opção +`smartctl` no arquivo de configuração. +

Nada é modificado. +

+
+

+probe +

+

Imprime o estado de ENERGIA de todos os discos no sistema. +

`Standby` significa que o disco não está girando. `Active` significa +que o disco está girando. +

Este comando usa a ferramenta `smartctl` e é equivalente a executar +`smartctl -n standby -i` em todos os dispositivos. +

Se seus dispositivos não forem detectados automaticamente corretamente, +você pode especificar um comando personalizado usando a opção +`smartctl` no arquivo de configuração. +

Nada é modificado. +

+
+

+up +

+

Liga (spins up) todos os discos do array. +

Você pode ligar apenas discos específicos usando a opção -d, --filter-disk. +

Ligar todos os discos ao mesmo tempo requer muita energia. +Certifique-se de que sua fonte de alimentação pode suportar isso. +

Nada é modificado. +

+
+

+down +

+

Desliga (spins down) todos os discos do array. +

Este comando usa a ferramenta `smartctl` e é equivalente a executar +`smartctl -s standby,now` em todos os dispositivos. +

Você pode desligar apenas discos específicos usando a opção -d, --filter-disk. +

Para desligar automaticamente em caso de erro, você pode usar a opção +-s, --spin-down-on-error com qualquer outro comando, o que é +equivalente a executar `down` manualmente quando ocorre um erro. +

Nada é modificado. +

+
+

+diff +

+

Lista todos os arquivos modificados desde o último `sync` que precisam ter +seus dados de paridade recalculados. +

Este comando não verifica os dados do arquivo, mas apenas o carimbo de +data/hora, tamanho e inode do arquivo. +

Após listar todos os arquivos alterados, um resumo das alterações é +apresentado, agrupado por: +

+
+
+equal +
+Arquivos inalterados de antes. +
+
+
+
+added +
+Arquivos adicionados que não estavam presentes antes. +
+
+
+
+removed +
+Arquivos removidos. +
+
+
+
+updated +
+Arquivos com tamanho ou carimbo de data/hora diferente, +o que significa que foram modificados. +
+
+
+
+moved +
+Arquivos movidos para um diretório diferente no mesmo disco. +Eles são identificados por terem o mesmo nome, tamanho, +carimbo de data/hora e inode, mas um diretório diferente. +
+
+
+
+copied +
+Arquivos copiados no mesmo ou em um disco diferente. +Observe que se eles forem realmente movidos para um disco +diferente, eles também serão contados em `removed`. +Eles são identificados por terem o mesmo nome, tamanho e +carimbo de data/hora. Se o carimbo de data/hora sub-segundo +for zero, o caminho completo deve corresponder, não apenas +o nome. +
+
+
+
+restored +
+Arquivos com um inode diferente, mas nome, tamanho e carimbo +de data/hora correspondentes. Estes são geralmente arquivos +restaurados após terem sido excluídos. +
+
+
+

Se uma `sync` for necessária, o código de retorno do processo é 2, +em vez do padrão 0. O código de retorno 1 é usado para uma condição +de erro genérica. +

Nada é modificado. +

+
+

+sync +

+

Atualiza as informações de paridade. Todos os arquivos modificados +no array de discos são lidos, e os dados de paridade correspondentes +são atualizados. +

Você pode parar este processo a qualquer momento pressionando Ctrl+C, +sem perder o trabalho já feito. +Na próxima execução, o processo `sync` será retomado de onde +foi interrompido. +

Se erros silenciosos ou de entrada/saída forem encontrados durante o processo, +os blocos correspondentes são marcados como ruins. +

Os arquivos são identificados por caminho e/ou inode e verificados por +tamanho e carimbo de data/hora. +Se o tamanho ou carimbo de data/hora do arquivo for diferente, a paridade +dos dados é recalculada para todo o arquivo. +Se o arquivo for movido ou renomeado no mesmo disco, mantendo o +mesmo inode, a paridade não é recalculada. +Se o arquivo for movido para outro disco, a paridade é recalculada, +mas as informações de hash calculadas anteriormente são mantidas. +

Os arquivos `content` e `parity` são modificados se necessário. +Os arquivos no array NÃO são modificados. +

+
+

+scrub +

+

Examina (scrubs) o array, verificando se há erros silenciosos ou de +entrada/saída nos discos de dados e paridade. +

Cada invocação verifica aproximadamente 8% do array, excluindo +dados já examinados nos últimos 10 dias. +Isso significa que examinar (scrubbing) uma vez por semana garante +que cada bit de dados seja verificado pelo menos uma vez a cada +três meses. +

Você pode definir um plano de scrub ou quantidade diferente usando a opção +-p, --plan, que aceita: +bad - Examina blocos marcados como ruins. +new - Examina blocos recém-sincronizados ainda não examinados. +full - Examina tudo. +0-100 - Examina a porcentagem especificada de blocos. +

Se você especificar um valor percentual, também pode usar a opção +-o, --older-than para definir a idade mínima do bloco. +Os blocos mais antigos são examinados primeiro, garantindo uma +verificação ideal. +Se você quiser examinar apenas os blocos recém-sincronizados ainda +não examinados, use a opção `-p new`. +

Para obter detalhes do status do scrub, use o comando `status`. +

Para qualquer erro silencioso ou de entrada/saída encontrado, os blocos +correspondentes são marcados como ruins no arquivo de `content`. +Esses blocos ruins são listados em `status` e podem ser corrigidos com +`fix -e`. +Após a correção, no próximo scrub, eles serão verificados novamente e, +se considerados corrigidos, a marcação de ruim será removida. +Para examinar apenas os blocos ruins, você pode usar o comando +`scrub -p bad`. +

É recomendado executar `scrub` apenas em um array sincronizado para +evitar erros relatados causados por dados não sincronizados. Esses erros +são reconhecidos como não sendo erros silenciosos, e os blocos não são +marcados como ruins, mas tais erros são relatados na saída do comando. +

O arquivo `content` é modificado para atualizar o tempo da última verificação +para cada bloco e para marcar blocos ruins. +Os arquivos `parity` NÃO são modificados. +Os arquivos no array NÃO são modificados. +

+
+

+fix +

+

Corrige todos os arquivos e os dados de paridade. +

Todos os arquivos e dados de paridade são comparados com o estado de +snapshot salvo na última `sync`. +Se uma diferença for encontrada, ela é revertida para o snapshot armazenado. +

ATENÇÃO! O comando `fix` não diferencia entre erros e modificações +intencionais. Ele reverte incondicionalmente o estado do arquivo +para a última `sync`. +

Se nenhuma outra opção for especificada, todo o array é processado. +Use as opções de filtro para selecionar um subconjunto de arquivos ou +discos para operar. +

Para corrigir apenas os blocos marcados como ruins durante `sync` e `scrub`, +use a opção -e, --filter-error. +Ao contrário de outras opções de filtro, esta aplica correções apenas a +arquivos que não foram alterados desde a última `sync`. +

O SnapRAID renomeia todos os arquivos que não podem ser corrigidos adicionando +a extensão `.unrecoverable`. +

Antes de corrigir, todo o array é escaneado para encontrar quaisquer +arquivos movidos desde a última operação `sync`. +Esses arquivos são identificados por seu carimbo de data/hora, ignorando +seu nome e diretório, e são usados no processo de recuperação, se +necessário. +Se você moveu alguns deles para fora do array, pode usar a opção +-i, --import para especificar diretórios adicionais para escanear. +

Os arquivos são identificados apenas por caminho, não por inode. +

O arquivo `content` NÃO é modificado. +Os arquivos `parity` são modificados se necessário. +Os arquivos no array são modificados se necessário. +

+
+

+check +

+

Verifica todos os arquivos e os dados de paridade. +

Funciona como `fix`, mas apenas simula uma recuperação e nenhuma alteração +é escrita no array. +

Este comando é destinado principalmente a verificações manuais, +como após um processo de recuperação ou em outras condições especiais. +Para verificações periódicas e agendadas, use `scrub`. +

Se você usar a opção -a, --audit-only, apenas os dados do arquivo +são verificados, e os dados de paridade são ignorados para uma +execução mais rápida. +

Os arquivos são identificados apenas por caminho, não por inode. +

Nada é modificado. +

+
+

+list +

+

Lista todos os arquivos contidos no array no momento da +última `sync`. +

Com -v ou --verbose, o tempo sub-segundo também é mostrado. +

Nada é modificado. +

+
+

+dup +

+

Lista todos os arquivos duplicados. Dois arquivos são considerados +iguais se seus hashes corresponderem. Os dados do arquivo não são lidos; +apenas os hashes pré-calculados são usados. +

Nada é modificado. +

+
+

+pool +

+

Cria ou atualiza uma visualização virtual de todos +os arquivos em seu array de discos no diretório `pooling`. +

Os arquivos não são copiados, mas ligados usando +links simbólicos. +

Ao atualizar, todos os links simbólicos existentes e subdiretórios +vazios são excluídos e substituídos pela nova +visualização do array. Quaisquer outros arquivos regulares são +deixados no lugar. +

Nada é modificado fora do diretório do pool. +

+
+

+devices +

+

Imprime os dispositivos de baixo nível usados pelo array. +

Este comando exibe as associações de dispositivos no array +e destina-se principalmente como uma interface de script. +

As duas primeiras colunas são o ID do dispositivo de baixo nível e o +caminho. As próximas duas colunas são o ID do dispositivo de alto nível +e o caminho. A última coluna é o nome do disco no array. +

Na maioria dos casos, você tem um dispositivo de baixo nível para cada disco +no array, mas em algumas configurações mais complexas, você pode ter +vários dispositivos de baixo nível usados por um único disco no array. +

Nada é modificado. +

+
+

+touch +

+

Define um carimbo de data/hora sub-segundo arbitrário para todos os arquivos +que o têm definido como zero. +

Isso melhora a capacidade do SnapRAID de reconhecer arquivos movidos +e copiados, pois torna o carimbo de data/hora quase único, +reduzindo possíveis duplicatas. +

Mais especificamente, se o carimbo de data/hora sub-segundo não for zero, +um arquivo movido ou copiado é identificado como tal se corresponder +ao nome, tamanho e carimbo de data/hora. Se o carimbo de data/hora +sub-segundo for zero, ele é considerado uma cópia apenas se o caminho +completo, tamanho e carimbo de data/hora corresponderem. +

O carimbo de data/hora de precisão de segundo não é modificado, +portanto, todas as datas e horas de seus arquivos serão preservadas. +

+
+

+rehash +

+

Agenda um novo hash de todo o array. +

Este comando altera o tipo de hash usado, tipicamente ao atualizar +de um sistema de 32 bits para um de 64 bits, para alternar do +MurmurHash3 para o mais rápido SpookyHash. +

Se você já estiver usando o hash ideal, este comando +não faz nada e informa que nenhuma ação é necessária. +

O novo hash não é executado imediatamente, mas ocorre +progressivamente durante `sync` e `scrub`. +

Você pode verificar o estado do novo hash usando `status`. +

Durante o novo hash, o SnapRAID mantém a funcionalidade total, +com a única exceção de que `dup` não pode detectar arquivos duplicados +usando um hash diferente. +

+
+
+

+Opções +

+

SnapRAID fornece as seguintes opções: +

+
+
+-c, --conf CONFIG +
+Seleciona o arquivo de configuração a ser usado. Se não for especificado, +no Unix, ele usa o arquivo `/usr/local/etc/snapraid.conf` se existir, +caso contrário, `/etc/snapraid.conf`. +No Windows, ele usa o arquivo `snapraid.conf` no mesmo +diretório que `snapraid.exe`. +
+
+
+
+
+
+-f, --filter PATTERN +
+Filtra os arquivos a serem processados em `check` e `fix`. +Apenas os arquivos que correspondem ao padrão especificado são processados. +Esta opção pode ser usada várias vezes. +Consulte a seção PATTERN para obter mais detalhes sobre +especificações de padrão. +No Unix, certifique-se de que os caracteres globbing sejam citados, se usados. +Esta opção pode ser usada apenas com `check` e `fix`. +Não pode ser usada com `sync` e `scrub`, pois eles sempre +processam o array inteiro. +
+
+
+
+
+
+-d, --filter-disk NAME +
+Filtra os discos a serem processados em `check`, `fix`, `up` e `down`. +Você deve especificar um nome de disco conforme definido no +arquivo de configuração. +Você também pode especificar discos de paridade com os nomes: `parity`, +`2-parity`, `3-parity`, etc., para limitar as operações a um +disco de paridade específico. +Se você combinar múltiplas opções --filter, --filter-disk e --filter-missing, +apenas os arquivos que correspondem a todos os filtros são selecionados. +Esta opção pode ser usada várias vezes. +Esta opção pode ser usada apenas com `check`, `fix`, `up` e `down`. +Não pode ser usada com `sync` e `scrub`, pois eles sempre +processam o array inteiro. +
+
+
+
+
+
+-m, --filter-missing +
+Filtra os arquivos a serem processados em `check` e `fix`. +Apenas os arquivos ausentes ou excluídos do array são processados. +Quando usado com `fix`, isso age como um comando `undelete` (desexcluir). +Se você combinar múltiplas opções --filter, --filter-disk e --filter-missing, +apenas os arquivos que correspondem a todos os filtros são selecionados. +Esta opção pode ser usada apenas com `check` e `fix`. +Não pode ser usada com `sync` e `scrub`, pois eles sempre +processam o array inteiro. +
+
+
+
+
+
+-e, --filter-error +
+Processa os arquivos com erros em `check` e `fix`. +Processa apenas arquivos que têm blocos marcados com erros silenciosos +ou de entrada/saída durante `sync` e `scrub`, conforme listado em `status`. +Esta opção pode ser usada apenas com `check` e `fix`. +
+
+
+
+
+
+-p, --plan PERC|bad|new|full +
+Seleciona o plano de scrub. Se PERC for um valor numérico de 0 a 100, +ele é interpretado como a porcentagem de blocos a serem examinados. +Em vez de uma porcentagem, você pode especificar um plano: +`bad` examina blocos ruins, `new` examina blocos ainda não examinados, +e `full` examina tudo. +Esta opção pode ser usada apenas com `scrub`. +
+
+
+
+
+
+-o, --older-than DAYS +
+Seleciona a parte mais antiga do array a ser processada em `scrub`. +DAYS é a idade mínima em dias para um bloco ser examinado; +o padrão é 10. +Os blocos marcados como ruins são sempre examinados, +independentemente desta opção. +Esta opção pode ser usada apenas com `scrub`. +
+
+
+
+
+
+-a, --audit-only +
+Em `check`, verifica o hash dos arquivos sem +verificar os dados de paridade. +Se você estiver interessado apenas em verificar os dados do arquivo, +esta opção pode acelerar significativamente o processo de verificação. +Esta opção pode ser usada apenas com `check`. +
+
+
+
+
+
+-h, --pre-hash +
+Em `sync`, executa uma fase de hash preliminar de todos os novos dados +para verificação adicional antes do cálculo da paridade. +Normalmente, em `sync`, nenhum hash preliminar é feito, e os novos +dados são hashados logo antes do cálculo da paridade, quando são lidos +pela primeira vez. +Este processo ocorre quando o sistema está sob +carga pesada, com todos os discos girando e uma CPU ocupada. +Esta é uma condição extrema para a máquina, e se ela tiver um +problema de hardware latente, erros silenciosos podem passar +despercebidos porque os dados ainda não foram hashados. +Para evitar esse risco, você pode habilitar o modo `pre-hash` para +ter todos os dados lidos duas vezes para garantir sua integridade. +Esta opção também verifica arquivos movidos dentro do array +para garantir que a operação de movimentação foi bem-sucedida e, +se necessário, permite que você execute uma operação fix antes de prosseguir. +Esta opção pode ser usada apenas com `sync`. +
+
+
+
+
+
+-i, --import DIR +
+Importa do diretório especificado quaisquer arquivos excluídos +do array após a última `sync`. +Se você ainda tiver esses arquivos, eles podem ser usados por `check` +e `fix` para melhorar o processo de recuperação. +Os arquivos são lidos, incluindo em subdiretórios, e são +identificados independentemente de seu nome. +Esta opção pode ser usada apenas com `check` e `fix`. +
+
+
+
+
+
+-s, --spin-down-on-error +
+Em qualquer erro, desliga (spins down) todos os discos gerenciados +antes de sair com um código de status diferente de zero. Isso +impede que as unidades permaneçam ativas e girando após uma +operação abortada, ajudando a evitar acúmulo desnecessário de +calor e consumo de energia. Use esta opção para garantir que os +discos sejam interrompidos com segurança, mesmo quando um comando falhar. +
+
+
+
+
+
+-w, --bw-limit RATE +
+Aplica um limite de largura de banda global para todos os discos. A +RATE é o número de bytes por segundo. Você pode especificar um +multiplicador como K, M ou G (por exemplo, --bw-limit 1G). +
+
+
+
+
+
+-A, --stats +
+Habilita uma visualização de status estendida que mostra informações +adicionais. A tela exibe dois gráficos: +O primeiro gráfico mostra o número de stripes em buffer para cada +disco, juntamente com o caminho do arquivo que está sendo +acessado atualmente nesse disco. Tipicamente, o disco mais lento não +terá buffer disponível, o que determina a largura de banda máxima +alcançável. +O segundo gráfico mostra a porcentagem de tempo gasto esperando +nos últimos 100 segundos. Espera-se que o disco mais lento +cause a maior parte do tempo de espera, enquanto outros discos +devem ter pouco ou nenhum tempo de espera porque podem usar seus +stripes em buffer. +Este gráfico também mostra o tempo gasto esperando por cálculos +de hash e cálculos RAID. +Todos os cálculos são executados em paralelo com as operações de disco. +Portanto, enquanto houver tempo de espera mensurável para +pelo menos um disco, isso indica que a CPU é rápida o suficiente +para acompanhar a carga de trabalho. +
+
+
+
+
+
+-Z, --force-zero +
+Força a operação insegura de sincronizar um arquivo com tamanho zero +que era anteriormente não zero. +Se o SnapRAID detectar tal condição, ele para de prosseguir +a menos que você especifique esta opção. +Isso permite que você detecte facilmente quando, após uma falha +do sistema, alguns arquivos acessados foram truncados. +Esta é uma condição possível no Linux com os sistemas de arquivos +ext3/ext4. +Esta opção pode ser usada apenas com `sync`. +
+
+
+
+
+
+-E, --force-empty +
+Força a operação insegura de sincronizar um disco com todos +os arquivos originais ausentes. +Se o SnapRAID detectar que todos os arquivos originalmente presentes +no disco estão ausentes ou foram reescritos, ele para de prosseguir +a menos que você especifique esta opção. +Isso permite que você detecte facilmente quando um sistema de +arquivos de dados não está montado. +Esta opção pode ser usada apenas com `sync`. +
+
+
+
+
+
+-U, --force-uuid +
+Força a operação insegura de sincronizar, verificar e corrigir +com discos que tiveram seus UUIDs alterados. +Se o SnapRAID detectar que alguns discos tiveram seus UUIDs alterados, +ele para de prosseguir a menos que você especifique esta opção. +Isso permite que você detecte quando seus discos estão montados +nos pontos de montagem errados. +No entanto, é permitido ter uma única mudança de UUID com +paridade única e mais com paridade múltipla, porque este é +o caso normal ao substituir discos após uma recuperação. +Esta opção pode ser usada apenas com `sync`, `check` ou +`fix`. +
+
+
+
+
+
+-D, --force-device +
+Força a operação insegura de corrigir com discos inacessíveis +ou com discos no mesmo dispositivo físico. +Por exemplo, se você perdeu dois discos de dados e tem um disco +sobressalente para recuperar apenas o primeiro, você pode ignorar +o segundo disco inacessível. +Ou, se você quiser recuperar um disco no espaço livre restante +em um disco já usado, compartilhando o mesmo dispositivo físico. +Esta opção pode ser usada apenas com `fix`. +
+
+
+
+
+
+-N, --force-nocopy +
+Em `sync`, `check` e `fix`, desabilita a heurística de detecção +de cópia. Sem esta opção, o SnapRAID assume que arquivos com os +mesmos atributos, como nome, tamanho e carimbo de data/hora, +são cópias com os mesmos dados. +Isso permite a identificação de arquivos copiados ou movidos de um +disco para outro e reutiliza as informações de hash já calculadas +para detectar erros silenciosos ou para recuperar arquivos ausentes. +Em alguns casos raros, esse comportamento pode resultar em falsos +positivos ou em um processo lento devido a muitas verificações de hash, +e esta opção permite que você resolva tais problemas. +Esta opção pode ser usada apenas com `sync`, `check` e `fix`. +
+
+
+
+
+
+-F, --force-full +
+Em `sync`, força um recálculo completo da paridade. +Esta opção pode ser usada quando você adiciona um novo nível de +paridade ou se você reverteu para um arquivo de conteúdo antigo +usando dados de paridade mais recentes. +Em vez de recriar a paridade do zero, isso permite +que você reutilize os hashes presentes no arquivo de conteúdo para +validar dados e manter a proteção de dados durante o processo +`sync` usando os dados de paridade existentes. +Esta opção pode ser usada apenas com `sync`. +
+
+
+
+
+
+-R, --force-realloc +
+Em `sync`, força uma realocação completa de arquivos e reconstrução +da paridade. +Esta opção pode ser usada para realocar completamente todos os +arquivos, removendo a fragmentação, enquanto reutiliza os hashes +presentes no arquivo de conteúdo para validar dados. +Esta opção pode ser usada apenas com `sync`. +ATENÇÃO! Esta opção é apenas para especialistas e é altamente +recomendado não usá-la. +Você NÃO tem proteção de dados durante a operação `sync`. +
+
+
+
+
+
+-l, --log FILE +
+Escreve um log detalhado para o arquivo especificado. +Se esta opção não for especificada, erros inesperados são +impressos na tela, resultando potencialmente em saída excessiva +em caso de muitos erros. Quando -l, --log é especificado, apenas +erros fatais que fazem o SnapRAID parar são impressos +na tela. +Se o caminho começar com '>>', o arquivo é aberto +no modo de anexação. Ocorrências de '%D' e '%T' no nome são +substituídas pela data e hora no formato YYYYMMDD e +HHMMSS. Em arquivos em lote do Windows, você deve duplicar +o caractere '%', por exemplo, resultado-%%D.log. Para usar '>>', você deve +colocar o nome entre aspas, por exemplo, `">>resultado.log"`. +Para enviar o log para a saída padrão ou erro padrão, +você pode usar `">&1"` e `">&2"`, respectivamente. +Consulte o arquivo snapraid_log.txt ou a página man para descrições +de tags de log. +
+
+
+
+
+
+-L, --error-limit NUMBER +
+Define um novo limite de erro antes de interromper a execução. +Por padrão, o SnapRAID para se encontrar mais de 100 +erros de entrada/saída, indicando que um disco provavelmente está +falhando. +Esta opção afeta `sync` e `scrub`, que têm permissão +para continuar após o primeiro conjunto de erros de disco para tentar +completar suas operações. +No entanto, `check` e `fix` sempre param no primeiro erro. +
+
+
+
+
+
+-S, --start BLKSTART +
+Começa o processamento a partir do número de bloco +especificado. Isso pode ser útil para tentar verificar +ou corrigir blocos específicos em caso de um disco danificado. +Esta opção é principalmente para recuperação manual avançada. +
+
+
+
+
+
+-B, --count BLKCOUNT +
+Processa apenas o número especificado de blocos. +Esta opção é principalmente para recuperação manual avançada. +
+
+
+
+
+
+-C, --gen-conf CONTENT +
+Gera um arquivo de configuração dummy a partir de um arquivo +de conteúdo existente. +O arquivo de configuração é escrito na saída padrão +e não sobrescreve um existente. +Este arquivo de configuração também contém as informações +necessárias para reconstruir os pontos de montagem do disco, +caso você perca todo o sistema. +
+
+
+
+
+
+-v, --verbose +
+Imprime mais informações na tela. +Se especificado uma vez, ele imprime arquivos excluídos +e estatísticas adicionais. +Esta opção não tem efeito nos arquivos de log. +
+
+
+
+
+
+-q, --quiet +
+Imprime menos informações na tela. +Se especificado uma vez, remove a barra de progresso; duas vezes, +as operações em execução; três vezes, as mensagens de informação; +quatro vezes, as mensagens de status. +Erros fatais são sempre impressos na tela. +Esta opção não tem efeito nos arquivos de log. +
+
+
+
+
+
+-H, --help +
+Imprime uma tela de ajuda curta. +
+
+
+
+
+
+-V, --version +
+Imprime a versão do programa. +
+
+
+
+
+

+Configuração +

+

SnapRAID requer um arquivo de configuração para saber onde seu array +de discos está localizado e onde armazenar as informações de paridade. +

No Unix, ele usa o arquivo `/usr/local/etc/snapraid.conf` se existir, +caso contrário, `/etc/snapraid.conf`. +No Windows, ele usa o arquivo `snapraid.conf` no mesmo +diretório que `snapraid.exe`. +

Deve conter as seguintes opções (sensível a maiúsculas/minúsculas): +

+

+parity FILE [,FILE] ... +

+

Define os arquivos a serem usados para armazenar as informações de paridade. +A paridade permite proteção contra uma única falha de disco, +semelhante ao RAID5. +

Você pode especificar vários arquivos, que devem estar em discos diferentes. +Quando um arquivo não pode mais crescer, o próximo é usado. +O espaço total disponível deve ser pelo menos tão grande quanto o maior +disco de dados no array. +

Você pode adicionar arquivos de paridade adicionais mais tarde, mas você +não pode reordenar ou removê-los. +

Manter os discos de paridade reservados para paridade garante que +eles não se fragmentem, melhorando o desempenho. +

No Windows, 256 MB são deixados sem uso em cada disco para evitar o +aviso sobre discos cheios. +

Esta opção é obrigatória e pode ser usada apenas uma vez. +

+
+

+(2,3,4,5,6)-parity FILE [,FILE] ... +

+

Define os arquivos a serem usados para armazenar informações de paridade extra. +

Para cada nível de paridade especificado, um nível adicional de proteção +é habilitado: +

    +
  • +2-parity habilita paridade dupla RAID6. +
  • +
  • +3-parity habilita paridade tripla. +
  • +
  • +4-parity habilita paridade quádrupla (quatro). +
  • +
  • +5-parity habilita paridade penta (cinco). +
  • +
  • +6-parity habilita paridade hexa (seis). +
  • +
+

Cada nível de paridade requer a presença de todos os níveis de paridade +anteriores. +

As mesmas considerações que para a opção 'parity' se aplicam. +

Estas opções são opcionais e podem ser usadas apenas uma vez. +

+
+

+z-parity FILE [,FILE] ... +

+

Define um arquivo e formato alternativo para armazenar paridade tripla. +

Esta opção é uma alternativa a '3-parity', destinada principalmente a +CPUs de baixo custo como ARM ou AMD Phenom, Athlon e Opteron que não +suportam o conjunto de instruções SSSE3. Nesses casos, ela fornece +melhor desempenho. +

Este formato é semelhante, mas mais rápido do que o usado pelo ZFS RAIDZ3. +Assim como o ZFS, ele não funciona além da paridade tripla. +

Ao usar '3-parity', você será avisado se for recomendado usar +o formato 'z-parity' para melhoria de desempenho. +

É possível converter de um formato para outro ajustando +o arquivo de configuração com o z-parity ou 3-parity desejado +e usando 'fix' para recriá-lo. +

+
+

+content FILE +

+

Define o arquivo a ser usado para armazenar a lista e os checksums de todos +os arquivos presentes em seu array de discos. +

Pode ser colocado em um disco usado para dados, paridade ou +qualquer outro disco disponível. +Se você usar um disco de dados, este arquivo é automaticamente excluído +do processo `sync`. +

Esta opção é obrigatória e pode ser usada várias vezes para salvar +múltiplas cópias do mesmo arquivo. +

Você deve armazenar pelo menos uma cópia para cada disco de paridade usado +mais um. Usar cópias adicionais não prejudica. +

+
+

+data NAME DIR +

+

Define o nome e o ponto de montagem dos discos de dados no +array. NAME é usado para identificar o disco e deve +ser único. DIR é o ponto de montagem do disco no +sistema de arquivos. +

Você pode alterar o ponto de montagem conforme necessário, desde que +mantenha o NAME fixo. +

Você deve usar uma opção para cada disco de dados no array. +

Você pode renomear um disco mais tarde alterando o NAME diretamente +no arquivo de configuração e, em seguida, executando um comando 'sync'. +No caso de renomeação, a associação é feita usando o UUID +armazenado dos discos. +

+
+

+nohidden +

+

Exclui todos os arquivos e diretórios ocultos. +No Unix, arquivos ocultos são aqueles que começam com `.`. +No Windows, são aqueles com o atributo oculto. +

+
+

+exclude/include PATTERN +

+

Define os padrões de arquivo ou diretório a serem excluídos ou incluídos +no processo de sincronização. +Todos os padrões são processados na ordem especificada. +

Se o primeiro padrão que corresponde for um `exclude`, o arquivo +é excluído. Se for um `include`, o arquivo é incluído. +Se nenhum padrão corresponder, o arquivo é excluído se o último padrão +especificado for um `include`, ou incluído se o último padrão +especificado for um `exclude`. +

Consulte a seção PATTERN para obter mais detalhes sobre +especificações de padrão. +

Esta opção pode ser usada várias vezes. +

+
+

+blocksize SIZE_IN_KIBIBYTES +

+

Define o tamanho básico do bloco em kibibytes para a paridade. +Um kibibyte é 1024 bytes. +

O `blocksize` padrão é 256, o que deve funcionar para a maioria dos casos. +

ATENÇÃO! Esta opção é apenas para especialistas e é altamente +recomendado não alterar este valor. Para alterar este valor no +futuro, você precisará recriar toda a paridade! +

Uma razão para usar um `blocksize` diferente é se você tiver muitos arquivos +pequenos, na ordem de milhões. +

Para cada arquivo, mesmo que apenas alguns bytes, um bloco inteiro de +paridade é alocado, e com muitos arquivos, isso pode resultar em +espaço de paridade não utilizado significativo. +Quando você preenche completamente o disco de paridade, você não está +autorizado a adicionar mais arquivos aos discos de dados. +No entanto, a paridade desperdiçada não se acumula em todos os discos de dados. +O espaço desperdiçado resultante de um grande número de arquivos em um disco +de dados limita apenas a quantidade de dados nesse disco de dados, +não em outros. +

Como uma aproximação, você pode assumir que metade do tamanho do bloco é +desperdiçada para cada arquivo. Por exemplo, com 100.000 arquivos e um +tamanho de bloco de 256 KiB, você desperdiçará 12,8 GB de paridade, o +que pode resultar em 12,8 GB a menos de espaço disponível no disco de dados. +

Você pode verificar a quantidade de espaço desperdiçado em cada disco usando `status`. +Esta é a quantidade de espaço que você deve deixar livre nos discos +de dados ou usar para arquivos não incluídos no array. +Se este valor for negativo, significa que você está perto de encher +a paridade e representa o espaço que você ainda pode desperdiçar. +

Para evitar esse problema, você pode usar uma partição maior para paridade. +Por exemplo, se a partição de paridade for 12,8 GB maior que os discos de dados, +você tem espaço extra suficiente para lidar com até 100.000 +arquivos em cada disco de dados sem qualquer espaço desperdiçado. +

Um truque para obter uma partição de paridade maior no Linux é formatá-la +com o comando: +

+mkfs.ext4 -m 0 -T largefile4 DEVICE
+
+

Isso resulta em cerca de 1,5% de espaço extra, aproximadamente 60 GB para +um disco de 4 TB, o que permite cerca de 460.000 arquivos em cada disco +de dados sem qualquer espaço desperdiçado. +

+
+

+hashsize SIZE_IN_BYTES +

+

Define o tamanho do hash em bytes para os blocos salvos. +

O `hashsize` padrão é 16 bytes (128 bits), o que deve funcionar +para a maioria dos casos. +

ATENÇÃO! Esta opção é apenas para especialistas e é altamente +recomendado não alterar este valor. Para alterar este valor no +futuro, você precisará recriar toda a paridade! +

Uma razão para usar um `hashsize` diferente é se o seu sistema tiver +memória limitada. Como regra geral, o SnapRAID tipicamente requer +1 GiB de RAM para cada 16 TB de dados no array. +

Especificamente, para armazenar os hashes dos dados, o SnapRAID requer +aproximadamente TS*(1+HS)/BS bytes de RAM, +onde TS é o tamanho total em bytes do seu array de discos, BS é o +tamanho do bloco em bytes, e HS é o tamanho do hash em bytes. +

Por exemplo, com 8 discos de 4 TB, um tamanho de bloco de 256 KiB +(1 KiB = 1024 bytes), e um tamanho de hash de 16, você obtém: +

+RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB
+
+

Mudando para um tamanho de hash de 8, você obtém: +

+RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB
+
+

Mudando para um tamanho de bloco de 512, você obtém: +

+RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB
+
+

Mudando para um tamanho de hash de 8 e um tamanho de bloco de 512, você obtém: +

+RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB
+
+
+
+

+autosave SIZE_IN_GIGABYTES +

+

Salva automaticamente o estado ao sincronizar ou examinar após a +quantidade especificada de GB processados. +Esta opção é útil para evitar reiniciar longos comandos `sync` +do zero se interrompidos por uma falha de máquina ou qualquer outro evento. +

+
+

+temp_limit TEMPERATURE_CELSIUS +

+

Define a temperatura máxima permitida do disco em Celsius. Quando especificado, +o SnapRAID verifica periodicamente a temperatura de todos os discos usando a +ferramenta smartctl. As temperaturas atuais dos discos são exibidas enquanto +o SnapRAID está operando. Se algum disco exceder este limite, todas as +operações param, e os discos são desligados (colocados em standby) pela +duração definida pela opção `temp_sleep`. Após o período de espera, as +operações são retomadas, potencialmente pausando novamente se o limite de +temperatura for atingido mais uma vez. +

Durante a operação, o SnapRAID também analisa a curva de aquecimento de +cada disco e estima a temperatura estável de longo prazo que eles +devem atingir se a atividade continuar. A estimativa é realizada apenas +depois que a temperatura do disco aumentou quatro vezes, garantindo +que pontos de dados suficientes estejam disponíveis para estabelecer uma +tendência confiável. +Esta temperatura estável prevista é mostrada entre parênteses ao lado +do valor atual e ajuda a avaliar se o resfriamento do sistema é +adequado. Esta temperatura estimada é apenas para fins informativos +e não tem efeito no comportamento do SnapRAID. As ações do programa +são baseadas exclusivamente nas temperaturas reais medidas dos discos. +

Para realizar esta análise, o SnapRAID precisa de uma referência para a +temperatura do sistema. Ele tenta primeiro lê-la dos sensores de hardware +disponíveis. Se nenhum sensor do sistema puder ser acessado, ele usa +a temperatura mais baixa do disco medida no início da execução como +referência de fallback. +

Normalmente, o SnapRAID mostra apenas a temperatura do disco mais quente. +Para exibir a temperatura de todos os discos, use a opção -A ou --stats. +

+
+

+temp_sleep TIME_IN_MINUTES +

+

Define o tempo de espera (standby time), em minutos, quando o limite de +temperatura é atingido. Durante este período, os discos permanecem +desligados. O padrão é 5 minutos. +

+
+

+pool DIR +

+

Define o diretório de pooling onde a visualização virtual do array +de discos é criada usando o comando `pool`. +

O diretório já deve existir. +

+
+

+share UNC_DIR +

+

Define o caminho UNC do Windows necessário para acessar os discos remotamente. +

Se esta opção for especificada, os links simbólicos criados no diretório +do pool usam este caminho UNC para acessar os discos. +Sem esta opção, os links simbólicos gerados usam apenas caminhos locais, +o que não permite compartilhar o diretório do pool pela rede. +

Os links simbólicos são formados usando o caminho UNC especificado, +adicionando o nome do disco conforme especificado na opção `data`, +e finalmente adicionando o diretório e nome do arquivo. +

Esta opção é necessária apenas para Windows. +

+
+

+smartctl DISK/PARITY OPTIONS... +

+

Define opções smartctl personalizadas para obter os atributos SMART para +cada disco. Isso pode ser necessário para controladores RAID e alguns +discos USB que não podem ser detectados automaticamente. O placeholder +%s é substituído pelo nome do dispositivo, mas é opcional para dispositivos +fixos como controladores RAID. +

DISK é o mesmo nome de disco especificado na opção `data`. +PARITY é um dos nomes de paridade: `parity`, `2-parity`, `3-parity`, +`4-parity`, `5-parity`, `6-parity` ou `z-parity`. +

Nas OPTIONS especificadas, a string `%s` é substituída pelo +nome do dispositivo. Para controladores RAID, o dispositivo é +provavelmente fixo, e você pode não precisar usar `%s`. +

Consulte a documentação do smartmontools para possíveis opções: +

+https://www.smartmontools.org/wiki/Supported_RAID-Controllers
+https://www.smartmontools.org/wiki/Supported_USB-Devices
+
+

Por exemplo: +

+smartctl parity -d sat %s
+
+
+
+

+smartignore DISK/PARITY ATTR [ATTR...] +

+

Ignora o atributo SMART especificado ao calcular a probabilidade +de falha do disco. Esta opção é útil se um disco relatar valores +incomuns ou enganosos para um atributo específico. +

DISK é o mesmo nome de disco especificado na opção `data`. +PARITY é um dos nomes de paridade: `parity`, `2-parity`, `3-parity`, +`4-parity`, `5-parity`, `6-parity` ou `z-parity`. +O valor especial * pode ser usado para ignorar o atributo em todos os discos. +

Por exemplo, para ignorar o atributo `Current Pending Sector Count` em +todos os discos: +

+smartignore * 197
+
+

Para ignorá-lo apenas no primeiro disco de paridade: +

+smartignore parity 197
+
+
+
+

+Exemplos +

+

Um exemplo de uma configuração típica para Unix é: +

+parity /mnt/diskp/snapraid.parity
+content /mnt/diskp/snapraid.content
+content /var/snapraid/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+exclude /lost+found/
+exclude /tmp/
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/sg0
+smartctl 2-parity -d areca,2/1 /dev/sg0
+
+

Um exemplo de uma configuração típica para Windows é: +

+parity E:\snapraid.parity
+content E:\snapraid.content
+content C:\snapraid\snapraid.content
+data d1 G:\array\
+data d2 H:\array\
+data d3 I:\array\
+exclude Thumbs.db
+exclude \$RECYCLE.BIN
+exclude \System Volume Information
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/arcmsr0
+smartctl 2-parity -d areca,2/1 /dev/arcmsr0
+
+
+
+
+

+Padrão (Pattern) +

+

Os padrões fornecem uma maneira flexível de filtrar arquivos para inclusão ou +exclusão. Ao usar caracteres de globbing, você pode definir regras que +correspondam a nomes de arquivos específicos ou estruturas de diretórios inteiras sem +listar cada caminho manualmente. +

O ponto de interrogação `?` corresponde a qualquer caractere único, exceto o +separador de diretórios. Isso o torna útil para corresponder nomes de arquivos com +caracteres variáveis, mantendo o padrão confinado a um único nível de diretório. +

O asterisco simples `*` corresponde a qualquer sequência de caracteres, mas, como o +ponto de interrogação, nunca cruza as fronteiras do diretório. Ele para na +barra invertida, tornando-o adequado para correspondência dentro de um único +componente de caminho. Este é o comportamento padrão de curinga familiar do +globbing de shell. +

O asterisco duplo `**` é mais poderoso, ele corresponde a qualquer sequência de +caracteres, incluindo separadores de diretórios. Isso permite que os padrões correspondam +em vários níveis de diretório. Quando o `**` aparece incorporado diretamente em +um padrão, ele pode corresponder a zero ou mais caracteres, incluindo barras entre +o texto literal circundante. +

O uso mais importante do `**` é na forma especial `/**/`. Isso corresponde a +zero ou mais níveis de diretório completos, tornando possível corresponder arquivos +em qualquer profundidade em uma árvore de diretórios sem conhecer a estrutura exata do caminho. +Por exemplo, o padrão `src/**/main.js` corresponde a `src/main.js` (pulando +zero diretórios), `src/ui/main.js` (pulando um diretório) e +`src/ui/components/main.js` (pulando dois diretórios). +

Classes de caracteres usando colchetes `[]` correspondem a um único caractere de um +conjunto ou intervalo especificado. Como os outros padrões de caractere único, elas +não correspondem a separadores de diretório. As classes suportam intervalos e negação usando +um ponto de exclamação. +

A distinção fundamental a ser lembrada é que `*`, `?` e classes de caracteres +respeitam os limites do diretório e correspondem apenas dentro de um único +componente de caminho, enquanto `**` é o único padrão que pode corresponder através de +separadores de diretório. +

Existem quatro tipos diferentes de padrões: +

+
+
+FILE +
+Seleciona qualquer arquivo chamado FILE. +Este padrão se aplica apenas a arquivos, não a diretórios. +
+
+
+
+
+
+DIR/ +
+Seleciona qualquer diretório chamado DIR e tudo o que estiver dentro dele. +Este padrão se aplica apenas a diretórios, não a arquivos. +
+
+
+
+
+
+/PATH/FILE +
+Seleciona o caminho exato do arquivo especificado. Este padrão se aplica +apenas a arquivos, não a diretórios. +
+
+
+
+
+
+/PATH/DIR/ +
+Seleciona o caminho exato do diretório especificado e tudo o que estiver +dentro dele. Este padrão se aplica apenas a diretórios, não a arquivos. +
+
+
+

Quando você especifica um caminho absoluto começando com /, ele é aplicado +no diretório raiz do array, não no diretório raiz do sistema de arquivos local. +

No Windows, você pode usar a barra invertida \ em vez da barra. +Diretórios do sistema Windows, junctions, pontos de montagem e outros +diretórios especiais do Windows são tratados como arquivos, o que significa +que para excluí-los, você deve usar uma regra de arquivo, não uma de diretório. +

Se o nome do arquivo contiver um caractere '*', '?', '[', +ou ']', você deve escapá-lo para evitar que seja interpretado como um +caractere globbing. No Unix, o caractere de escape é '\'; no Windows, é '^'. +Quando o padrão está na linha de comando, você deve duplicar o caractere +de escape para evitar que seja interpretado pelo shell de comando. +

No arquivo de configuração, você pode usar diferentes estratégias para filtrar +os arquivos a serem processados. +A abordagem mais simples é usar apenas regras `exclude` para remover todos os +arquivos e diretórios que você não deseja processar. Por exemplo: +

+# Exclui qualquer arquivo chamado `*.unrecoverable`
+exclude *.unrecoverable
+# Exclui o diretório raiz `/lost+found`
+exclude /lost+found/
+# Exclui qualquer subdiretório chamado `tmp`
+exclude tmp/
+
+

A abordagem oposta é definir apenas os arquivos que você deseja processar, +usando apenas regras `include`. Por exemplo: +

+# Inclui apenas alguns diretórios
+include /movies/
+include /musics/
+include /pictures/
+
+

A abordagem final é misturar regras `exclude` e `include`. Neste caso, +a ordem das regras é importante. As regras anteriores têm +precedência sobre as posteriores. +Para simplificar, você pode listar todas as regras `exclude` primeiro e +depois todas as regras `include`. Por exemplo: +

+# Exclui qualquer arquivo chamado `*.unrecoverable`
+exclude *.unrecoverable
+# Exclui qualquer subdiretório chamado `tmp`
+exclude tmp/
+# Inclui apenas alguns diretórios
+include /movies/
+include /musics/
+include /pictures/
+
+

Na linha de comando, usando a opção -f, você pode usar apenas padrões `include`. +Por exemplo: +

+# Verifica apenas os arquivos .mp3.
+# No Unix, use aspas para evitar a expansão globbing pelo shell.
+snapraid -f "*.mp3" check
+
+

No Unix, ao usar caracteres globbing na linha de comando, você deve +citá-los para evitar que o shell os expanda. +

+
+

+Ignorar Arquivos (Ignore File) +

+

Além das regras globais no arquivo de configuração, você pode colocar +arquivos `.snapraidignore` em qualquer diretório dentro do array para definir +regras de exclusão descentralizadas. +

As regras definidas em `.snapraidignore` são aplicadas após as regras no +arquivo de configuração. Isso significa que elas têm uma prioridade maior e +podem ser usadas para excluir arquivos que foram anteriormente incluídos pela +configuração global. Efetivamente, se uma regra local corresponder, o arquivo +é excluído independentemente das configurações globais de inclusão. +

A lógica de padrões no `.snapraidignore` espelha a configuração global, mas +ancora os padrões ao diretório onde o arquivo está localizado: +

+
+
+FILE +
+Seleciona qualquer arquivo chamado FILE neste diretório ou abaixo. +Isso segue as mesmas regras de globbing do padrão global. +
+
+
+
+
+
+DIR/ +
+Seleciona qualquer diretório chamado DIR e tudo dentro dele, +residente neste diretório ou abaixo. +
+
+
+
+
+
+/PATH/FILE +
+Seleciona o arquivo exato especificado relativo à localização +do arquivo `.snapraidignore`. +
+
+
+
+
+
+/PATH/DIR/ +
+Seleciona o diretório exato especificado e tudo dentro dele, +relativo à localização do arquivo `.snapraidignore`. +
+
+
+

Ao contrário da configuração global, os arquivos `.snapraidignore` suportam +apenas regras de exclusão; você não pode usar padrões `include` ou negação (!). +

Por exemplo, se você tiver um `.snapraidignore` em `/mnt/disk1/projects/`: +

+# Exclui APENAS /mnt/disk1/projects/output.bin
+/output.bin
+# Exclui qualquer diretório chamado 'build' dentro de projects/
+build/
+# Exclui qualquer arquivo .tmp dentro de projects/ ou suas subpastas
+*.tmp
+
+
+
+

+Conteúdo (Content) +

+

SnapRAID armazena a lista e os checksums de seus arquivos no arquivo content. +

É um arquivo binário que lista todos os arquivos presentes em seu array +de discos, juntamente com todos os checksums para verificar sua integridade. +

Este arquivo é lido e escrito pelos comandos `sync` e `scrub` e +lido pelos comandos `fix`, `check` e `status`. +

+
+

+Paridade (Parity) +

+

SnapRAID armazena as informações de paridade do seu array nos arquivos parity. +

Estes são arquivos binários contendo a paridade calculada de todos os +blocos definidos no arquivo `content`. +

Estes arquivos são lidos e escritos pelos comandos `sync` e `fix` e +apenas lidos pelos comandos `scrub` e `check`. +

+
+

+Codificação (Encoding) +

+

SnapRAID no Unix ignora qualquer codificação. Ele lê e armazena os +nomes de arquivo com a mesma codificação usada pelo sistema de arquivos. +

No Windows, todos os nomes lidos do sistema de arquivos são convertidos +e processados no formato UTF-8. +

Para que os nomes de arquivo sejam impressos corretamente, você deve +definir o console do Windows para o modo UTF-8 com o comando `chcp 65001` +e usar uma fonte TrueType como `Lucida Console` como fonte do console. +Isso afeta apenas os nomes de arquivo impressos; se você +redirecionar a saída do console para um arquivo, o arquivo resultante +estará sempre no formato UTF-8. +

+
+

+Direitos Autorais (Copyright) +

+

Este arquivo é Copyright (C) 2025 Andrea Mazzoleni +

+
+

+Veja Também (See Also) +

+

snapraid_log(1), snapraidd(1) +

+ + +
+
+
+ + + + + + + diff --git a/beta/manual-ro.html b/beta/manual-ro.html new file mode 100644 index 00000000..4dbb3afc --- /dev/null +++ b/beta/manual-ro.html @@ -0,0 +1,1979 @@ + + + + + + + + SnapRAID Manual + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + +
+ +
+ +
+

+Sintaxă +

+
+snapraid [-c, --conf CONFIG]
+    [-f, --filter PATTERN] [-d, --filter-disk NAME]
+    [-m, --filter-missing] [-e, --filter-error]
+    [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR]
+    [-p, --plan PERC|bad|new|full]
+    [-o, --older-than DAYS] [-l, --log FILE]
+    [-s, --spin-down-on-error] [-w, --bw-limit RATE]
+    [-Z, --force-zero] [-E, --force-empty]
+    [-U, --force-uuid] [-D, --force-device]
+    [-N, --force-nocopy] [-F, --force-full]
+    [-R, --force-realloc]
+    [-S, --start BLKSTART] [-B, --count BLKCOUNT]
+    [-L, --error-limit NUMBER]
+    [-A, --stats]
+    [-v, --verbose] [-q, --quiet]
+    status|smart|probe|up|down|diff|sync|scrub|fix|check
+    |list|dup|pool|devices|touch|rehash
+
+
+snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT]
+
+
+
+

+Descriere +

+

SnapRAID este un program de backup conceput pentru matrici de discuri, care stochează +informații de paritate pentru recuperarea datelor în cazul a până la șase +defecte de disc. +

Destinat în principal centrelor media de acasă cu fișiere mari, +care se schimbă rar, SnapRAID oferă câteva caracteristici: +

    +
  • +Puteți utiliza discuri deja pline cu fișiere fără +nevoia de a le reformat, accesându-le ca de obicei. +
  • +
  • +Toate datele dvs. sunt hash-uite pentru a asigura integritatea datelor și a preveni +corupția silențioasă. +
  • +
  • +Când numărul de discuri defecte depășește numărul de parități, +pierderea de date este limitată la discurile afectate; datele de pe +celelalte discuri rămân accesibile. +
  • +
  • +Dacă ștergeți accidental fișiere de pe un disc, recuperarea este +posibilă. +
  • +
  • +Discurile pot avea dimensiuni diferite. +
  • +
  • +Puteți adăuga discuri în orice moment. +
  • +
  • +SnapRAID nu vă blochează datele; puteți înceta să-l utilizați +oricând fără a reforma sau muta date. +
  • +
  • +Pentru a accesa un fișier, este necesar să se rotească doar un singur disc, economisind +energie și reducând zgomotul. +
  • +
+

Pentru mai multe informații, vă rugăm să vizitați site-ul oficial SnapRAID: +

+https://www.snapraid.it/
+
+
+
+

+Limitări +

+

SnapRAID este un hibrid între un program RAID și unul de backup, care urmărește să combine +cele mai bune beneficii ale ambelor. Cu toate acestea, are unele limitări pe care ar trebui +să le luați în considerare înainte de a-l utiliza. +

Principala limitare este că, dacă un disc se defectează și nu ați făcut recent o sincronizare, +este posibil să nu puteți recupera complet. +Mai exact, este posibil să nu puteți recupera până la dimensiunea +fișierelor modificate sau șterse de la ultima operațiune de sincronizare. +Acest lucru se întâmplă chiar dacă fișierele modificate sau șterse nu sunt pe +discul defect. Acesta este motivul pentru care SnapRAID este mai potrivit pentru +date care se schimbă rar. +

Pe de altă parte, fișierele nou adăugate nu împiedică recuperarea fișierelor +deja existente. Veți pierde doar fișierele adăugate recent dacă acestea +se află pe discul defect. +

Alte limitări ale SnapRAID sunt: +

    +
  • +Cu SnapRAID, aveți în continuare sisteme de fișiere separate pentru fiecare disc. +Cu RAID, obțineți un singur sistem de fișiere mare. +
  • +
  • +SnapRAID nu face striping de date. +Cu RAID, obțineți un spor de viteză prin striping. +
  • +
  • +SnapRAID nu suportă recuperarea în timp real. +Cu RAID, nu trebuie să vă opriți din lucru atunci când un disc se defectează. +
  • +
  • +SnapRAID poate recupera date doar dintr-un număr limitat de defecte de disc. +Cu un backup, puteți recupera dintr-o defecțiune completă +a întregii matrici de discuri. +
  • +
  • +Sunt salvate doar numele fișierelor, mărcile temporale, symlink-urile și hardlink-urile. +Permisiunile, proprietarul și atributele extinse nu sunt salvate. +
  • +
+
+
+

+Noțiuni de Bază +

+

Pentru a utiliza SnapRAID, trebuie mai întâi să selectați un disc în matricea dvs. de discuri +pentru a-l dedica informațiilor de `paritate`. Cu un singur disc pentru paritate, veți +putea recupera dintr-o singură defecțiune de disc, similar cu RAID5. +

Dacă doriți să recuperați din mai multe defecțiuni de disc, similar cu RAID6, +trebuie să rezervați discuri suplimentare pentru paritate. Fiecare disc de paritate +suplimentar permite recuperarea dintr-o defecțiune de disc în plus. +

Ca discuri de paritate, trebuie să le alegeți pe cele mai mari din matrice, +deoarece informațiile de paritate pot crește până la dimensiunea celui mai mare disc de date +din matrice. +

Aceste discuri vor fi dedicate stocării fișierelor de `paritate`. +Nu ar trebui să stocați datele dvs. pe ele. +

Apoi, trebuie să definiți discurile de `date` pe care doriți să le protejați +cu SnapRAID. Protecția este mai eficientă dacă aceste discuri +conțin date care se schimbă rar. Din acest motiv, este mai bine să +NU includeți discul C:\ al Windows sau directoarele Unix /home, /var și /tmp. +

Lista de fișiere este salvată în fișierele de `conținut`, de obicei +stocate pe discurile de date, de paritate sau de boot. +Acest fișier conține detaliile backup-ului dvs., inclusiv toate +sumele de control (checksums) pentru a-i verifica integritatea. +Fișierul de `conținut` este stocat în mai multe copii, iar fiecare copie trebuie +să fie pe un disc diferit pentru a se asigura că, chiar și în cazul a multiple +defecte de disc, cel puțin o copie este disponibilă. +

De exemplu, să presupunem că sunteți interesați doar de un singur nivel de paritate +de protecție și discurile dvs. se află la: +

+/mnt/diskp <- discul selectat pentru paritate
+/mnt/disk1 <- primul disc de protejat
+/mnt/disk2 <- al doilea disc de protejat
+/mnt/disk3 <- al treilea disc de protejat
+
+

Trebuie să creați fișierul de configurare /etc/snapraid.conf cu +următoarele opțiuni: +

+parity /mnt/diskp/snapraid.parity
+content /var/snapraid/snapraid.content
+content /mnt/disk1/snapraid.content
+content /mnt/disk2/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+
+

Dacă sunteți pe Windows, ar trebui să utilizați formatul de cale Windows, cu litere de unitate +și backslash-uri în loc de slash-uri. +

+parity E:\snapraid.parity
+content C:\snapraid\snapraid.content
+content F:\array\snapraid.content
+content G:\array\snapraid.content
+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+
+

Dacă aveți multe discuri și rămâneți fără litere de unitate, puteți monta +discurile direct în subfoldere. Vedeți: +

+https://www.google.com/search?q=Windows+mount+point
+
+

În acest moment, sunteți gata să rulați comanda `sync` pentru a construi +informațiile de paritate. +

+snapraid sync
+
+

Acest proces poate dura câteva ore prima dată, în funcție de dimensiunea +datelor deja prezente pe discuri. Dacă discurile sunt goale, +procesul este imediat. +

Îl puteți opri oricând apăsând Ctrl+C, iar la următoarea rulare, +va relua de unde a fost întrerupt. +

Când această comandă se finalizează, datele dvs. sunt ÎN SIGURANȚĂ. +

Acum puteți începe să utilizați matricea după cum doriți și +să actualizați periodic informațiile de paritate rulând comanda `sync`. +

+

+Scrubbing (Verificare) +

+

Pentru a verifica periodic datele și paritatea pentru erori, puteți +rula comanda `scrub`. +

+snapraid scrub
+
+

Această comandă compară datele din matricea dvs. cu hash-ul calculat +în timpul comenzii `sync` pentru a verifica integritatea. +

Fiecare rulare a comenzii verifică aproximativ 8% din matrice, excluzând datele +deja verificate în ultimele 10 zile. +Puteți utiliza opțiunea -p, --plan pentru a specifica o cantitate diferită +și opțiunea -o, --older-than pentru a specifica o vârstă diferită în zile. +De exemplu, pentru a verifica 5% din matrice pentru blocuri mai vechi de 20 de zile, utilizați: +

+snapraid -p 5 -o 20 scrub
+
+

Dacă se găsesc erori silențioase sau de intrare/ieșire în timpul procesului, +blocurile corespunzătoare sunt marcate ca fiind defecte în fișierul de `conținut` +și listate în comanda `status`. +

+snapraid status
+
+

Pentru a le repara, puteți utiliza comanda `fix`, filtrând pentru blocuri defecte cu +opțiunea -e, --filter-error: +

+snapraid -e fix
+
+

La următorul `scrub`, erorile vor dispărea din raportul `status` +dacă sunt într-adevăr reparate. Pentru a face mai rapid, puteți utiliza -p bad pentru a verifica +doar blocurile marcate ca defecte. +

+snapraid -p bad scrub
+
+

Rularea `scrub` pe o matrice nesincronizată poate raporta erori cauzate de +fișiere eliminate sau modificate. Aceste erori sunt raportate în ieșirea `scrub`, +dar blocurile aferente nu sunt marcate ca defecte. +

+
+

+Pooling (Agregare) +

+

Notă: Funcționalitatea de pooling descrisă mai jos a fost înlocuită de instrumentul +mergefs, care este acum opțiunea recomandată pentru utilizatorii Linux în +comunitatea SnapRAID. Mergefs oferă o modalitate mai flexibilă și eficientă +de a agrega mai multe discuri într-un singur punct de montare unificat, +permițând accesul neîntrerupt la fișiere pe toată matricea dvs. fără a se baza +pe link-uri simbolice. Se integrează bine cu SnapRAID pentru protecția parității +și este utilizat în mod obișnuit în configurații precum OpenMediaVault (OMV) +sau configurații NAS personalizate. +

Pentru a avea toate fișierele din matricea dvs. afișate în același arbore de directoare, +puteți activa funcționalitatea de `pooling`. Aceasta creează o vizualizare virtuală +doar în citire a tuturor fișierelor din matricea dvs. folosind link-uri simbolice. +

Puteți configura directorul de `pooling` în fișierul de configurare cu: +

+pool /pool
+
+

sau, dacă sunteți pe Windows, cu: +

+pool C:\pool
+
+

și apoi rulați comanda `pool` pentru a crea sau actualiza vizualizarea virtuală. +

+snapraid pool
+
+

Dacă utilizați o platformă Unix și doriți să partajați acest director +peste rețea către mașini Windows sau Unix, ar trebui să adăugați +următoarele opțiuni la /etc/samba/smb.conf: +

+# În secțiunea global a smb.conf
+unix extensions = no
+
+
+# În secțiunea share a smb.conf
+[pool]
+comment = Pool
+path = /pool
+read only = yes
+guest ok = yes
+wide links = yes
+follow symlinks = yes
+
+

În Windows, partajarea link-urilor simbolice peste o rețea necesită ca clienții să +le rezolve de la distanță. Pentru a permite acest lucru, pe lângă partajarea directorului pool, +trebuie să partajați și toate discurile în mod independent, folosind numele discurilor +definite în fișierul de configurare ca puncte de partajare. De asemenea, trebuie să specificați +în opțiunea `share` din fișierul de configurare calea UNC Windows pe care +clienții la distanță trebuie să o folosească pentru a accesa aceste discuri partajate. +

De exemplu, operând de pe un server numit `darkstar`, puteți utiliza +opțiunile: +

+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+pool C:\pool
+share \\darkstar
+
+

și partajați următoarele directoare peste rețea: +

+\\darkstar\pool -> C:\pool
+\\darkstar\d1 -> F:\array
+\\darkstar\d2 -> G:\array
+\\darkstar\d3 -> H:\array
+
+

pentru a permite clienților la distanță să acceseze toate fișierele la \\darkstar\pool. +

De asemenea, ar putea fi necesar să configurați clienții la distanță pentru a permite accesul la symlink-uri la distanță cu comanda: +

+fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
+
+
+
+

+Undeleting (Anulare Ștergere) +

+

SnapRAID funcționează mai mult ca un program de backup decât un sistem RAID și poate +fi folosit pentru a restaura sau anula ștergerea fișierelor la starea lor anterioară utilizând +opțiunea -f, --filter: +

+snapraid fix -f FILE
+
+

sau pentru un director: +

+snapraid fix -f DIR/
+
+

De asemenea, îl puteți utiliza pentru a recupera doar fișiere șterse accidental în interiorul +unui director folosind opțiunea -m, --filter-missing, care restaurează +doar fișierele lipsă, lăsându-le pe toate celelalte neatinse. +

+snapraid fix -m -f DIR/
+
+

Sau pentru a recupera toate fișierele șterse de pe toate unitățile cu: +

+snapraid fix -m
+
+
+
+

+Recuperare +

+

Cel mai rău s-a întâmplat și ați pierdut unul sau mai multe discuri! +

NU INTRAȚI ÎN PANICĂ! Veți putea să le recuperați! +

Primul lucru pe care trebuie să-l faceți este să evitați modificările ulterioare la matricea dvs. de discuri. +Dezactivați orice conexiuni la distanță la aceasta și orice procese programate, inclusiv +orice sincronizare sau verificare SnapRAID programată pe timp de noapte. +

Apoi continuați cu următorii pași. +

+

+PASUL 1 -> Reconfigurare +

+

Aveți nevoie de spațiu pentru a recupera, ideal pe discuri de rezervă +suplimentare, dar un disc USB extern sau un disc la distanță vor fi suficiente. +

Modificați fișierul de configurare SnapRAID pentru a face ca opțiunea `data` sau `parity` +a discului defect să indice o locație cu suficient spațiu gol +pentru a recupera fișierele. +

De exemplu, dacă discul `d1` a eșuat, schimbați de la: +

+data d1 /mnt/disk1/
+
+

la: +

+data d1 /mnt/new_spare_disk/
+
+

Dacă discul de recuperat este un disc de paritate, actualizați opțiunea `parity` +corespunzătoare. +Dacă aveți mai multe discuri defecte, actualizați toate opțiunile lor de configurare. +

+
+

+PASUL 2 -> Reparare (Fix) +

+

Rulați comanda fix, stocând jurnalul într-un fișier extern cu: +

+snapraid -d NAME -l fix.log fix
+
+

Unde NAME este numele discului, cum ar fi `d1` în exemplul nostru anterior. +Dacă discul de recuperat este un disc de paritate, utilizați numele `parity`, `2-parity`, +etc. +Dacă aveți mai multe discuri defecte, utilizați mai multe opțiuni -d pentru a le specifica pe toate. +

Această comandă va dura mult timp. +

Asigurați-vă că aveți câțiva gigabytes liberi pentru a stoca fișierul fix.log. +Rulați-l de pe un disc cu suficient spațiu liber. +

Acum ați recuperat tot ce este recuperabil. Dacă unele fișiere sunt parțial +sau total nerecuperabile, vor fi redenumite adăugând extensia `.unrecoverable`. +

Puteți găsi o listă detaliată a tuturor blocurilor nerecuperabile în fișierul fix.log +verificând toate liniile care încep cu `unrecoverable:`. +

Dacă nu sunteți mulțumit de recuperare, o puteți reîncerca de câte +ori doriți. +

De exemplu, dacă ați eliminat fișiere din matrice după ultima +`sync`, acest lucru poate duce la nerecuperarea unor fișiere. +În acest caz, puteți reîncerca `fix`-ul utilizând opțiunea -i, --import, +specificând unde se află acum aceste fișiere pentru a le include din nou în +procesul de recuperare. +

Dacă sunteți mulțumit de recuperare, puteți continua, +dar rețineți că după sincronizare, nu mai puteți reîncerca comanda `fix` +deloc! +

+
+

+PASUL 3 -> Verificare (Check) +

+

Ca o verificare prudentă, puteți rula acum o comandă `check` pentru a vă asigura că +totul este corect pe discul recuperat. +

+snapraid -d NAME -a check
+
+

Unde NAME este numele discului, cum ar fi `d1` în exemplul nostru anterior. +

Opțiunile -d și -a spun SnapRAID să verifice doar discul specificat +și să ignore toate datele de paritate. +

Această comandă va dura mult timp, dar dacă nu sunteți excesiv de prudent, +o puteți sări. +

+
+

+PASUL 4 -> Sincronizare (Sync) +

+

Rulați comanda `sync` pentru a resincroniza matricea cu noul disc. +

+snapraid sync
+
+

Dacă totul este recuperat, această comandă este imediată. +

+
+
+
+

+Comenzi +

+

SnapRAID oferă câteva comenzi simple care vă permit să: +

    +
  • +Tipăriți starea matricei -> `status` +
  • +
  • +Controlați discurile -> `smart`, `probe`, `up`, `down` +
  • +
  • +Faceți un backup/snapshot -> `sync` +
  • +
  • +Verificați periodic datele -> `scrub` +
  • +
  • +Restaurați ultimul backup/snapshot -> `fix`. +
  • +
+

Comenzile trebuie scrise cu litere mici. +

+

+status +

+

Tipărește un rezumat al stării matricei de discuri. +

Include informații despre fragmentarea parității, cât de vechi +sunt blocurile fără verificare și toate erorile silențioase înregistrate +întâlnite în timpul verificării (scrubbing). +

Informațiile prezentate se referă la ultima dată când ați +rulat `sync`. Modificările ulterioare nu sunt luate în considerare. +

Dacă au fost detectate blocuri defecte, numerele lor de bloc sunt listate. +Pentru a le repara, puteți utiliza comanda `fix -e`. +

De asemenea, arată un grafic care reprezintă ultima dată când fiecare bloc +a fost verificat (scrubbed) sau sincronizat. Blocurile verificate sunt afișate cu '*', +blocurile sincronizate, dar încă neverificate, cu 'o'. +

Nimic nu este modificat. +

+
+

+smart +

+

Tipărește un raport SMART al tuturor discurilor din sistem. +

Include o estimare a probabilității de eșec în anul următor, +permițându-vă să planificați înlocuiri de întreținere a discurilor care prezintă +atribute suspecte. +

Această estimare a probabilității este obținută prin corelarea atributelor SMART +ale discurilor cu datele Backblaze disponibile la: +

+https://www.backblaze.com/hard-drive-test-data.html
+
+

Dacă SMART raportează că un disc este pe cale să eșueze, `FAIL` sau `PREFAIL` este tipărit +pentru acel disc, iar SnapRAID returnează o eroare. +În acest caz, înlocuirea imediată a discului este puternic recomandată. +

Alte șiruri de stare posibile sunt: +

+
+
+logfail +
+În trecut, unele atribute au fost mai mici decât +pragul. +
+
+
+
+logerr +
+Jurnalul de erori al dispozitivului conține erori. +
+
+
+
+selferr +
+Jurnalul de auto-test al dispozitivului conține erori. +
+
+
+

Dacă opțiunea -v, --verbose este specificată, este furnizată o analiză statistică +mai profundă. Această analiză vă poate ajuta să decideți dacă aveți nevoie de mai multă +sau mai puțină paritate. +

Această comandă utilizează instrumentul `smartctl` și este echivalentă cu rularea +`smartctl -a` pe toate dispozitivele. +

Dacă dispozitivele dvs. nu sunt detectate automat corect, puteți specifica +o comandă personalizată utilizând opțiunea `smartctl` în fișierul de configurare. +

Nimic nu este modificat. +

+
+

+probe +

+

Tipărește starea de ALIMENTARE (POWER) a tuturor discurilor din sistem. +

`Standby` înseamnă că discul nu se rotește. `Active` înseamnă +că discul se rotește. +

Această comandă utilizează instrumentul `smartctl` și este echivalentă cu rularea +`smartctl -n standby -i` pe toate dispozitivele. +

Dacă dispozitivele dvs. nu sunt detectate automat corect, puteți specifica +o comandă personalizată utilizând opțiunea `smartctl` în fișierul de configurare. +

Nimic nu este modificat. +

+
+

+up +

+

Pornirea tuturor discurilor din matrice. +

Puteți porni doar discuri specifice utilizând opțiunea -d, --filter-disk. +

Pornirea tuturor discurilor în același timp necesită multă energie. +Asigurați-vă că sursa dvs. de alimentare o poate susține. +

Nimic nu este modificat. +

+
+

+down +

+

Oprirea (spin down) tuturor discurilor din matrice. +

Această comandă utilizează instrumentul `smartctl` și este echivalentă cu rularea +`smartctl -s standby,now` pe toate dispozitivele. +

Puteți opri doar discuri specifice utilizând opțiunea -d, --filter-disk. +

Pentru a opri automat la eroare, puteți utiliza opțiunea -s, --spin-down-on-error +cu orice altă comandă, care este echivalentă cu rularea manuală a `down` +atunci când apare o eroare. +

Nimic nu este modificat. +

+
+

+diff +

+

Listează toate fișierele modificate de la ultima `sync` care trebuie +să li se recalculeze datele de paritate. +

Această comandă nu verifică datele fișierului, ci doar marca temporală, +dimensiunea și inodul fișierului. +

După listarea tuturor fișierelor modificate, este prezentat un rezumat al modificărilor, +grupate după: +

+
+
+equal +
+Fișiere neschimbate față de înainte. +
+
+
+
+added +
+Fișiere adăugate care nu erau prezente înainte. +
+
+
+
+removed +
+Fișiere eliminate. +
+
+
+
+updated +
+Fișiere cu o dimensiune sau marcă temporală diferită, ceea ce înseamnă că au +fost modificate. +
+
+
+
+moved +
+Fișiere mutate într-un director diferit pe același disc. +Sunt identificate având același nume, dimensiune, marcă temporală +și inod, dar un director diferit. +
+
+
+
+copied +
+Fișiere copiate pe același disc sau pe un disc diferit. Rețineți că dacă +sunt mutate cu adevărat pe un alt disc, vor fi, de asemenea, +numărate în `removed`. +Sunt identificate având același nume, dimensiune și +marcă temporală. Dacă marca temporală sub-secundă este zero, +întreaga cale trebuie să se potrivească, nu doar numele. +
+
+
+
+restored +
+Fișiere cu un inod diferit, dar nume, dimensiune și marcă temporală care se potrivesc. +Acestea sunt de obicei fișiere restaurate după ce au fost șterse. +
+
+
+

Dacă este necesară o `sync`, codul de retur al procesului este 2, în loc de +cel implicit 0. Codul de retur 1 este utilizat pentru o condiție de eroare generică. +

Nimic nu este modificat. +

+
+

+sync +

+

Actualizează informațiile de paritate. Toate fișierele modificate +din matricea de discuri sunt citite și datele de paritate +corespunzătoare sunt actualizate. +

Puteți opri acest proces în orice moment apăsând Ctrl+C, +fără a pierde munca deja efectuată. +La următoarea rulare, procesul `sync` va relua de unde +a fost întrerupt. +

Dacă se găsesc erori silențioase sau de intrare/ieșire în timpul procesului, +blocurile corespunzătoare sunt marcate ca defecte. +

Fișierele sunt identificate prin cale și/sau inod și verificate prin +dimensiune și marcă temporală. +Dacă dimensiunea sau marca temporală a fișierului diferă, datele de paritate +sunt recalculate pentru întregul fișier. +Dacă fișierul este mutat sau redenumit pe același disc, păstrând același +inod, paritatea nu este recalculată. +Dacă fișierul este mutat pe un alt disc, paritatea este recalculată, +dar informațiile hash calculate anterior sunt păstrate. +

Fișierele de `content` și `parity` sunt modificate dacă este necesar. +Fișierele din matrice NU sunt modificate. +

+
+

+scrub +

+

Verifică (scrubs) matricea, căutând erori silențioase sau de intrare/ieșire în discurile +de date și de paritate. +

Fiecare invocare verifică aproximativ 8% din matrice, excluzând +datele deja verificate în ultimele 10 zile. +Acest lucru înseamnă că verificarea o dată pe săptămână asigură că fiecare bit de date este verificat +cel puțin o dată la trei luni. +

Puteți defini un plan de verificare sau o cantitate diferită utilizând opțiunea -p, --plan, +care acceptă: +bad - Verifică blocurile marcate ca defecte. +new - Verifică blocurile tocmai sincronizate care nu au fost încă verificate. +full - Verifică totul. +0-100 - Verifică procentul specificat de blocuri. +

Dacă specificați o valoare procentuală, puteți utiliza și opțiunea -o, --older-than +pentru a defini cât de vechi ar trebui să fie blocul. +Cele mai vechi blocuri sunt verificate primele, asigurând o verificare optimă. +Dacă doriți să verificați doar blocurile tocmai sincronizate care nu au fost încă verificate, +utilizați opțiunea `-p new`. +

Pentru a obține detalii despre starea verificării, utilizați comanda `status`. +

Pentru orice eroare silențioasă sau de intrare/ieșire găsită, blocurile corespunzătoare +sunt marcate ca defecte în fișierul de `content`. +Aceste blocuri defecte sunt listate în `status` și pot fi reparate cu `fix -e`. +După reparare, la următorul scrub, vor fi reverificate, iar dacă se găsesc +corectate, marca defectă va fi eliminată. +Pentru a verifica doar blocurile defecte, puteți utiliza comanda `scrub -p bad`. +

Este recomandat să rulați `scrub` doar pe o matrice sincronizată pentru a evita +erorile raportate cauzate de date nesincronizate. Aceste erori sunt recunoscute +ca nefiind erori silențioase, iar blocurile nu sunt marcate ca defecte, +dar astfel de erori sunt raportate în ieșirea comenzii. +

Fișierul de `content` este modificat pentru a actualiza ora ultimei verificări +pentru fiecare bloc și pentru a marca blocurile defecte. +Fișierele de `parity` NU sunt modificate. +Fișierele din matrice NU sunt modificate. +

+
+

+fix +

+

Repară toate fișierele și datele de paritate. +

Toate fișierele și datele de paritate sunt comparate cu starea snapshot-ului +salvată la ultima `sync`. +Dacă se găsește o diferență, este readusă la snapshot-ul stocat. +

ATENȚIE! Comanda `fix` nu face diferența între erori și +modificări intenționate. Ea revine necondiționat la starea fișierului +de la ultima `sync`. +

Dacă nu este specificată nicio altă opțiune, întreaga matrice este procesată. +Utilizați opțiunile de filtrare pentru a selecta un subset de fișiere sau discuri de operat. +

Pentru a repara doar blocurile marcate ca defecte în timpul `sync` și `scrub`, +utilizați opțiunea -e, --filter-error. +Spre deosebire de alte opțiuni de filtrare, aceasta aplică reparații doar fișierelor care sunt +neschimbate de la ultima `sync`. +

SnapRAID redenumește toate fișierele care nu pot fi reparate adăugând extensia +`.unrecoverable`. +

Înainte de reparare, întreaga matrice este scanată pentru a găsi orice fișiere mutate +de la ultima operațiune `sync`. +Aceste fișiere sunt identificate prin marca lor temporală, ignorând numele +și directorul lor și sunt utilizate în procesul de recuperare dacă este necesar. +Dacă ați mutat unele dintre ele în afara matricei, puteți utiliza opțiunea -i, --import +pentru a specifica directoare suplimentare de scanat. +

Fișierele sunt identificate doar prin cale, nu prin inod. +

Fișierul de `content` NU este modificat. +Fișierele de `parity` sunt modificate dacă este necesar. +Fișierele din matrice sunt modificate dacă este necesar. +

+
+

+check +

+

Verifică toate fișierele și datele de paritate. +

Funcționează ca `fix`, dar simulează doar o recuperare și nu sunt scrise modificări +în matrice. +

Această comandă este destinată în primul rând verificării manuale, +cum ar fi după un proces de recuperare sau în alte condiții speciale. +Pentru verificări periodice și programate, utilizați `scrub`. +

Dacă utilizați opțiunea -a, --audit-only, doar datele fișierului +sunt verificate, iar datele de paritate sunt ignorate pentru o +rulare mai rapidă. +

Fișierele sunt identificate doar prin cale, nu prin inod. +

Nimic nu este modificat. +

+
+

+list +

+

Listează toate fișierele conținute în matrice la momentul +ultimei `sync`. +

Cu -v sau --verbose, este afișat și timpul sub-secundă. +

Nimic nu este modificat. +

+
+

+dup +

+

Listează toate fișierele duplicate. Două fișiere sunt considerate egale dacă hash-urile +lor se potrivesc. Datele fișierului nu sunt citite; sunt utilizate doar +hash-urile precalculate. +

Nimic nu este modificat. +

+
+

+pool +

+

Creează sau actualizează o vizualizare virtuală a tuturor +fișierelor din matricea dvs. de discuri în directorul de `pooling`. +

Fișierele nu sunt copiate, ci legate folosind +link-uri simbolice. +

La actualizare, toate link-urile simbolice existente și subdirectoarele goale +sunt șterse și înlocuite cu noua +vizualizare a matricei. Orice alte fișiere obișnuite sunt lăsate pe loc. +

Nimic nu este modificat în afara directorului pool. +

+
+

+devices +

+

Tipărește dispozitivele de nivel scăzut utilizate de matrice. +

Această comandă afișează asocierile de dispozitive din matrice +și este destinată în principal ca interfață de script. +

Primele două coloane sunt ID-ul și calea dispozitivului de nivel scăzut. +Următoarele două coloane sunt ID-ul și calea dispozitivului de nivel înalt. +Ultima coloană este numele discului din matrice. +

În majoritatea cazurilor, aveți un dispozitiv de nivel scăzut pentru fiecare disc din +matrice, dar în unele configurații mai complexe, puteți avea mai multe +dispozitive de nivel scăzut utilizate de un singur disc din matrice. +

Nimic nu este modificat. +

+
+

+touch +

+

Setează o marcă temporală arbitrară sub-secundă pentru toate fișierele +care o au setată la zero. +

Acest lucru îmbunătățește capacitatea SnapRAID de a recunoaște fișierele mutate +și copiate, deoarece face ca marca temporală să fie aproape unică, +reducând posibilele duplicate. +

Mai exact, dacă marca temporală sub-secundă nu este zero, +un fișier mutat sau copiat este identificat ca atare dacă se potrivește +cu numele, dimensiunea și marca temporală. Dacă marca temporală sub-secundă +este zero, este considerat o copie doar dacă calea completă, +dimensiunea și marca temporală se potrivesc toate. +

Marca temporală cu precizie de secundă nu este modificată, +deci toate datele și orele fișierelor dvs. vor fi păstrate. +

+
+

+rehash +

+

Programează o rehash-uire a întregii matrici. +

Această comandă schimbă tipul de hash utilizat, de obicei la actualizarea +de la un sistem pe 32 de biți la unul pe 64 de biți, pentru a trece de la +MurmurHash3 la SpookyHash, care este mai rapid. +

Dacă utilizați deja hash-ul optim, această comandă +nu face nimic și vă informează că nu este necesară nicio acțiune. +

Rehash-ul nu este efectuat imediat, ci are loc +progresiv în timpul `sync` și `scrub`. +

Puteți verifica starea rehash-ului utilizând `status`. +

În timpul rehash-ului, SnapRAID își menține funcționalitatea completă, +cu singura excepție că `dup` nu poate detecta fișierele duplicate +folosind un hash diferit. +

+
+
+

+Opțiuni +

+

SnapRAID oferă următoarele opțiuni: +

+
+
+-c, --conf CONFIG +
+Selectează fișierul de configurare de utilizat. Dacă nu este specificat, în Unix +utilizează fișierul `/usr/local/etc/snapraid.conf` dacă există, +altfel `/etc/snapraid.conf`. +În Windows, utilizează fișierul `snapraid.conf` din același +director ca `snapraid.exe`. +
+
+
+
+
+
+-f, --filter PATTERN +
+Filtrează fișierele de procesat în `check` și `fix`. +Sunt procesate doar fișierele care se potrivesc cu modelul specificat. +Această opțiune poate fi utilizată de mai multe ori. +Vedeți secțiunea PATTERN pentru mai multe detalii despre +specificațiile modelului. +În Unix, asigurați-vă că caracterele globbing sunt citate dacă sunt utilizate. +Această opțiune poate fi utilizată doar cu `check` și `fix`. +Nu poate fi utilizată cu `sync` și `scrub`, deoarece acestea +procesează întotdeauna întreaga matrice. +
+
+
+
+
+
+-d, --filter-disk NAME +
+Filtrează discurile de procesat în `check`, `fix`, `up` și `down`. +Trebuie să specificați un nume de disc așa cum este definit în fișierul de configurare. +Puteți specifica și discurile de paritate cu numele: `parity`, `2-parity`, +`3-parity`, etc., pentru a limita operațiunile la un anumit disc de paritate. +Dacă combinați mai multe opțiuni --filter, --filter-disk și --filter-missing, +sunt selectate doar fișierele care se potrivesc cu toate filtrele. +Această opțiune poate fi utilizată de mai multe ori. +Această opțiune poate fi utilizată doar cu `check`, `fix`, `up` și `down`. +Nu poate fi utilizată cu `sync` și `scrub`, deoarece acestea +procesează întotdeauna întreaga matrice. +
+
+
+
+
+
+-m, --filter-missing +
+Filtrează fișierele de procesat în `check` și `fix`. +Sunt procesate doar fișierele lipsă sau șterse din matrice. +Când este utilizată cu `fix`, aceasta acționează ca o comandă de `undelete` (anulare ștergere). +Dacă combinați mai multe opțiuni --filter, --filter-disk și --filter-missing, +sunt selectate doar fișierele care se potrivesc cu toate filtrele. +Această opțiune poate fi utilizată doar cu `check` și `fix`. +Nu poate fi utilizată cu `sync` și `scrub`, deoarece acestea +procesează întotdeauna întreaga matrice. +
+
+
+
+
+
+-e, --filter-error +
+Procesează fișierele cu erori în `check` și `fix`. +Procesează doar fișierele care au blocuri marcate cu erori silențioase +sau de intrare/ieșire în timpul `sync` și `scrub`, așa cum sunt listate în `status`. +Această opțiune poate fi utilizată doar cu `check` și `fix`. +
+
+
+
+
+
+-p, --plan PERC|bad|new|full +
+Selectează planul de verificare (scrub). Dacă PERC este o valoare numerică de la 0 la 100, +este interpretată ca procentul de blocuri de verificat. +În loc de un procent, puteți specifica un plan: +`bad` verifică blocurile defecte, `new` verifică blocurile care nu au fost încă verificate, +iar `full` verifică totul. +Această opțiune poate fi utilizată doar cu `scrub`. +
+
+
+
+
+
+-o, --older-than DAYS +
+Selectează cea mai veche parte a matricei de procesat în `scrub`. +DAYS este vârsta minimă în zile pentru ca un bloc să fie verificat; +valoarea implicită este 10. +Blocurile marcate ca defecte sunt întotdeauna verificate, indiferent de această opțiune. +Această opțiune poate fi utilizată doar cu `scrub`. +
+
+
+
+
+
+-a, --audit-only +
+În `check`, verifică hash-ul fișierelor fără +a verifica datele de paritate. +Dacă sunteți interesați doar de verificarea datelor fișierului, această +opțiune poate accelera semnificativ procesul de verificare. +Această opțiune poate fi utilizată doar cu `check`. +
+
+
+
+
+
+-h, --pre-hash +
+În `sync`, rulează o fază preliminară de hashing a tuturor datelor noi +pentru o verificare suplimentară înainte de calculul parității. +De obicei, în `sync`, nu se face hashing preliminar, iar datele noi +sunt hash-uite chiar înainte de calculul parității, atunci când sunt citite +pentru prima dată. +Acest proces are loc atunci când sistemul este sub +încărcare mare, cu toate discurile rotindu-se și un CPU ocupat. +Aceasta este o condiție extremă pentru mașină și, dacă are o +problemă hardware latentă, erorile silențioase pot trece nedetectate +deoarece datele nu sunt încă hash-uite. +Pentru a evita acest risc, puteți activa modul `pre-hash` pentru a avea +toate datele citite de două ori pentru a le asigura integritatea. +Această opțiune verifică și fișierele mutate în cadrul matricei +pentru a se asigura că operațiunea de mutare a fost reușită și, dacă este necesar, +vă permite să rulați o operațiune de reparare (fix) înainte de a continua. +Această opțiune poate fi utilizată doar cu `sync`. +
+
+
+
+
+
+-i, --import DIR +
+Importă din directorul specificat orice fișiere șterse +din matrice după ultima `sync`. +Dacă mai aveți astfel de fișiere, ele pot fi utilizate de `check` +și `fix` pentru a îmbunătăți procesul de recuperare. +Fișierele sunt citite, inclusiv în subdirectoare, și sunt +identificate indiferent de numele lor. +Această opțiune poate fi utilizată doar cu `check` și `fix`. +
+
+
+
+
+
+-s, --spin-down-on-error +
+La orice eroare, oprește (spin down) toate discurile gestionate înainte de a ieși cu +un cod de stare diferit de zero. Acest lucru împiedică unitățile să +rămână active și să se rotească după o operațiune întreruptă, +ajutând la evitarea acumulării inutile de căldură și a consumului de energie. +Utilizați această opțiune pentru a vă asigura că discurile sunt oprite în siguranță +chiar și atunci când o comandă eșuează. +
+
+
+
+
+
+-w, --bw-limit RATE +
+Aplică o limită globală de lățime de bandă pentru toate discurile. RATE este +numărul de octeți pe secundă. Puteți specifica un multiplicator +cum ar fi K, M sau G (de exemplu, --bw-limit 1G). +
+
+
+
+
+
+-A, --stats +
+Activează o vizualizare de stare extinsă care arată informații suplimentare. +Ecranul afișează două grafice: +Primul grafic arată numărul de dungi (stripes) tamponate pentru fiecare +disc, împreună cu calea fișierului care este +accesat în prezent pe acel disc. În mod obișnuit, cel mai lent disc nu va avea +tampon disponibil, ceea ce determină lățimea de bandă maximă realizabilă. +Al doilea grafic arată procentul de timp petrecut așteptând +în ultimele 100 de secunde. Este de așteptat ca cel mai lent disc să +cauzeze cea mai mare parte a timpului de așteptare, în timp ce alte discuri ar trebui să aibă +puțin sau deloc timp de așteptare, deoarece își pot utiliza dungile tamponate. +Acest grafic arată și timpul petrecut așteptând calculele hash +și calculele RAID. +Toate calculele rulează în paralel cu operațiunile de disc. +Prin urmare, atâta timp cât există timp de așteptare măsurabil pentru +cel puțin un disc, indică faptul că CPU-ul este suficient de rapid pentru a +ține pasul cu sarcina de lucru. +
+
+
+
+
+
+-Z, --force-zero +
+Forțează operațiunea nesigură de sincronizare a unui fișier cu dimensiunea zero +care era anterior non-zero. +Dacă SnapRAID detectează o astfel de condiție, se oprește din a continua +dacă nu specificați această opțiune. +Acest lucru vă permite să detectați cu ușurință când, după o cădere de sistem, +unele fișiere accesate au fost trunchiate. +Aceasta este o condiție posibilă în Linux cu sistemele de fișiere ext3/ext4. +Această opțiune poate fi utilizată doar cu `sync`. +
+
+
+
+
+
+-E, --force-empty +
+Forțează operațiunea nesigură de sincronizare a unui disc cu toate +fișierele originale lipsă. +Dacă SnapRAID detectează că toate fișierele prezente inițial +pe disc lipsesc sau au fost rescrise, se oprește din a continua +dacă nu specificați această opțiune. +Acest lucru vă permite să detectați cu ușurință când un sistem de fișiere de date nu este +montat. +Este permis, totuși, să aveți o singură schimbare de UUID cu +paritate simplă și mai multe cu paritate multiplă, deoarece acesta este +cazul normal la înlocuirea discurilor după o recuperare. +Această opțiune poate fi utilizată doar cu `sync`, `check` sau +`fix`. +
+
+
+
+
+
+-U, --force-uuid +
+Forțează operațiunea nesigură de sincronizare, verificare și reparare +cu discuri care și-au schimbat UUID-ul. +Dacă SnapRAID detectează că unele discuri și-au schimbat UUID-ul, +se oprește din a continua dacă nu specificați această opțiune. +Acest lucru vă permite să detectați când discurile dvs. sunt montate la +punctele de montare greșite. +Este permis, totuși, să aveți o singură schimbare de UUID cu +paritate simplă și mai multe cu paritate multiplă, deoarece acesta este +cazul normal la înlocuirea discurilor după o recuperare. +Această opțiune poate fi utilizată doar cu `sync`, `check` sau +`fix`. +
+
+
+
+
+
+-D, --force-device +
+Forțează operațiunea nesigură de reparare cu discuri inaccesibile +sau cu discuri pe același dispozitiv fizic. +De exemplu, dacă ați pierdut două discuri de date și aveți un disc de rezervă pentru a recupera +doar primul, puteți ignora al doilea disc inaccesibil. +Sau, dacă doriți să recuperați un disc în spațiul liber rămas pe un +disc deja utilizat, partajând același dispozitiv fizic. +Această opțiune poate fi utilizată doar cu `fix`. +
+
+
+
+
+
+-N, --force-nocopy +
+În `sync`, `check` și `fix`, dezactivează euristica de detectare a copiei. +Fără această opțiune, SnapRAID presupune că fișierele cu aceleași +atribute, cum ar fi numele, dimensiunea și marca temporală, sunt copii cu +aceleași date. +Acest lucru permite identificarea fișierelor copiate sau mutate de pe un disc +pe altul și refolosirea informațiilor hash deja calculate +pentru a detecta erori silențioase sau pentru a recupera fișiere lipsă. +În unele cazuri rare, acest comportament poate duce la rezultate fals pozitive +sau la un proces lent din cauza multor verificări hash, iar această +opțiune vă permite să rezolvați astfel de probleme. +Această opțiune poate fi utilizată doar cu `sync`, `check` și `fix`. +
+
+
+
+
+
+-F, --force-full +
+În `sync`, forțează o recalculare completă a parității. +Această opțiune poate fi utilizată atunci când adăugați un nou nivel de paritate sau dacă +ați revenit la un fișier de conținut vechi utilizând date de paritate mai recente. +În loc să recreați paritatea de la zero, aceasta vă permite +să reutilizați hash-urile prezente în fișierul de conținut pentru a valida datele +și a menține protecția datelor în timpul procesului `sync` utilizând +datele de paritate existente. +Această opțiune poate fi utilizată doar cu `sync`. +
+
+
+
+
+
+-R, --force-realloc +
+În `sync`, forțează o realocare completă a fișierelor și o reconstruire a parității. +Această opțiune poate fi utilizată pentru a realoca complet toate fișierele, +eliminând fragmentarea, în timp ce reutilizați hash-urile prezente în fișierul de conținut +pentru a valida datele. +Această opțiune poate fi utilizată doar cu `sync`. +ATENȚIE! Această opțiune este doar pentru experți și este puternic +recomandat să nu o utilizați. +NU aveți protecție a datelor în timpul operațiunii `sync`. +
+
+
+
+
+
+-l, --log FILE +
+Scrie un jurnal detaliat în fișierul specificat. +Dacă această opțiune nu este specificată, erorile neașteptate sunt tipărite +pe ecran, putând rezulta o ieșire excesivă în caz de +multe erori. Când -l, --log este specificat, doar +erorile fatale care fac SnapRAID să se oprească sunt tipărite +pe ecran. +Dacă calea începe cu '>>', fișierul este deschis +în modul de adăugare. Aparițiile de '%D' și '%T' în nume sunt +înlocuite cu data și ora în formatul YYYYMMDD și +HHMMSS. În fișierele batch Windows, trebuie să dublați +caracterul '%', de exemplu, result-%%D.log. Pentru a utiliza '>>', trebuie +să închideți numele între ghilimele, de exemplu, `">>result.log"`. +Pentru a scoate jurnalul la ieșirea standard sau la eroarea standard, +puteți utiliza `">&1"` și `">&2"`, respectiv. +Vedeți fișierul snapraid_log.txt sau pagina de manual pentru descrieri ale etichetelor jurnalului. +
+
+
+
+
+
+-L, --error-limit NUMBER +
+Setează o nouă limită de erori înainte de a opri execuția. +În mod implicit, SnapRAID se oprește dacă întâlnește mai mult de 100 +de erori de intrare/ieșire, indicând că un disc probabil eșuează. +Această opțiune afectează `sync` și `scrub`, cărora li se permite +să continue după primul set de erori de disc pentru a încerca +să își finalizeze operațiunile. +Cu toate acestea, `check` și `fix` se opresc întotdeauna la prima eroare. +
+
+
+
+
+
+-S, --start BLKSTART +
+Începe procesarea de la numărul de bloc +specificat. Acest lucru poate fi util pentru a reîncerca verificarea +sau repararea anumitor blocuri în cazul unui disc deteriorat. +Această opțiune este în principal pentru recuperarea manuală avansată. +
+
+
+
+
+
+-B, --count BLKCOUNT +
+Procesează doar numărul specificat de blocuri. +Această opțiune este în principal pentru recuperarea manuală avansată. +
+
+
+
+
+
+-C, --gen-conf CONTENT +
+Generează un fișier de configurare fictiv dintr-un fișier +de conținut existent. +Fișierul de configurare este scris la ieșirea standard +și nu suprascrie unul existent. +Acest fișier de configurare conține și informațiile +necesare pentru a reconstrui punctele de montare a discului în cazul în care +pierdeți întregul sistem. +
+
+
+
+
+
+-v, --verbose +
+Tipărește mai multe informații pe ecran. +Dacă este specificat o dată, tipărește fișierele excluse +și statistici suplimentare. +Această opțiune nu are niciun efect asupra fișierelor jurnal. +
+
+
+
+
+
+-q, --quiet +
+Tipărește mai puține informații pe ecran. +Dacă este specificat o dată, elimină bara de progres; de două ori, +operațiunile în curs; de trei ori, mesajele info +; de patru ori, mesajele de stare. +Erorile fatale sunt întotdeauna tipărite pe ecran. +Această opțiune nu are niciun efect asupra fișierelor jurnal. +
+
+
+
+
+
+-H, --help +
+Tipărește un ecran de ajutor scurt. +
+
+
+
+
+
+-V, --version +
+Tipărește versiunea programului. +
+
+
+
+
+

+Configurare +

+

SnapRAID necesită un fișier de configurare pentru a ști unde se află matricea dvs. de discuri +și unde să stocheze informațiile de paritate. +

În Unix, utilizează fișierul `/usr/local/etc/snapraid.conf` dacă există, +altfel `/etc/snapraid.conf`. +În Windows, utilizează fișierul `snapraid.conf` din același +director ca `snapraid.exe`. +

Trebuie să conțină următoarele opțiuni (sensibile la majuscule/minuscule): +

+

+parity FILE [,FILE] ... +

+

Definește fișierele de utilizat pentru a stoca informațiile de paritate. +Paritatea permite protecția împotriva unei singure defecțiuni de disc, +similar cu RAID5. +

Puteți specifica mai multe fișiere, care trebuie să fie pe discuri diferite. +Când un fișier nu mai poate crește, este utilizat următorul. +Spațiul total disponibil trebuie să fie cel puțin la fel de mare ca cel mai mare disc de date din +matrice. +

Puteți adăuga fișiere de paritate suplimentare mai târziu, dar nu +le puteți reordona sau elimina. +

Păstrarea discurilor de paritate rezervate pentru paritate asigură că +nu devin fragmentate, îmbunătățind performanța. +

În Windows, 256 MB sunt lăsați neutilizați pe fiecare disc pentru a evita +avertismentul despre discuri pline. +

Această opțiune este obligatorie și poate fi utilizată o singură dată. +

+
+

+(2,3,4,5,6)-parity FILE [,FILE] ... +

+

Definește fișierele de utilizat pentru a stoca informații de paritate suplimentare. +

Pentru fiecare nivel de paritate specificat, este activat un nivel suplimentar de protecție: +

    +
  • +2-parity activează paritatea dublă RAID6. +
  • +
  • +3-parity activează paritatea triplă. +
  • +
  • +4-parity activează paritatea quad (patru). +
  • +
  • +5-parity activează paritatea penta (cinci). +
  • +
  • +6-parity activează paritatea hexa (șase). +
  • +
+

Fiecare nivel de paritate necesită prezența tuturor nivelurilor de paritate +anterioare. +

Aceleași considerații ca pentru opțiunea 'parity' se aplică. +

Aceste opțiuni sunt opționale și pot fi utilizate o singură dată. +

+
+

+z-parity FILE [,FILE] ... +

+

Definește un fișier și un format alternativ pentru a stoca paritatea triplă. +

Această opțiune este o alternativă la '3-parity', destinată în primul rând +CPU-urilor low-end precum ARM sau AMD Phenom, Athlon și Opteron care nu +suportă setul de instrucțiuni SSSE3. În astfel de cazuri, oferă +o performanță mai bună. +

Acest format este similar, dar mai rapid decât cel utilizat de ZFS RAIDZ3. +Ca și ZFS, nu funcționează dincolo de paritatea triplă. +

Când utilizați '3-parity', veți fi avertizați dacă este recomandat să utilizați +formatul 'z-parity' pentru îmbunătățirea performanței. +

Este posibil să convertiți de la un format la altul ajustând +fișierul de configurare cu fișierul z-parity sau 3-parity dorit +și utilizând 'fix' pentru a-l recrea. +

+
+

+content FILE +

+

Definește fișierul de utilizat pentru a stoca lista și sumele de control (checksums) a tuturor +fișierelor prezente în matricea dvs. de discuri. +

Poate fi plasat pe un disc utilizat pentru date, paritate sau +orice alt disc disponibil. +Dacă utilizați un disc de date, acest fișier este automat exclus +din procesul `sync`. +

Această opțiune este obligatorie și poate fi utilizată de mai multe ori pentru a salva +mai multe copii ale aceluiași fișier. +

Trebuie să stocați cel puțin o copie pentru fiecare disc de paritate utilizat +plus unul. Utilizarea de copii suplimentare nu dăunează. +

+
+

+data NAME DIR +

+

Definește numele și punctul de montare al discurilor de date din +matrice. NAME este utilizat pentru a identifica discul și trebuie +să fie unic. DIR este punctul de montare al discului în +sistemul de fișiere. +

Puteți schimba punctul de montare după cum este necesar, atâta timp cât +păstrați NAME fix. +

Ar trebui să utilizați o opțiune pentru fiecare disc de date din matrice. +

Puteți redenumi un disc mai târziu schimbând NAME direct +în fișierul de configurare și apoi rulând o comandă 'sync'. +În cazul redenumirii, asocierea se face utilizând UUID-ul stocat +al discurilor. +

+
+

+nohidden +

+

Exclude toate fișierele și directoarele ascunse. +În Unix, fișierele ascunse sunt cele care încep cu `.`. +În Windows, sunt cele cu atributul ascuns. +

+
+

+exclude/include PATTERN +

+

Definește modelele de fișiere sau directoare de exclus sau inclus +în procesul de sincronizare. +Toate modelele sunt procesate în ordinea specificată. +

Dacă primul model care se potrivește este un `exclude`, fișierul +este exclus. Dacă este un `include`, fișierul este inclus. +Dacă niciun model nu se potrivește, fișierul este exclus dacă ultimul model +specificat este un `include`, sau inclus dacă ultimul model +specificat este un `exclude`. +

Vedeți secțiunea PATTERN pentru mai multe detalii despre +specificațiile modelului. +

Această opțiune poate fi utilizată de mai multe ori. +

+
+

+blocksize SIZE_IN_KIBIBYTES +

+

Definește dimensiunea de bază a blocului în kibibytes pentru paritate. +Un kibibyte este 1024 de octeți. +

Dimensiunea implicită a blocului este 256, care ar trebui să funcționeze pentru majoritatea cazurilor. +

ATENȚIE! Această opțiune este doar pentru experți și este puternic +recomandat să nu schimbați această valoare. Pentru a schimba această valoare în +viitor, va trebui să recreați întreaga paritate! +

Un motiv pentru a utiliza o dimensiune de bloc diferită este dacă aveți multe fișiere +mici, de ordinul milioanelor. +

Pentru fiecare fișier, chiar dacă are doar câțiva octeți, este alocat un bloc întreg de paritate, +iar cu multe fișiere, acest lucru poate duce la un spațiu de paritate neutilizat semnificativ. +Când umpleți complet discul de paritate, nu vi se +permite să adăugați mai multe fișiere pe discurile de date. +Cu toate acestea, paritatea irosită nu se acumulează pe discurile de date. Spațiul irosit +rezultat dintr-un număr mare de fișiere pe un disc de date limitează doar +cantitatea de date de pe acel disc de date, nu pe celelalte. +

Ca o aproximare, puteți presupune că jumătate din dimensiunea blocului este +irosită pentru fiecare fișier. De exemplu, cu 100.000 de fișiere și o dimensiune de bloc +de 256 KiB, veți irosi 12,8 GB de paritate, ceea ce poate duce +la 12,8 GB mai puțin spațiu disponibil pe discul de date. +

Puteți verifica cantitatea de spațiu irosit pe fiecare disc utilizând `status`. +Aceasta este cantitatea de spațiu pe care trebuie să o lăsați liberă pe discurile de date +sau să o utilizați pentru fișiere care nu sunt incluse în matrice. +Dacă această valoare este negativă, înseamnă că sunteți aproape de a umple +paritatea și reprezintă spațiul pe care îl puteți irosi încă. +

Pentru a evita această problemă, puteți utiliza o partiție mai mare pentru paritate. +De exemplu, dacă partiția de paritate este cu 12,8 GB mai mare decât discurile de date, +aveți suficient spațiu suplimentar pentru a gestiona până la 100.000 +de fișiere pe fiecare disc de date fără niciun spațiu irosit. +

Un truc pentru a obține o partiție de paritate mai mare în Linux este să o formatați +cu comanda: +

+mkfs.ext4 -m 0 -T largefile4 DEVICE
+
+

Acest lucru duce la aproximativ 1,5% spațiu suplimentar, aproximativ 60 GB pentru +un disc de 4 TB, ceea ce permite aproximativ 460.000 de fișiere pe fiecare disc de date fără +niciun spațiu irosit. +

+
+

+hashsize SIZE_IN_BYTES +

+

Definește dimensiunea hash-ului în octeți pentru blocurile salvate. +

Dimensiunea implicită a hash-ului este de 16 octeți (128 de biți), care ar trebui să funcționeze +pentru majoritatea cazurilor. +

ATENȚIE! Această opțiune este doar pentru experți și este puternic +recomandat să nu schimbați această valoare. Pentru a schimba această valoare în +viitor, va trebui să recreați întreaga paritate! +

Un motiv pentru a utiliza o dimensiune de hash diferită este dacă sistemul dvs. are +memorie limitată. Ca regulă generală, SnapRAID necesită de obicei +1 GiB de RAM pentru fiecare 16 TB de date din matrice. +

Mai exact, pentru a stoca hash-urile datelor, SnapRAID necesită +aproximativ TS*(1+HS)/BS octeți de RAM, +unde TS este dimensiunea totală în octeți a matricei dvs. de discuri, BS este +dimensiunea blocului în octeți, iar HS este dimensiunea hash-ului în octeți. +

De exemplu, cu 8 discuri de 4 TB, o dimensiune de bloc de 256 KiB +(1 KiB = 1024 octeți) și o dimensiune de hash de 16, obțineți: +

+RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1,93 GiB
+
+

Trecând la o dimensiune de hash de 8, obțineți: +

+RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1,02 GiB
+
+

Trecând la o dimensiune de bloc de 512, obțineți: +

+RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0,96 GiB
+
+

Trecând la ambele, o dimensiune de hash de 8 și o dimensiune de bloc de 512, obțineți: +

+RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0,51 GiB
+
+
+
+

+autosave SIZE_IN_GIGABYTES +

+

Salvează automat starea la sincronizare sau verificare după +cantitatea specificată de GB procesați. +Această opțiune este utilă pentru a evita repornirea comenzilor `sync` lungi +de la zero dacă sunt întrerupte de o cădere a mașinii sau de orice alt eveniment. +

+
+

+temp_limit TEMPERATURE_CELSIUS +

+

Setează temperatura maximă permisă a discului în Celsius. Când este specificată, +SnapRAID verifică periodic temperatura tuturor discurilor utilizând +instrumentul smartctl. Temperaturile curente ale discurilor sunt afișate în timp ce +SnapRAID funcționează. Dacă un disc depășește această limită, toate operațiunile +se opresc, iar discurile sunt oprite (puse în standby) pentru durata +definită de opțiunea `temp_sleep`. După perioada de așteptare, operațiunile +reiau, putând întrerupe din nou dacă limita de temperatură este atinsă +încă o dată. +

În timpul funcționării, SnapRAID analizează și curba de încălzire a fiecărui +disc și estimează temperatura constantă pe termen lung pe care se așteaptă să o +atingă dacă activitatea continuă. Estimarea este efectuată numai după +ce temperatura discului a crescut de patru ori, asigurându-se că sunt disponibile +suficiente puncte de date pentru a stabili o tendință fiabilă. +Această temperatură constantă prezisă este afișată între paranteze lângă +valoarea curentă și ajută la evaluarea dacă răcirea sistemului este +adecvată. Această temperatură estimată este doar în scop informativ +și nu are niciun efect asupra comportamentului SnapRAID. Acțiunile programului +se bazează exclusiv pe temperaturile reale măsurate ale discurilor. +

Pentru a efectua această analiză, SnapRAID are nevoie de o referință pentru +temperatura sistemului. Încearcă mai întâi să o citească de la senzorii hardware +disponibili. Dacă nu poate fi accesat niciun senzor de sistem, utilizează +cea mai scăzută temperatură a discului măsurată la începutul rulării ca referință de rezervă. +

În mod normal, SnapRAID arată doar temperatura celui mai fierbinte disc. +Pentru a afișa temperatura tuturor discurilor, utilizați opțiunea -A sau --stats. +

+
+

+temp_sleep TIME_IN_MINUTES +

+

Setează timpul de așteptare (standby), în minute, când limita de temperatură este +atinsă. În această perioadă, discurile rămân oprite. Valoarea implicită +este 5 minute. +

+
+

+pool DIR +

+

Definește directorul de pooling unde este creată vizualizarea virtuală a matricei +de discuri utilizând comanda `pool`. +

Directorul trebuie să existe deja. +

+
+

+share UNC_DIR +

+

Definește calea UNC Windows necesară pentru a accesa discurile de la distanță. +

Dacă această opțiune este specificată, link-urile simbolice create în directorul pool +utilizează această cale UNC pentru a accesa discurile. +Fără această opțiune, link-urile simbolice generate utilizează doar căi locale, +ceea ce nu permite partajarea directorului pool peste rețea. +

Link-urile simbolice sunt formate utilizând calea UNC specificată, adăugând +numele discului specificat în opțiunea `data` și, în final, adăugând +directorul și numele fișierului. +

Această opțiune este necesară doar pentru Windows. +

+
+

+smartctl DISK/PARITY OPTIONS... +

+

Definește opțiuni smartctl personalizate pentru a obține atributele SMART pentru +fiecare disc. Acest lucru poate fi necesar pentru controlerele RAID și unele discuri USB +care nu pot fi detectate automat. Substituția %s este înlocuită de +numele dispozitivului, dar este opțională pentru dispozitivele fixe, cum ar fi controlerele RAID. +

DISK este același nume de disc specificat în opțiunea `data`. +PARITY este unul dintre numele de paritate: `parity`, `2-parity`, `3-parity`, +`4-parity`, `5-parity`, `6-parity` sau `z-parity`. +

În OPȚIUNILE specificate, șirul `%s` este înlocuit de +numele dispozitivului. Pentru controlerele RAID, dispozitivul este +probabil fix și este posibil să nu fie nevoie să utilizați `%s`. +

Consultați documentația smartmontools pentru opțiuni posibile: +

+https://www.smartmontools.org/wiki/Supported_RAID-Controllers
+https://www.smartmontools.org/wiki/Supported_USB-Devices
+
+

De exemplu: +

+smartctl parity -d sat %s
+
+
+
+

+smartignore DISK/PARITY ATTR [ATTR...] +

+

Ignoră atributul SMART specificat la calcularea probabilității +de eșec a discului. Această opțiune este utilă dacă un disc raportează valori neobișnuite sau +înșelătoare pentru un anumit atribut. +

DISK este același nume de disc specificat în opțiunea `data`. +PARITY este unul dintre numele de paritate: `parity`, `2-parity`, `3-parity`, +`4-parity`, `5-parity`, `6-parity` sau `z-parity`. +Valoarea specială * poate fi utilizată pentru a ignora atributul pe toate discurile. +

De exemplu, pentru a ignora atributul `Current Pending Sector Count` pe +toate discurile: +

+smartignore * 197
+
+

Pentru a-l ignora doar pe primul disc de paritate: +

+smartignore parity 197
+
+
+
+

+Exemple +

+

Un exemplu de configurare tipică pentru Unix este: +

+parity /mnt/diskp/snapraid.parity
+content /mnt/diskp/snapraid.content
+content /var/snapraid/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+exclude /lost+found/
+exclude /tmp/
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/sg0
+smartctl 2-parity -d areca,2/1 /dev/sg0
+
+

Un exemplu de configurare tipică pentru Windows este: +

+parity E:\snapraid.parity
+content E:\snapraid.content
+content C:\snapraid\snapraid.content
+data d1 G:\array\
+data d2 H:\array\
+data d3 I:\array\
+exclude Thumbs.db
+exclude \$RECYCLE.BIN
+exclude \System Volume Information
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/arcmsr0
+smartctl 2-parity -d areca,2/1 /dev/arcmsr0
+
+
+
+
+

+Model (Pattern) +

+

Modelele oferă o modalitate flexibilă de a filtra fișierele pentru includere sau +excludere. Folosind caractere de tip globbing, puteți defini reguli care să +se potrivească cu nume de fișiere specifice sau cu structuri întregi de directoare fără +a lista manual fiecare cale. +

Semnul întrebării `?` se potrivește cu orice caracter unic, cu excepția +separatorului de directoare. Acest lucru îl face util pentru potrivirea numelor de fișiere cu +caractere variabile, păstrând în același timp modelul limitat la un singur nivel de director. +

Asteriscul simplu `*` se potrivește cu orice secvență de caractere, dar, la fel ca +semnul întrebării, nu trece niciodată de limitele directoarelor. Se oprește la +slash-ul înainte, ceea ce îl face potrivit pentru potrivirea în cadrul unei singure +componente a căii. Acesta este comportamentul standard al metacaracterelor, familiar +din shell globbing. +

Asteriscul dublu `**` este mai puternic, se potrivește cu orice secvență de +caractere, inclusiv separatori de directoare. Acest lucru permite modelelor să se potrivească +pe mai multe niveluri de directoare. Când `**` apare inserat direct într-un +model, se poate potrivi cu zero sau mai multe caractere, inclusiv slash-uri între +textul literal înconjurător. +

Cea mai importantă utilizare a lui `**` este în forma specială `/**/`. Aceasta se potrivește cu +zero sau mai multe niveluri complete de directoare, făcând posibilă potrivirea fișierelor +la orice adâncime într-un arbore de directoare fără a cunoaște structura exactă a căii. +De exemplu, modelul `src/**/main.js` se potrivește cu `src/main.js` (sărind +peste zero directoare), `src/ui/main.js` (sărind peste un director) și +`src/ui/components/main.js` (sărind peste două directoare). +

Clasele de caractere care utilizează paranteze pătrate `[]` se potrivesc cu un singur caracter dintr-un +set sau interval specificat. La fel ca și celelalte modele de un singur caracter, acestea +nu se potrivesc cu separatorii de directoare. Clasele suportă intervale și negarea folosind +un semn de exclamare. +

Distincția fundamentală de reținut este că `*`, `?` și clasele de caractere +respectă toate limitele directoarelor și se potrivesc doar în cadrul unei singure +componente a căii, în timp ce `**` este singurul model care se poate potrivi peste +separatorii de directoare. +

Există patru tipuri diferite de modele: +

+
+
+FILE +
+Selectează orice fișier cu numele FILE. +Acest model se aplică numai fișierelor, nu și directoarelor. +
+
+
+
+
+
+DIR/ +
+Selectează orice director cu numele DIR și tot ce se află în interior. +Acest model se aplică numai directoarelor, nu și fișierelor. +
+
+
+
+
+
+/PATH/FILE +
+Selectează calea exactă a fișierului specificat. Acest model se aplică +numai fișierelor, nu și directoarelor. +
+
+
+
+
+
+/PATH/DIR/ +
+Selectează calea exactă a directorului specificat și tot ce se află +în interior. Acest model se aplică numai directoarelor, nu și fișierelor. +
+
+
+

Când specificați o cale absolută care începe cu /, aceasta este aplicată la +directorul rădăcină al matricei, nu la directorul rădăcină al sistemului de fișiere local. +

În Windows, puteți utiliza backslash-ul \ în loc de slash-ul /. +Directoarele de sistem Windows, joncțiunile, punctele de montare și alte directoare +speciale Windows sunt tratate ca fișiere, ceea ce înseamnă că pentru a le exclude, +trebuie să utilizați o regulă de fișier, nu una de director. +

Dacă numele fișierului conține un caracter '*', '?', '[', +sau ']', trebuie să îl escape-ați pentru a evita să fie interpretat ca un +caracter de globbing. În Unix, caracterul escape este '\'; în Windows, este '^'. +Când modelul este pe linia de comandă, trebuie să dublați caracterul escape +pentru a evita ca acesta să fie interpretat de shell-ul de comandă. +

În fișierul de configurare, puteți utiliza diferite strategii pentru a filtra +fișierele de procesat. +Abordarea cea mai simplă este să utilizați doar reguli `exclude` pentru a elimina toate +fișierele și directoarele pe care nu doriți să le procesați. De exemplu: +

+# Exclude orice fișier numit `*.unrecoverable`
+exclude *.unrecoverable
+# Exclude directorul rădăcină `/lost+found`
+exclude /lost+found/
+# Exclude orice subdirector numit `tmp`
+exclude tmp/
+
+

Abordarea opusă este să definiți doar fișierele pe care doriți să le procesați, utilizând +doar reguli `include`. De exemplu: +

+# Include doar unele directoare
+include /movies/
+include /musics/
+include /pictures/
+
+

Abordarea finală este de a amesteca regulile `exclude` și `include`. În acest caz, +ordinea regulilor este importantă. Regulile anterioare au +precedență față de cele ulterioare. +Pentru a simplifica, puteți lista toate regulile `exclude` mai întâi și apoi +toate regulile `include`. De exemplu: +

+# Exclude orice fișier numit `*.unrecoverable`
+exclude *.unrecoverable
+# Exclude orice subdirector numit `tmp`
+exclude tmp/
+# Include doar unele directoare
+include /movies/
+include /musics/
+include /pictures/
+
+

Pe linia de comandă, utilizând opțiunea -f, puteți utiliza doar modele `include`. +De exemplu: +

+# Verifică doar fișierele .mp3.
+# În Unix, utilizați ghilimele pentru a evita expansiunea globbing de către shell.
+snapraid -f "*.mp3" check
+
+

În Unix, când utilizați caractere globbing pe linia de comandă, trebuie +să le citați pentru a împiedica shell-ul să le extindă. +

+
+

+Fișiere de Ignorat (Ignore File) +

+

Pe lângă regulile globale din fișierul de configurare, puteți plasa fișiere +`.snapraidignore` în orice director din array pentru a defini reguli de excludere +descentralizate. +

Regulile definite în `.snapraidignore` sunt aplicate după regulile din fișierul +de configurare. Acest lucru înseamnă că au o prioritate mai mare și pot fi +utilizate pentru a exclude fișiere care au fost incluse anterior de configurația +globală. Efectiv, dacă o regulă locală se potrivește, fișierul este exclus +indiferent de setările globale de includere. +

Logica modelelor în `.snapraidignore` oglindește configurația globală, dar +ancorează modelele de directorul în care se află fișierul: +

+
+
+FILE +
+Selectează orice fișier numit FILE în acest director sau mai jos. +Acesta urmează aceleași reguli de globbing ca modelul global. +
+
+
+
+
+
+DIR/ +
+Selectează orice director numit DIR și tot ce se află în interior, +aflat în acest director sau mai jos. +
+
+
+
+
+
+/PATH/FILE +
+Selectează fișierul exact specificat raportat la locația +fișierului `.snapraidignore`. +
+
+
+
+
+
+/PATH/DIR/ +
+Selectează directorul exact specificat și tot ce se află în interior, +raportat la locația fișierului `.snapraidignore`. +
+
+
+

Spre deosebire de configurația globală, fișierele `.snapraidignore` suportă +doar reguli de excludere; nu puteți utiliza modele de `include` sau negația (!). +

De exemplu, dacă aveți un `.snapraidignore` în `/mnt/disk1/projects/`: +

+# Exclude DOAR /mnt/disk1/projects/output.bin
+/output.bin
+# Exclude orice director numit 'build' în interiorul projects/
+build/
+# Exclude orice fișier .tmp în interiorul projects/ sau subfolderele sale
+*.tmp
+
+
+
+

+Conținut (Content) +

+

SnapRAID stochează lista și sumele de control (checksums) ale fișierelor dvs. în fișierul de conținut. +

Este un fișier binar care listează toate fișierele prezente în matricea dvs. de discuri, +împreună cu toate sumele de control pentru a le verifica integritatea. +

Acest fișier este citit și scris de comenzile `sync` și `scrub` și +citit de comenzile `fix`, `check` și `status`. +

+
+

+Paritate (Parity) +

+

SnapRAID stochează informațiile de paritate ale matricei dvs. în fișierele de paritate. +

Acestea sunt fișiere binare care conțin paritatea calculată a tuturor +blocurilor definite în fișierul de `content`. +

Aceste fișiere sunt citite și scrise de comenzile `sync` și `fix` și +doar citite de comenzile `scrub` și `check`. +

+
+

+Codare (Encoding) +

+

SnapRAID în Unix ignoră orice codare. Citește și stochează +numele fișierelor cu aceeași codare utilizată de sistemul de fișiere. +

În Windows, toate numele citite din sistemul de fișiere sunt convertite și +procesate în format UTF-8. +

Pentru a avea numele fișierelor tipărite corect, trebuie să setați consola Windows +în modul UTF-8 cu comanda `chcp 65001` și să utilizați +un font TrueType precum `Lucida Console` ca font al consolei. +Acest lucru afectează doar numele de fișiere tipărite; dacă +redirecționați ieșirea consolei către un fișier, fișierul rezultat este întotdeauna +în format UTF-8. +

+
+

+Drept de Autor (Copyright) +

+

Acest fișier este Copyright (C) 2025 Andrea Mazzoleni +

+
+

+Vezi și (See Also) +

+

snapraid_log(1), snapraidd(1) +

+ + +
+
+
+ + + + + + + diff --git a/beta/manual-ru.html b/beta/manual-ru.html new file mode 100644 index 00000000..e07c6e3d --- /dev/null +++ b/beta/manual-ru.html @@ -0,0 +1,1971 @@ + + + + + + + + SnapRAID Manual + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + +
+ +
+ +
+

+Synopsis +

+
+snapraid [-c, --conf CONFIG]
+    [-f, --filter PATTERN] [-d, --filter-disk NAME]
+    [-m, --filter-missing] [-e, --filter-error]
+    [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR]
+    [-p, --plan PERC|bad|new|full]
+    [-o, --older-than DAYS] [-l, --log FILE]
+    [-s, --spin-down-on-error] [-w, --bw-limit RATE]
+    [-Z, --force-zero] [-E, --force-empty]
+    [-U, --force-uuid] [-D, --force-device]
+    [-N, --force-nocopy] [-F, --force-full]
+    [-R, --force-realloc]
+    [-S, --start BLKSTART] [-B, --count BLKCOUNT]
+    [-L, --error-limit NUMBER]
+    [-A, --stats]
+    [-v, --verbose] [-q, --quiet]
+    status|smart|probe|up|down|diff|sync|scrub|fix|check
+    |list|dup|pool|devices|touch|rehash
+
+
+snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT]
+
+
+
+

+Description +

+

SnapRAID — это программа резервного копирования, разработанная для дисковых массивов, +хранящая информацию четности для восстановления данных в случае сбоя +до шести дисков. +

В первую очередь предназначенная для домашних медиацентров с большими, +редко меняющимися файлами, SnapRAID предлагает несколько функций: +

    +
  • +Вы можете использовать диски, уже заполненные файлами, без +необходимости их переформатирования, получая к ним доступ как обычно. +
  • +
  • +Все ваши данные хэшируются для обеспечения целостности данных и +предотвращения скрытого повреждения. +
  • +
  • +Когда число отказавших дисков превышает количество дисков четности, +потеря данных ограничивается затронутыми дисками; данные на +других дисках остаются доступными. +
  • +
  • +Если вы случайно удалите файлы на диске, возможно их восстановление. +
  • +
  • +Диски могут иметь разные размеры. +
  • +
  • +Вы можете добавлять диски в любое время. +
  • +
  • +SnapRAID не блокирует ваши данные; вы можете прекратить его использование +в любое время без переформатирования или перемещения данных. +
  • +
  • +Для доступа к файлу должен раскручиваться только один диск, что экономит +энергию и снижает шум. +
  • +
+

Для получения дополнительной информации, пожалуйста, посетите официальный сайт SnapRAID: +

+https://www.snapraid.it/
+
+
+
+

+Limitations +

+

SnapRAID — это гибрид программы RAID и программы резервного копирования, +стремящийся объединить лучшие преимущества обеих. Однако у него есть +некоторые ограничения, которые следует учитывать перед использованием. +

Основное ограничение заключается в том, что если диск выходит из строя, а вы +недавно не выполняли синхронизацию, вы можете не восстановить данные полностью. +В частности, вы можете не восстановить данные в объеме, равном размеру +измененных или удаленных файлов с момента последней операции синхронизации. +Это происходит, даже если измененные или удаленные файлы не находятся +на отказавшем диске. Вот почему SnapRAID лучше подходит для +данных, которые редко меняются. +

С другой стороны, недавно добавленные файлы не препятствуют восстановлению уже +существующих файлов. Вы потеряете только недавно добавленные файлы, +если они находятся на отказавшем диске. +

Другие ограничения SnapRAID: +

    +
  • +Со SnapRAID у вас все еще отдельные файловые системы для каждого диска. +С RAID вы получаете единую большую файловую систему. +
  • +
  • +SnapRAID не выполняет чередование данных. +С RAID вы получаете прирост скорости благодаря чередованию. +
  • +
  • +SnapRAID не поддерживает восстановление в реальном времени. +С RAID вам не нужно прекращать работу при сбое диска. +
  • +
  • +SnapRAID может восстановить данные только при ограниченном числе сбоев дисков. +С резервным копированием вы можете восстановиться после полного +сбоя всего дискового массива. +
  • +
  • +Сохраняются только имена файлов, метки времени, символические ссылки и жесткие ссылки. +Разрешения, права владения и расширенные атрибуты не сохраняются. +
  • +
+
+
+

+Getting Started +

+

Чтобы использовать SnapRAID, вам нужно сначала выбрать один диск в вашем дисковом массиве +для выделения под информацию `четности` (parity). С одним диском для четности, вы +сможете восстановиться после одного сбоя диска, подобно RAID5. +

Если вы хотите восстановиться после большего числа сбоев дисков, подобно RAID6, +вы должны зарезервировать дополнительные диски для четности. Каждый дополнительный диск +четности позволяет восстановиться после еще одного сбоя диска. +

В качестве дисков четности вы должны выбирать самые большие диски в массиве, +так как информация четности может вырасти до размера самого большого +диска данных в массиве. +

Эти диски будут выделены для хранения файлов `четности`. +Вы не должны хранить на них свои данные. +

Затем вы должны определить диски `данных`, которые вы хотите защитить +с помощью SnapRAID. Защита более эффективна, если эти диски +содержат данные, которые редко меняются. По этой причине лучше +НЕ включать диск Windows C:\ или каталоги Unix /home, /var и /tmp. +

Список файлов сохраняется в файлах `content`, обычно +хранящихся на дисках данных, четности или загрузочных дисках. +Этот файл содержит детали вашего резервного копирования, включая все +контрольные суммы для проверки его целостности. +Файл `content` хранится в нескольких копиях, и каждая копия должна +находиться на отдельном диске, чтобы гарантировать, что даже в случае +множественных сбоев дисков, хотя бы одна копия будет доступна. +

Например, предположим, что вы заинтересованы только в одном уровне защиты четности, +и ваши диски расположены по адресам: +

+/mnt/diskp <- выбранный диск для четности
+/mnt/disk1 <- первый диск для защиты
+/mnt/disk2 <- второй диск для защиты
+/mnt/disk3 <- третий диск для защиты
+
+

Вы должны создать файл конфигурации /etc/snapraid.conf со +следующими опциями: +

+parity /mnt/diskp/snapraid.parity
+content /var/snapraid/snapraid.content
+content /mnt/disk1/snapraid.content
+content /mnt/disk2/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+
+

Если вы используете Windows, вам следует использовать формат пути Windows, +с буквами дисков и обратными слешами вместо прямых. +

+parity E:\snapraid.parity
+content C:\snapraid\snapraid.content
+content F:\array\snapraid.content
+content G:\array\snapraid.content
+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+
+

Если у вас много дисков и заканчиваются буквы дисков, вы можете монтировать +диски непосредственно в подпапки. См.: +

+https://www.google.com/search?q=Windows+mount+point
+
+

На этом этапе вы готовы запустить команду `sync` для создания +информации четности. +

+snapraid sync
+
+

Этот процесс может занять несколько часов в первый раз, в зависимости от размера +данных, уже присутствующих на дисках. Если диски пустые, +процесс происходит немедленно. +

Вы можете остановить его в любое время, нажав Ctrl+C, и при следующем запуске он +возобновит работу с того места, где был прерван. +

Когда эта команда завершится, ваши данные ЗАЩИЩЕНЫ. +

Теперь вы можете начать использовать свой массив, как вам угодно, и периодически +обновлять информацию четности, запуская команду `sync`. +

+

+Scrubbing +

+

Для периодической проверки данных и четности на наличие ошибок, вы можете +запустить команду `scrub`. +

+snapraid scrub
+
+

Эта команда сравнивает данные в вашем массиве с хэшем, вычисленным +во время команды `sync`, для проверки целостности. +

Каждый запуск команды проверяет примерно 8% массива, исключая данные, +уже проверенные за предыдущие 10 дней. +Вы можете использовать опцию -p, --plan, чтобы указать другое количество, +и опцию -o, --older-than, чтобы указать другой возраст в днях. +Например, для проверки 5% массива на наличие блоков старше 20 дней, используйте: +

+snapraid -p 5 -o 20 scrub
+
+

Если во время процесса обнаруживаются скрытые ошибки или ошибки ввода/вывода, +соответствующие блоки помечаются как плохие в файле `content` +и перечисляются в команде `status`. +

+snapraid status
+
+

Чтобы исправить их, вы можете использовать команду `fix`, фильтруя плохие блоки +с помощью опции -e, --filter-error: +

+snapraid -e fix
+
+

При следующем `scrub` ошибки исчезнут из отчета `status`, +если они действительно исправлены. Чтобы ускорить процесс, вы можете использовать +-p bad для проверки только блоков, помеченных как плохие. +

+snapraid -p bad scrub
+
+

Запуск `scrub` на несинхронизированном массиве может сообщить об ошибках, вызванных +удаленными или измененными файлами. Эти ошибки сообщаются в выводе `scrub`, +но соответствующие блоки не помечаются как плохие. +

+
+

+Pooling +

+

Примечание: Функция объединения (pooling), описанная ниже, была заменена инструментом +mergefs, который теперь является рекомендуемым вариантом для пользователей Linux +в сообществе SnapRAID. Mergefs предоставляет более гибкий и эффективный +способ объединения нескольких дисков в единую точку монтирования, +обеспечивая беспрепятственный доступ к файлам по всему массиву без +опоры на символические ссылки. Он хорошо интегрируется со SnapRAID для +защиты четности и обычно используется в установках, таких как OpenMediaVault (OMV) +или пользовательских конфигурациях NAS. +

Чтобы все файлы в вашем массиве отображались в одном дереве каталогов, +вы можете включить функцию `pooling`. Она создает виртуальное +представление всех файлов в вашем массиве только для чтения, используя +символические ссылки. +

Вы можете настроить каталог `pooling` в файле конфигурации с помощью: +

+pool /pool
+
+

или, если вы используете Windows, с помощью: +

+pool C:\pool
+
+

а затем запустить команду `pool` для создания или обновления виртуального представления. +

+snapraid pool
+
+

Если вы используете платформу Unix и хотите предоставить общий доступ к этому каталогу +по сети как для машин Windows, так и для Unix, вы должны добавить +следующие опции в ваш /etc/samba/smb.conf: +

+# В глобальном разделе smb.conf
+unix extensions = no
+
+
+# В разделе общего ресурса smb.conf
+[pool]
+comment = Pool
+path = /pool
+read only = yes
+guest ok = yes
+wide links = yes
+follow symlinks = yes
+
+

В Windows совместное использование символических ссылок по сети требует, чтобы клиенты +разрешали их удаленно. Чтобы включить это, помимо предоставления общего доступа +к каталогу pool, вы также должны предоставить общий доступ ко всем дискам +независимо, используя имена дисков, определенные в файле конфигурации, в качестве +точек общего доступа. Вы также должны указать в опции `share` файла +конфигурации путь UNC Windows, который удаленные клиенты должны использовать +для доступа к этим общим дискам. +

Например, работая с сервера с именем `darkstar`, вы можете использовать +опции: +

+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+pool C:\pool
+share \\darkstar
+
+

и предоставить общий доступ к следующим каталогам по сети: +

+\\darkstar\pool -> C:\pool
+\\darkstar\d1 -> F:\array
+\\darkstar\d2 -> G:\array
+\\darkstar\d3 -> H:\array
+
+

чтобы разрешить удаленным клиентам доступ ко всем файлам по адресу \\darkstar\pool. +

Вам также может потребоваться настроить удаленные клиенты для включения доступа к +удаленным символическим ссылкам с помощью команды: +

+fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
+
+
+
+

+Undeleting +

+

SnapRAID функционирует скорее как программа резервного копирования, чем как система RAID, +и может использоваться для восстановления или отмены удаления файлов до их +предыдущего состояния с помощью опции -f, --filter: +

+snapraid fix -f FILE
+
+

или для каталога: +

+snapraid fix -f DIR/
+
+

Вы также можете использовать его для восстановления только случайно удаленных файлов внутри +каталога с помощью опции -m, --filter-missing, которая восстанавливает +только отсутствующие файлы, оставляя все остальные нетронутыми. +

+snapraid fix -m -f DIR/
+
+

Или для восстановления всех удаленных файлов на всех дисках с помощью: +

+snapraid fix -m
+
+
+
+

+Recovering +

+

Случилось худшее, и вы потеряли один или несколько дисков! +

НЕ ПАНИКУЙТЕ! Вы сможете их восстановить! +

Первое, что вы должны сделать, это избегать дальнейших изменений в вашем дисковом массиве. +Отключите любые удаленные подключения к нему и любые запланированные процессы, +включая любое запланированное ночное sync или scrub SnapRAID. +

Затем приступайте к следующим шагам. +

+

+STEP 1 -> Reconfigure +

+

Вам нужно место для восстановления, в идеале на дополнительных +запасных дисках, но внешнего USB-диска или удаленного диска будет достаточно. +

Измените файл конфигурации SnapRAID, чтобы опция `data` или `parity` +отказавшего диска указывала на место с достаточным пустым +пространством для восстановления файлов. +

Например, если диск `d1` вышел из строя, измените с: +

+data d1 /mnt/disk1/
+
+

на: +

+data d1 /mnt/new_spare_disk/
+
+

Если восстанавливаемый диск является диском четности, обновите соответствующую опцию `parity`. +Если у вас несколько отказавших дисков, обновите все их опции конфигурации. +

+
+

+STEP 2 -> Fix +

+

Запустите команду fix, сохраняя журнал во внешнем файле с помощью: +

+snapraid -d NAME -l fix.log fix
+
+

Где NAME — это имя диска, например `d1` в нашем предыдущем примере. +Если восстанавливаемый диск является диском четности, используйте имена `parity`, `2-parity` +и т. д. +Если у вас несколько отказавших дисков, используйте несколько опций -d, чтобы указать +их все. +

Эта команда займет много времени. +

Убедитесь, что у вас есть несколько гигабайт свободного места для хранения файла fix.log. +Запустите ее с диска с достаточным свободным местом. +

Теперь вы восстановили все, что можно было восстановить. Если некоторые файлы +частично или полностью невосстановимы, они будут переименованы с добавлением +расширения `.unrecoverable`. +

Вы можете найти подробный список всех невосстановимых блоков в файле fix.log, +проверяя все строки, начинающиеся с `unrecoverable:`. +

Если вы не удовлетворены восстановлением, вы можете повторять его столько +раз, сколько пожелаете. +

Например, если вы удалили файлы из массива после последнего +`sync`, это может привести к тому, что некоторые файлы не будут восстановлены. +В этом случае вы можете повторить `fix`, используя опцию -i, --import, +указав, где эти файлы находятся сейчас, чтобы снова включить их в +процесс восстановления. +

Если вы удовлетворены восстановлением, вы можете продолжить, +но учтите, что после синхронизации вы больше не сможете повторить команду `fix`! +

+
+

+STEP 3 -> Check +

+

В качестве осторожной проверки, вы можете теперь запустить команду `check`, чтобы убедиться, +что все в порядке на восстановленном диске. +

+snapraid -d NAME -a check
+
+

Где NAME — это имя диска, например `d1` в нашем предыдущем примере. +

Опции -d и -a говорят SnapRAID проверить только указанный диск +и игнорировать все данные четности. +

Эта команда займет много времени, но если вы не чрезмерно осторожны, +вы можете ее пропустить. +

+
+

+STEP 4 -> Sync +

+

Запустите команду `sync`, чтобы ресинхронизировать массив с новым диском. +

+snapraid sync
+
+

Если все восстановлено, эта команда выполняется немедленно. +

+
+
+
+

+Commands +

+

SnapRAID предоставляет несколько простых команд, которые позволяют: +

    +
  • +Печатать статус массива -> `status` +
  • +
  • +Управлять дисками -> `smart`, `probe`, `up`, `down` +
  • +
  • +Сделать резервную копию/снимок -> `sync` +
  • +
  • +Периодически проверять данные -> `scrub` +
  • +
  • +Восстановить последнюю резервную копию/снимок -> `fix`. +
  • +
+

Команды должны быть написаны строчными буквами. +

+

+status +

+

Печатает сводку состояния дискового массива. +

Она включает информацию о фрагментации четности, о том, насколько старые +блоки без проверки, и все записанные скрытые ошибки, +возникшие во время scrubbing. +

Представленная информация относится к последнему времени, когда вы +запускали `sync`. Более поздние изменения не учитываются. +

Если были обнаружены плохие блоки, перечисляются их номера. +Чтобы исправить их, вы можете использовать команду `fix -e`. +

Он также показывает график, представляющий последнее время, когда каждый блок +был проверен (`scrubbed`) или синхронизирован (`synced`). Проверенные блоки +обозначены символом '*', блоки, синхронизированные, но еще не проверенные, +символом 'o'. +

Ничего не изменяется. +

+
+

+smart +

+

Печатает отчет SMART всех дисков в системе. +

Он включает оценку вероятности сбоя в следующем году, +позволяя планировать плановую замену дисков, которые показывают +подозрительные атрибуты. +

Эта оценка вероятности получена путем корреляции атрибутов SMART +дисков с данными Backblaze, доступными по адресу: +

+https://www.backblaze.com/hard-drive-test-data.html
+
+

Если SMART сообщает, что диск выходит из строя, для этого диска +выводится `FAIL` или `PREFAIL`, и SnapRAID возвращает ошибку. +В этом случае немедленная замена диска настоятельно рекомендуется. +

Другие возможные строки статуса: +

+
+
+logfail +
+В прошлом некоторые атрибуты были ниже +порогового значения. +
+
+
+
+logerr +
+Журнал ошибок устройства содержит ошибки. +
+
+
+
+selferr +
+Журнал самотестирования устройства содержит ошибки. +
+
+
+

Если указана опция -v, --verbose, предоставляется более глубокий +статистический анализ. Этот анализ может помочь вам решить, нужно ли вам +больше или меньше четности. +

Эта команда использует инструмент `smartctl` и эквивалентна запуску +`smartctl -a` на всех устройствах. +

Если ваши устройства не обнаруживаются автоматически правильно, вы можете указать +пользовательскую команду, используя опцию `smartctl` в файле +конфигурации. +

Ничего не изменяется. +

+
+

+probe +

+

Печатает состояние POWER всех дисков в системе. +

`Standby` означает, что диск не вращается. `Active` означает, +что диск вращается. +

Эта команда использует инструмент `smartctl` и эквивалентна запуску +`smartctl -n standby -i` на всех устройствах. +

Если ваши устройства не обнаруживаются автоматически правильно, вы можете указать +пользовательскую команду, используя опцию `smartctl` в файле +конфигурации. +

Ничего не изменяется. +

+
+

+up +

+

Раскручивает все диски массива. +

Вы можете раскрутить только определенные диски, используя опцию -d, --filter-disk. +

Раскручивание всех дисков одновременно требует много энергии. +Убедитесь, что ваш блок питания может это выдержать. +

Ничего не изменяется. +

+
+

+down +

+

Останавливает вращение всех дисков массива. +

Эта команда использует инструмент `smartctl` и эквивалентна запуску +`smartctl -s standby,now` на всех устройствах. +

Вы можете остановить вращение только определенных дисков, используя опцию -d, --filter-disk. +

Чтобы автоматически остановить вращение при ошибке, вы можете использовать опцию +-s, --spin-down-on-error с любой другой командой, что эквивалентно +ручному запуску `down` при возникновении ошибки. +

Ничего не изменяется. +

+
+

+diff +

+

Перечисляет все файлы, измененные с момента последнего `sync`, для которых +требуется пересчитать данные четности. +

Эта команда не проверяет данные файла, а только метку времени файла, +размер и inode. +

После перечисления всех измененных файлов представляется сводка изменений, +сгруппированных по: +

+
+
+equal +
+Файлы, не измененные по сравнению с предыдущим состоянием. +
+
+
+
+added +
+Добавленные файлы, которых не было раньше. +
+
+
+
+removed +
+Удаленные файлы. +
+
+
+
+updated +
+Файлы с другим размером или меткой времени, что означает, что они +были изменены. +
+
+
+
+moved +
+Файлы, перемещенные в другой каталог на том же диске. +Они идентифицируются как имеющие то же имя, размер, метку времени +и inode, но другой каталог. +
+
+
+
+copied +
+Файлы, скопированные на тот же или другой диск. Обратите внимание, что если +они действительно перемещены на другой диск, они также будут +учтены в `removed`. +Они идентифицируются как имеющие то же имя, размер и +метку времени. Если метка времени с точностью до доли секунды равна нулю, +полный путь должен совпадать, а не только имя. +
+
+
+
+restored +
+Файлы с другим inode, но совпадающими именем, размером и меткой времени. +Обычно это файлы, восстановленные после удаления. +
+
+
+

Если требуется `sync`, код возврата процесса равен 2, а не +по умолчанию 0. Код возврата 1 используется для общего условия ошибки. +

Ничего не изменяется. +

+
+

+sync +

+

Обновляет информацию четности. Все измененные файлы +в дисковом массиве считываются, и соответствующие данные четности +обновляются. +

Вы можете остановить этот процесс в любое время, нажав Ctrl+C, +не теряя уже проделанной работы. +При следующем запуске процесс `sync` возобновится с того места, +где был прерван. +

Если во время процесса обнаруживаются скрытые ошибки или ошибки ввода/вывода, +соответствующие блоки помечаются как плохие. +

Файлы идентифицируются по пути и/или inode и проверяются по +размеру и метке времени. +Если размер файла или метка времени отличаются, данные четности +пересчитываются для всего файла. +Если файл перемещен или переименован на том же диске, сохраняя +тот же inode, четность не пересчитывается. +Если файл перемещен на другой диск, четность пересчитывается, +но ранее вычисленная информация хэша сохраняется. +

Файлы `content` и `parity` изменяются при необходимости. +Файлы в массиве НЕ изменяются. +

+
+

+scrub +

+

Проверяет массив, проверяя на наличие скрытых ошибок или ошибок ввода/вывода +на дисках данных и четности. +

Каждый вызов проверяет примерно 8% массива, исключая +данные, уже проверенные за последние 10 дней. +Это означает, что проверка раз в неделю гарантирует, что каждый бит данных +проверяется хотя бы раз в три месяца. +

Вы можете определить другой план или объем проверки, используя опцию -p, --plan, +которая принимает: +bad - Проверить блоки, помеченные как плохие. +new - Проверить только что синхронизированные блоки, которые еще не были проверены. +full - Проверить все. +0-100 - Проверить указанный процент блоков. +

Если вы указываете процентное значение, вы также можете использовать опцию -o, --older-than, +чтобы определить, насколько старым должен быть блок. +Сначала проверяются самые старые блоки, обеспечивая оптимальную проверку. +Если вы хотите проверить только что синхронизированные блоки, которые еще не были проверены, +используйте опцию `-p new`. +

Чтобы получить подробности о статусе проверки, используйте команду `status`. +

При обнаружении любой скрытой ошибки или ошибки ввода/вывода соответствующие блоки +помечаются как плохие в файле `content`. +Эти плохие блоки перечисляются в `status` и могут быть исправлены с помощью `fix -e`. +После исправления при следующем scrub они будут перепроверены, и если +обнаружатся исправленными, плохая метка будет удалена. +Чтобы проверить только плохие блоки, вы можете использовать команду `scrub -p bad`. +

Рекомендуется запускать `scrub` только на синхронизированном массиве, чтобы избежать +сообщений об ошибках, вызванных несинхронизированными данными. Эти ошибки +распознаются как не являющиеся скрытыми ошибками, и блоки не помечаются +как плохие, но такие ошибки сообщаются в выводе команды. +

Файл `content` изменяется для обновления времени последней проверки +для каждого блока и для пометки плохих блоков. +Файлы `parity` НЕ изменяются. +Файлы в массиве НЕ изменяются. +

+
+

+fix +

+

Исправляет все файлы и данные четности. +

Все файлы и данные четности сравниваются с состоянием снимка, +сохраненным при последнем `sync`. +Если обнаружено различие, оно возвращается к сохраненному снимку. +

ВНИМАНИЕ! Команда `fix` не различает ошибки и +преднамеренные изменения. Она безусловно возвращает состояние файла +к последнему `sync`. +

Если не указана другая опция, обрабатывается весь массив. +Используйте опции фильтрации, чтобы выбрать подмножество файлов или дисков для работы. +

Чтобы исправить только блоки, помеченные как плохие во время `sync` и `scrub`, +используйте опцию -e, --filter-error. +В отличие от других опций фильтрации, эта применяет исправления только к файлам, +которые не были изменены с момента последнего `sync`. +

SnapRAID переименовывает все файлы, которые не могут быть исправлены, добавляя +расширение `.unrecoverable`. +

Перед исправлением сканируется весь массив, чтобы найти файлы, перемещенные +с момента последней операции `sync`. +Эти файлы идентифицируются по их метке времени, игнорируя их имя +и каталог, и используются в процессе восстановления при необходимости. +Если вы переместили некоторые из них за пределы массива, вы можете использовать опцию +-i, --import, чтобы указать дополнительные каталоги для сканирования. +

Файлы идентифицируются только по пути, а не по inode. +

Файл `content` НЕ изменяется. +Файлы `parity` изменяются при необходимости. +Файлы в массиве изменяются при необходимости. +

+
+

+check +

+

Проверяет все файлы и данные четности. +

Он работает как `fix`, но только имитирует восстановление, и никакие изменения +не записываются в массив. +

Эта команда в основном предназначена для ручной проверки, +например, после процесса восстановления или в других особых условиях. +Для периодических и запланированных проверок используйте `scrub`. +

Если вы используете опцию -a, --audit-only, проверяются только данные +файла, а данные четности игнорируются для +более быстрого выполнения. +

Файлы идентифицируются только по пути, а не по inode. +

Ничего не изменяется. +

+
+

+list +

+

Перечисляет все файлы, содержащиеся в массиве на момент +последнего `sync`. +

С -v или --verbose также отображается время с точностью до доли секунды. +

Ничего не изменяется. +

+
+

+dup +

+

Перечисляет все дублирующиеся файлы. Два файла считаются равными, если их +хэши совпадают. Данные файла не считываются; используются только +предварительно вычисленные хэши. +

Ничего не изменяется. +

+
+

+pool +

+

Создает или обновляет виртуальное представление всех +файлов в вашем дисковом массиве в каталоге `pooling`. +

Файлы не копируются, а связываются с помощью +символических ссылок. +

При обновлении все существующие символические ссылки и пустые +подкаталоги удаляются и заменяются новым +представлением массива. Любые другие обычные файлы остаются на месте. +

Ничего не изменяется за пределами каталога pool. +

+
+

+devices +

+

Печатает низкоуровневые устройства, используемые массивом. +

Эта команда отображает ассоциации устройств в массиве +и в основном предназначена как интерфейс для скриптов. +

Первые два столбца — это низкоуровневый идентификатор устройства и путь. +Следующие два столбца — это высокоуровневый идентификатор устройства и путь. +Последний столбец — это имя диска в массиве. +

В большинстве случаев у вас есть одно низкоуровневое устройство для каждого диска в +массиве, но в некоторых более сложных конфигурациях у вас может быть несколько +низкоуровневых устройств, используемых одним диском в массиве. +

Ничего не изменяется. +

+
+

+touch +

+

Устанавливает произвольную метку времени с точностью до доли секунды для всех файлов, +у которых она установлена в ноль. +

Это улучшает способность SnapRAID распознавать перемещенные +и скопированные файлы, так как делает метку времени почти уникальной, +уменьшая возможные дубликаты. +

Более конкретно, если метка времени с точностью до доли секунды не равна нулю, +перемещенный или скопированный файл идентифицируется как таковой, если он совпадает +по имени, размеру и метке времени. Если метка времени с точностью до доли секунды +равна нулю, он считается копией только в том случае, если полностью совпадают +полный путь, размер и метка времени. +

Метка времени с точностью до секунды не изменяется, +поэтому все даты и время ваших файлов будут сохранены. +

+
+

+rehash +

+

Планирует перехэширование всего массива. +

Эта команда изменяет используемый тип хэша, обычно при обновлении +с 32-разрядной системы на 64-разрядную, для переключения с +MurmurHash3 на более быстрый SpookyHash. +

Если вы уже используете оптимальный хэш, эта команда +ничего не делает и информирует вас, что никакие действия не требуются. +

Перехэширование не выполняется немедленно, а происходит +постепенно во время `sync` и `scrub`. +

Вы можете проверить состояние перехэширования с помощью `status`. +

Во время перехэширования SnapRAID сохраняет полную функциональность, +за единственным исключением, что `dup` не может обнаружить дублирующиеся +файлы, использующие другой хэш. +

+
+
+

+Options +

+

SnapRAID предоставляет следующие опции: +

+
+
+-c, --conf CONFIG +
+Выбирает файл конфигурации для использования. Если не указан, в Unix +используется файл `/usr/local/etc/snapraid.conf`, если он существует, +в противном случае `/etc/snapraid.conf`. +В Windows используется файл `snapraid.conf` в том же +каталоге, что и `snapraid.exe`. +
+
+
+
+
+
+-f, --filter PATTERN +
+Фильтрует файлы для обработки в `check` и `fix`. +Обрабатываются только файлы, соответствующие указанному шаблону. +Эту опцию можно использовать несколько раз. +Подробнее о спецификациях шаблонов см. в разделе PATTERN. +В Unix убедитесь, что символы глоббинга заключены в кавычки, если используются. +Эту опцию можно использовать только с `check` и `fix`. +Ее нельзя использовать с `sync` и `scrub`, так как они всегда +обрабатывают весь массив. +
+
+
+
+
+
+-d, --filter-disk NAME +
+Фильтрует диски для обработки в `check`, `fix`, `up` и `down`. +Вы должны указать имя диска, определенное в файле конфигурации. +Вы также можете указать диски четности с именами: `parity`, `2-parity`, +`3-parity` и т. д., чтобы ограничить операции конкретным диском четности. +Если вы комбинируете несколько опций --filter, --filter-disk и --filter-missing, +выбираются только файлы, соответствующие всем фильтрам. +Эту опцию можно использовать несколько раз. +Эту опцию можно использовать только с `check`, `fix`, `up` и `down`. +Ее нельзя использовать с `sync` и `scrub`, так как они всегда +обрабатывают весь массив. +
+
+
+
+
+
+-m, --filter-missing +
+Фильтрует файлы для обработки в `check` и `fix`. +Обрабатываются только файлы, отсутствующие или удаленные из массива. +При использовании с `fix`, это действует как команда `undelete`. +Если вы комбинируете несколько опций --filter, --filter-disk и --filter-missing, +выбираются только файлы, соответствующие всем фильтрам. +Эту опцию можно использовать только с `check` и `fix`. +Ее нельзя использовать с `sync` и `scrub`, так как они всегда +обрабатывают весь массив. +
+
+
+
+
+
+-e, --filter-error +
+Обрабатывает файлы с ошибками в `check` и `fix`. +Он обрабатывает только файлы, блоки которых помечены скрытыми +ошибками или ошибками ввода/вывода во время `sync` и `scrub`, как +перечислено в `status`. +Эту опцию можно использовать только с `check` и `fix`. +
+
+
+
+
+
+-p, --plan PERC|bad|new|full +
+Выбирает план проверки (`scrub`). Если PERC — это числовое значение от 0 до 100, +оно интерпретируется как процент блоков для проверки. +Вместо процента вы можете указать план: +`bad` проверяет плохие блоки, `new` проверяет блоки, которые еще не были проверены, +и `full` проверяет все. +Эту опцию можно использовать только с `scrub`. +
+
+
+
+
+
+-o, --older-than DAYS +
+Выбирает самую старую часть массива для обработки в `scrub`. +DAYS — это минимальный возраст в днях для блока, который будет проверен; +по умолчанию — 10. +Блоки, помеченные как плохие, всегда проверяются независимо от этой опции. +Эту опцию можно использовать только с `scrub`. +
+
+
+
+
+
+-a, --audit-only +
+В `check`, проверяет хэш файлов без +проверки данных четности. +Если вы заинтересованы только в проверке данных файла, эта +опция может значительно ускорить процесс проверки. +Эту опцию можно использовать только с `check`. +
+
+
+
+
+
+-h, --pre-hash +
+В `sync`, запускает предварительную фазу хэширования всех новых данных +для дополнительной проверки перед вычислением четности. +Обычно в `sync` предварительное хэширование не выполняется, и новые +данные хэшируются непосредственно перед вычислением четности, когда они +считываются в первый раз. +Этот процесс происходит, когда система находится под +тяжелой нагрузкой, со всеми вращающимися дисками и занятым процессором. +Это экстремальное условие для машины, и если у нее есть +скрытая аппаратная проблема, скрытые ошибки могут остаться незамеченными, +потому что данные еще не хэшированы. +Чтобы избежать этого риска, вы можете включить режим `pre-hash`, чтобы +все данные считывались дважды для обеспечения их целостности. +Эта опция также проверяет файлы, перемещенные внутри массива, +чтобы убедиться, что операция перемещения прошла успешно, и, при необходимости, +позволяет запустить операцию исправления (`fix`) перед продолжением. +Эту опцию можно использовать только с `sync`. +
+
+
+
+
+
+-i, --import DIR +
+Импортирует из указанного каталога любые файлы, удаленные +из массива после последнего `sync`. +Если у вас все еще есть такие файлы, они могут использоваться `check` +и `fix` для улучшения процесса восстановления. +Файлы считываются, включая подкаталоги, и идентифицируются +независимо от их имени. +Эту опцию можно использовать только с `check` и `fix`. +
+
+
+
+
+
+-s, --spin-down-on-error +
+При любой ошибке останавливает вращение всех управляемых дисков перед выходом с +ненулевым кодом состояния. Это предотвращает оставление дисков +активными и вращающимися после прерванной операции, +помогая избежать ненужного нагрева и энергопотребления. +Используйте эту опцию, чтобы гарантировать безопасную остановку дисков, +даже когда команда завершается неудачей. +
+
+
+
+
+
+-w, --bw-limit RATE +
+Применяет глобальное ограничение пропускной способности для всех дисков. RATE — это +количество байтов в секунду. Вы можете указать множитель, +например K, M или G (например, --bw-limit 1G). +
+
+
+
+
+
+-A, --stats +
+Включает расширенный вид статуса, который показывает дополнительную информацию. +На экране отображаются два графика: +Первый график показывает количество буферизованных полос для каждого +диска, а также путь к файлу, к которому в данный момент осуществляется +доступ на этом диске. Обычно самый медленный диск не будет иметь +доступного буфера, что определяет максимально достижимую +пропускную способность. +Второй график показывает процент времени, потраченного на ожидание +за последние 100 секунд. Ожидается, что самый медленный диск +вызовет большую часть времени ожидания, в то время как другие диски должны +иметь мало или совсем не иметь времени ожидания, потому что они могут +использовать свои буферизованные полосы. +Этот график также показывает время, потраченное на ожидание +вычислений хэша и вычислений RAID. +Все вычисления выполняются параллельно с дисковыми операциями. +Следовательно, пока есть измеримое время ожидания для +хотя бы одного диска, это указывает на то, что ЦП достаточно быстр, чтобы +справляться с рабочей нагрузкой. +
+
+
+
+
+
+-Z, --force-zero +
+Форсирует небезопасную операцию синхронизации файла с нулевым +размером, который ранее был ненулевым. +Если SnapRAID обнаруживает такое условие, он прекращает выполнение, +если вы не укажете эту опцию. +Это позволяет легко обнаружить, когда после сбоя системы +некоторые доступные файлы были усечены. +Это возможное условие в Linux с файловыми системами ext3/ext4. +Эту опцию можно использовать только с `sync`. +
+
+
+
+
+
+-E, --force-empty +
+Форсирует небезопасную операцию синхронизации диска, на котором +отсутствуют все исходные файлы. +Если SnapRAID обнаруживает, что все файлы, изначально присутствующие +на диске, отсутствуют или перезаписаны, он прекращает выполнение, +если вы не укажете эту опцию. +Это позволяет легко обнаружить, когда файловая система данных не +смонтирована. +Эту опцию можно использовать только с `sync`. +
+
+
+
+
+
+-U, --force-uuid +
+Форсирует небезопасную операцию синхронизации, проверки и исправления +с дисками, у которых изменился UUID. +Если SnapRAID обнаруживает, что у некоторых дисков изменился UUID, +он прекращает выполнение, если вы не укажете эту опцию. +Это позволяет обнаружить, когда ваши диски смонтированы в +неправильных точках монтирования. +Однако допускается однократное изменение UUID с +одиночной четностью, и больше с множественной четностью, потому что это +нормальный случай при замене дисков после восстановления. +Эту опцию можно использовать только с `sync`, `check` или +`fix`. +
+
+
+
+
+
+-D, --force-device +
+Форсирует небезопасную операцию исправления с недоступными дисками +или с дисками на том же физическом устройстве. +Например, если вы потеряли два диска данных и у вас есть запасной диск для восстановления +только первого, вы можете игнорировать второй недоступный диск. +Или, если вы хотите восстановить диск в свободное место, оставшееся на +уже используемом диске, совместно использующем то же физическое устройство. +Эту опцию можно использовать только с `fix`. +
+
+
+
+
+
+-N, --force-nocopy +
+В `sync`, `check` и `fix`, отключает эвристику обнаружения копирования. +Без этой опции SnapRAID предполагает, что файлы с одинаковыми +атрибутами, такими как имя, размер и метка времени, являются копиями с +одинаковыми данными. +Это позволяет идентифицировать скопированные или перемещенные файлы с одного диска +на другой и повторно использовать уже вычисленную информацию хэша +для обнаружения скрытых ошибок или восстановления отсутствующих файлов. +В некоторых редких случаях это поведение может привести к ложным срабатываниям +или замедлению процесса из-за большого количества проверок хэша, и эта +опция позволяет решить такие проблемы. +Эту опцию можно использовать только с `sync`, `check` и `fix`. +
+
+
+
+
+
+-F, --force-full +
+В `sync`, форсирует полный пересчет четности. +Эту опцию можно использовать, когда вы добавляете новый уровень четности или если +вы вернулись к старому файлу content, используя более свежие данные четности. +Вместо того чтобы воссоздавать четность с нуля, это позволяет +повторно использовать хэши, присутствующие в файле content, для проверки данных +и поддержания защиты данных во время процесса `sync` с использованием +существующих данных четности. +Эту опцию можно использовать только с `sync`. +
+
+
+
+
+
+-R, --force-realloc +
+В `sync`, форсирует полное перераспределение файлов и перестроение четности. +Эту опцию можно использовать для полного перераспределения всех файлов, +удаления фрагментации, при этом повторно используя хэши, присутствующие в файле content, +для проверки данных. +Эту опцию можно использовать только с `sync`. +ВНИМАНИЕ! Эта опция предназначена только для экспертов, и +настоятельно не рекомендуется ее использовать. +У вас НЕТ защиты данных во время операции `sync`. +
+
+
+
+
+
+-l, --log FILE +
+Записывает подробный журнал в указанный файл. +Если эта опция не указана, непредвиденные ошибки выводятся +на экран, что потенциально может привести к чрезмерному выводу в случае +множества ошибок. Когда указана -l, --log, на +экран выводятся только фатальные ошибки, которые приводят к остановке +SnapRAID. +Если путь начинается с '>>', файл открывается +в режиме добавления. Вхождения '%D' и '%T' в имени +заменяются датой и временем в формате ГГГГММДД и +ЧЧММСС. В пакетных файлах Windows вы должны удвоить +символ '%', например, result-%%D.log. Чтобы использовать '>>', вы должны +заключить имя в кавычки, например, `">>result.log"`. +Для вывода журнала на стандартный вывод или стандартную ошибку, +вы можете использовать `">&1"` и `">&2"` соответственно. +Описание тегов журнала см. в файле snapraid_log.txt или man-странице. +
+
+
+
+
+
+-L, --error-limit NUMBER +
+Устанавливает новый лимит ошибок до остановки выполнения. +По умолчанию SnapRAID останавливается, если обнаруживает более 100 +ошибок ввода/вывода, что указывает на вероятный сбой диска. +Эта опция влияет на `sync` и `scrub`, которым разрешено +продолжать работу после первого набора дисковых ошибок, чтобы попытаться +завершить свои операции. +Однако `check` и `fix` всегда останавливаются при первой ошибке. +
+
+
+
+
+
+-S, --start BLKSTART +
+Начинает обработку с указанного +номера блока. Это может быть полезно для повторной попытки проверить +или исправить конкретные блоки в случае поврежденного диска. +Эта опция в основном предназначена для расширенного ручного восстановления. +
+
+
+
+
+
+-B, --count BLKCOUNT +
+Обрабатывает только указанное количество блоков. +Эта опция в основном предназначена для расширенного ручного восстановления. +
+
+
+
+
+
+-C, --gen-conf CONTENT +
+Генерирует фиктивный файл конфигурации из существующего +файла content. +Файл конфигурации записывается на стандартный вывод +и не перезаписывает существующий. +Этот файл конфигурации также содержит информацию, +необходимую для восстановления точек монтирования дисков в случае, если вы +потеряете всю систему. +
+
+
+
+
+
+-v, --verbose +
+Печатает больше информации на экран. +Если указана один раз, печатает исключенные файлы +и дополнительную статистику. +Эта опция не влияет на файлы журнала. +
+
+
+
+
+
+-q, --quiet +
+Печатает меньше информации на экран. +Если указана один раз, удаляет индикатор выполнения; дважды, +текущие операции; трижды, информационные +сообщения; четырежды, сообщения о статусе. +Фатальные ошибки всегда выводятся на экран. +Эта опция не влияет на файлы журнала. +
+
+
+
+
+
+-H, --help +
+Печатает краткий экран справки. +
+
+
+
+
+
+-V, --version +
+Печатает версию программы. +
+
+
+
+
+

+Configuration +

+

SnapRAID требует файл конфигурации, чтобы знать, где находится ваш дисковый массив +и где хранить информацию четности. +

В Unix используется файл `/usr/local/etc/snapraid.conf`, если он существует, +в противном случае `/etc/snapraid.conf`. +В Windows используется файл `snapraid.conf` в том же +каталоге, что и `snapraid.exe`. +

Он должен содержать следующие опции (чувствительные к регистру): +

+

+parity FILE [,FILE] ... +

+

Определяет файлы для использования для хранения информации четности. +Четность обеспечивает защиту от одного сбоя диска, +подобно RAID5. +

Вы можете указать несколько файлов, которые должны быть на разных дисках. +Когда файл больше не может расти, используется следующий. +Общее доступное пространство должно быть по крайней мере таким же большим, как самый большой диск данных в +массиве. +

Вы можете добавить дополнительные файлы четности позже, но вы +не можете переупорядочить или удалить их. +

Сохранение дисков четности зарезервированными для четности гарантирует, что +они не станут фрагментированными, улучшая производительность. +

В Windows 256 МБ остается неиспользованным на каждом диске, чтобы избежать +предупреждения о полных дисках. +

Эта опция является обязательной и может использоваться только один раз. +

+
+

+(2,3,4,5,6)-parity FILE [,FILE] ... +

+

Определяет файлы для использования для хранения дополнительной информации четности. +

Для каждого указанного уровня четности включается один дополнительный уровень защиты: +

    +
  • +2-parity включает двойную четность RAID6. +
  • +
  • +3-parity включает тройную четность. +
  • +
  • +4-parity включает четверную четность. +
  • +
  • +5-parity включает пятерную четность. +
  • +
  • +6-parity включает шестерную четность. +
  • +
+

Каждый уровень четности требует наличия всех предыдущих уровней четности. +

Применяются те же соображения, что и для опции 'parity'. +

Эти опции являются необязательными и могут использоваться только один раз. +

+
+

+z-parity FILE [,FILE] ... +

+

Определяет альтернативный файл и формат для хранения тройной четности. +

Эта опция является альтернативой '3-parity', в основном предназначенной для +слабых процессоров, таких как ARM или AMD Phenom, Athlon и Opteron, +которые не поддерживают набор инструкций SSSE3. В таких случаях она +обеспечивает лучшую производительность. +

Этот формат похож на тот, который используется ZFS RAIDZ3, но быстрее. +Как и ZFS, он не работает за пределами тройной четности. +

При использовании '3-parity' вы будете предупреждены, если рекомендуется использовать +формат 'z-parity' для повышения производительности. +

Возможно преобразование из одного формата в другой путем настройки +файла конфигурации с желаемым файлом z-parity или 3-parity +и использования 'fix' для его воссоздания. +

+
+

+content FILE +

+

Определяет файл для использования для хранения списка и контрольных сумм всех +файлов, присутствующих в вашем дисковом массиве. +

Он может быть размещен на диске, используемом для данных, четности, или +любом другом доступном диске. +Если вы используете диск данных, этот файл автоматически исключается +из процесса `sync`. +

Эта опция является обязательной и может использоваться несколько раз для сохранения +нескольких копий одного и того же файла. +

Вы должны хранить как минимум одну копию для каждого используемого диска четности +плюс одну. Использование дополнительных копий не повредит. +

+
+

+data NAME DIR +

+

Определяет имя и точку монтирования дисков данных в +массиве. NAME используется для идентификации диска и должно +быть уникальным. DIR — это точка монтирования диска в +файловой системе. +

Вы можете изменять точку монтирования по мере необходимости, пока вы +сохраняете NAME фиксированным. +

Вы должны использовать одну опцию для каждого диска данных в массиве. +

Вы можете переименовать диск позже, изменив NAME непосредственно +в файле конфигурации, а затем запустив команду 'sync'. +В случае переименования, ассоциация выполняется с использованием сохраненного +UUID дисков. +

+
+

+nohidden +

+

Исключает все скрытые файлы и каталоги. +В Unix скрытые файлы — это те, которые начинаются с `.`. +В Windows — это те, у которых есть скрытый атрибут. +

+
+

+exclude/include PATTERN +

+

Определяет шаблоны файлов или каталогов для исключения или включения +в процесс синхронизации. +Все шаблоны обрабатываются в указанном порядке. +

Если первый совпадающий шаблон — это `exclude`, файл +исключается. Если это `include`, файл включается. +Если ни один шаблон не совпадает, файл исключается, если последний +указанный шаблон — это `include`, или включается, если последний шаблон +— это `exclude`. +

Подробнее о спецификациях шаблонов см. в разделе PATTERN. +

Эту опцию можно использовать несколько раз. +

+
+

+blocksize SIZE_IN_KIBIBYTES +

+

Определяет базовый размер блока в кибибайтах для четности. +Один кибибайт — это 1024 байта. +

Размер блока по умолчанию — 256, что должно работать в большинстве случаев. +

ВНИМАНИЕ! Эта опция предназначена только для экспертов, и +настоятельно не рекомендуется изменять это значение. Чтобы изменить это значение в +будущем, вам потребуется воссоздать всю четность! +

Причина использовать другой размер блока — если у вас много маленьких +файлов, порядка миллионов. +

Для каждого файла, даже если всего несколько байтов, выделяется целый блок четности, +и при большом количестве файлов это может привести к значительным неиспользуемым +пространствам четности. +Когда вы полностью заполните диск четности, вам не будет +разрешено добавлять больше файлов на диски данных. +Однако потерянная четность не накапливается на дисках данных. Потерянное пространство, +возникающее из-за большого числа файлов на диске данных, ограничивает только +объем данных на этом диске данных, а не на других. +

В качестве приближения вы можете предположить, что половина размера блока +теряется для каждого файла. Например, при 100 000 файлов и размере блока 256 КиБ +вы потеряете 12,8 ГБ четности, что может привести к +уменьшению доступного пространства на диске данных на 12,8 ГБ. +

Вы можете проверить количество потерянного пространства на каждом диске с помощью `status`. +Это количество пространства, которое вы должны оставить свободным на дисках +данных или использовать для файлов, не включенных в массив. +Если это значение отрицательное, это означает, что вы близки к заполнению +четности, и оно представляет пространство, которое вы все еще можете потерять. +

Чтобы избежать этой проблемы, вы можете использовать больший раздел для четности. +Например, если раздел четности на 12,8 ГБ больше, чем диски данных, +у вас есть достаточно дополнительного пространства для обработки до 100 000 +файлов на каждом диске данных без каких-либо потерь пространства. +

Хитрость для получения большего раздела четности в Linux — отформатировать его +командой: +

+mkfs.ext4 -m 0 -T largefile4 DEVICE
+
+

Это приводит к примерно 1,5% дополнительного пространства, приблизительно 60 ГБ для +диска 4 ТБ, что позволяет разместить около 460 000 файлов на каждом диске данных без +каких-либо потерь пространства. +

+
+

+hashsize SIZE_IN_BYTES +

+

Определяет размер хэша в байтах для сохраненных блоков. +

Размер хэша по умолчанию — 16 байт (128 бит), что должно работать +в большинстве случаев. +

ВНИМАНИЕ! Эта опция предназначена только для экспертов, и +настоятельно не рекомендуется изменять это значение. Чтобы изменить это значение в +будущем, вам потребуется воссоздать всю четность! +

Причина использовать другой размер хэша — если ваша система имеет +ограниченную память. Как правило, SnapRAID обычно требует +1 ГиБ ОЗУ на каждые 16 ТБ данных в массиве. +

В частности, для хранения хэшей данных SnapRAID требует +приблизительно TS*(1+HS)/BS байт ОЗУ, +где TS — это общий размер в байтах вашего дискового массива, BS — +размер блока в байтах, и HS — размер хэша в байтах. +

Например, при 8 дисках по 4 ТБ, размере блока 256 КиБ +(1 КиБ = 1024 байта) и размере хэша 16, вы получаете: +

+RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB
+
+

Переключение на размер хэша 8, вы получаете: +

+RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB
+
+

Переключение на размер блока 512, вы получаете: +

+RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB
+
+

Переключение как на размер хэша 8, так и на размер блока 512, вы получаете: +

+RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB
+
+
+
+

+autosave SIZE_IN_GIGABYTES +

+

Автоматически сохраняет состояние при синхронизации или проверке после +обработки указанного количества ГБ. +Эта опция полезна, чтобы избежать перезапуска длительных команд `sync` +с нуля, если они были прерваны сбоем машины или любым другим событием. +

+
+

+temp_limit TEMPERATURE_CELSIUS +

+

Устанавливает максимально допустимую температуру диска в Цельсиях. Если указано, +SnapRAID периодически проверяет температуру всех дисков с помощью +инструмента smartctl. Текущие температуры дисков отображаются во время +работы SnapRAID. Если какой-либо диск превышает этот лимит, все операции +останавливаются, и диски останавливают вращение (переходят в режим ожидания) на время, +определенное опцией `temp_sleep`. После периода ожидания операции +возобновляются, потенциально снова приостанавливаясь, если лимит температуры +достигается еще раз. +

Во время работы SnapRAID также анализирует кривую нагрева каждого +диска и оценивает долгосрочную установившуюся температуру, которую они, +как ожидается, достигнут, если активность продолжится. Оценка выполняется +только после того, как температура диска увеличилась четыре раза, +что гарантирует наличие достаточного количества данных для установления +надежной тенденции. +Эта прогнозируемая установившаяся температура показывается в скобках рядом с +текущим значением и помогает оценить, достаточно ли +охлаждение системы. Эта оценочная температура предназначена только +для информации и не влияет на поведение SnapRAID. Действия программы +основываются исключительно на фактических измеренных температурах дисков. +

Для выполнения этого анализа SnapRAID требуется эталон для температуры +системы. Сначала он пытается прочитать его из доступных аппаратных +датчиков. Если ни один системный датчик не может быть доступен, он использует +самую низкую температуру диска, измеренную в начале выполнения, в качестве +резервного эталона. +

Обычно SnapRAID показывает только температуру самого горячего диска. +Чтобы отобразить температуру всех дисков, используйте опцию -A или --stats. +

+
+

+temp_sleep TIME_IN_MINUTES +

+

Устанавливает время ожидания, в минутах, когда достигается предел температуры. +В течение этого периода диски остаются остановленными. По умолчанию — 5 минут. +

+
+

+pool DIR +

+

Определяет каталог объединения (pooling), где создается виртуальное представление +дискового массива с помощью команды `pool`. +

Каталог должен уже существовать. +

+
+

+share UNC_DIR +

+

Определяет путь UNC Windows, необходимый для удаленного доступа к дискам. +

Если указана эта опция, символические ссылки, созданные в каталоге pool, +используют этот путь UNC для доступа к дискам. +Без этой опции сгенерированные символические ссылки используют только локальные пути, +что не позволяет предоставлять общий доступ к каталогу pool по сети. +

Символические ссылки формируются с использованием указанного пути UNC, добавлением +имени диска, как указано в опции `data`, и, наконец, добавлением +каталога и имени файла. +

Эта опция требуется только для Windows. +

+
+

+smartctl DISK/PARITY OPTIONS... +

+

Определяет пользовательские опции smartctl для получения атрибутов SMART для +каждого диска. Это может потребоваться для контроллеров RAID и некоторых USB-дисков, +которые не могут быть обнаружены автоматически. Заполнитель %s заменяется +именем устройства, но он необязателен для фиксированных устройств, таких как +контроллеры RAID. +

DISK — это то же имя диска, указанное в опции `data`. +PARITY — это одно из имен четности: `parity`, `2-parity`, `3-parity`, +`4-parity`, `5-parity`, `6-parity` или `z-parity`. +

В указанных OPTIONS строка `%s` заменяется +именем устройства. Для контроллеров RAID устройство, +вероятно, фиксировано, и вам может не потребоваться использовать `%s`. +

Возможные опции см. в документации smartmontools: +

+https://www.smartmontools.org/wiki/Supported_RAID-Controllers
+https://www.smartmontools.org/wiki/Supported_USB-Devices
+
+

Например: +

+smartctl parity -d sat %s
+
+
+
+

+smartignore DISK/PARITY ATTR [ATTR...] +

+

Игнорирует указанный атрибут SMART при вычислении вероятности +сбоя диска. Эта опция полезна, если диск сообщает необычные или +вводящие в заблуждение значения для конкретного атрибута. +

DISK — это то же имя диска, указанное в опции `data`. +PARITY — это одно из имен четности: `parity`, `2-parity`, `3-parity`, +`4-parity`, `5-parity`, `6-parity` или `z-parity`. +Специальное значение * может использоваться для игнорирования атрибута на всех дисках. +

Например, чтобы игнорировать атрибут `Current Pending Sector Count` на +всех дисках: +

+smartignore * 197
+
+

Чтобы игнорировать его только на первом диске четности: +

+smartignore parity 197
+
+
+
+

+Examples +

+

Пример типичной конфигурации для Unix: +

+parity /mnt/diskp/snapraid.parity
+content /mnt/diskp/snapraid.content
+content /var/snapraid/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+exclude /lost+found/
+exclude /tmp/
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/sg0
+smartctl 2-parity -d areca,2/1 /dev/sg0
+
+

Пример типичной конфигурации для Windows: +

+parity E:\snapraid.parity
+content E:\snapraid.content
+content C:\snapraid\snapraid.content
+data d1 G:\array\
+data d2 H:\array\
+data d3 I:\array\
+exclude Thumbs.db
+exclude \$RECYCLE.BIN
+exclude \System Volume Information
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/arcmsr0
+smartctl 2-parity -d areca,2/1 /dev/arcmsr0
+
+
+
+
+

+Pattern +

+

Шаблоны обеспечивают гибкий способ фильтрации файлов для включения или +исключения. Используя символы подстановки (globbing), вы можете определить правила, +которые соответствуют конкретным именам файлов или целым структурам каталогов без +ручного перечисления каждого пути. +

Вопросительный знак `?` соответствует любому одиночному символу, кроме +разделителя каталогов. Это делает его полезным для сопоставления имен файлов с +переменными символами, при этом шаблон ограничивается одним уровнем каталога. +

Одиночная звездочка `*` соответствует любой последовательности символов, но, как и +вопросительный знак, она никогда не пересекает границы каталогов. Она останавливается на +прямой косой черте, что делает ее подходящей для сопоставления внутри одного +компонента пути. Это стандартное поведение подстановочных знаков, знакомое +по оболочке (shell). +

Двойная звездочка `**` более мощная, она соответствует любой последовательности +символов, включая разделители каталогов. Это позволяет шаблонам соответствовать +нескольким уровням каталогов. Когда `**` появляется непосредственно в +шаблоне, она может соответствовать нулю или более символам, включая косые черты между +окружающим буквальным текстом. +

Наиболее важным использованием `**` является специальная форма `/**/`. Она соответствует +нулю или более полным уровням каталогов, что позволяет сопоставлять файлы +на любой глубине в дереве каталогов, не зная точной структуры пути. +Например, шаблон `src/**/main.js` соответствует `src/main.js` (пропуск +ноля каталогов), `src/ui/main.js` (пропуск одного каталога) и +`src/ui/components/main.js` (пропуск двух каталогов). +

Классы символов с использованием квадратных скобок `[]` соответствуют одному символу из +заданного набора или диапазона. Как и другие односимвольные шаблоны, они +не соответствуют разделителям каталогов. Классы поддерживают диапазоны и отрицание с +использованием восклицательного знака. +

Фундаментальное различие, которое следует помнить, заключается в том, что `*`, `?` и классы +символов соблюдают границы каталогов и соответствуют только внутри одного +компонента пути, в то время как `**` — единственный шаблон, который может соответствовать +через разделители каталогов. +

Существует четыре различных типа шаблонов: +

+
+
+FILE +
+Выбирает любой файл с именем FILE. +Этот шаблон применяется только к файлам, но не к директориям. +
+
+
+
+
+
+DIR/ +
+Выбирает любую директорию с именем DIR и все, что находится внутри нее. +Этот шаблон применяется только к директориям, но не к файлам. +
+
+
+
+
+
+/PATH/FILE +
+Выбирает точно указанный путь к файлу. Этот шаблон применяется +только к файлам, но не к директориям. +
+
+
+
+
+
+/PATH/DIR/ +
+Выбирает точно указанный путь к директории и все, что находится +внутри нее. Этот шаблон применяется только к директориям, но не к файлам. +
+
+
+

Когда вы указываете абсолютный путь, начинающийся с /, он применяется к +корневому каталогу массива, а не к корневому каталогу локальной файловой системы. +

В Windows вы можете использовать обратную косую черту \ вместо прямой /. +Системные каталоги Windows, точки соединения, точки монтирования и другие +специальные каталоги Windows рассматриваются как файлы, что означает, что для их +исключения вы должны использовать правило файла, а не каталога. +

Если имя файла содержит символы '*', '?', '[', +или ']', вы должны экранировать их, чтобы избежать их интерпретации как +символов глоббинга. В Unix символом экранирования является '\'; в Windows — '^'. +Когда шаблон находится в командной строке, вы должны удвоить символ +экранирования, чтобы избежать его интерпретации командной оболочкой. +

В файле конфигурации вы можете использовать различные стратегии для фильтрации +файлов для обработки. +Самый простой подход — использовать только правила `exclude` для удаления всех +файлов и каталогов, которые вы не хотите обрабатывать. Например: +

+# Исключает любой файл с именем `*.unrecoverable`
+exclude *.unrecoverable
+# Исключает корневой каталог `/lost+found`
+exclude /lost+found/
+# Исключает любой подкаталог с именем `tmp`
+exclude tmp/
+
+

Противоположный подход — определить только файлы, которые вы хотите обрабатывать, используя +только правила `include`. Например: +

+# Включает только некоторые каталоги
+include /movies/
+include /musics/
+include /pictures/
+
+

Конечный подход — смешивать правила `exclude` и `include`. В этом случае +порядок правил важен. Более ранние правила имеют +преимущество над более поздними. +Для упрощения вы можете сначала перечислить все правила `exclude`, а затем +все правила `include`. Например: +

+# Исключает любой файл с именем `*.unrecoverable`
+exclude *.unrecoverable
+# Исключает любой подкаталог с именем `tmp`
+exclude tmp/
+# Включает только некоторые каталоги
+include /movies/
+include /musics/
+include /pictures/
+
+

В командной строке, используя опцию -f, вы можете использовать только шаблоны `include`. +Например: +

+# Проверяет только файлы .mp3.
+# В Unix используйте кавычки, чтобы избежать расширения глоббинга оболочкой.
+snapraid -f "*.mp3" check
+
+

В Unix при использовании символов глоббинга в командной строке вы должны +заключить их в кавычки, чтобы предотвратить их расширение оболочкой. +

+
+

+Ignore File +

+

В дополнение к глобальным правилам в файле конфигурации, вы можете +размещать файлы `.snapraidignore` в любом каталоге внутри массива для +определения децентрализованных правил исключения. +

Правила, определенные в `.snapraidignore`, применяются после правил в +конфигурационном файле. Это означает, что они имеют более высокий приоритет +и могут использоваться для исключения файлов, которые ранее были включены +глобальной конфигурацией. Фактически, если локальное правило совпадает, файл +исключается независимо от глобальных настроек включения. +

Логика шаблонов в `.snapraidignore` повторяет глобальную конфигурацию, но +привязывает шаблоны к каталогу, в котором находится файл: +

+
+
+FILE +
+Выбирает любой файл с именем FILE в этом каталоге или ниже. +Здесь действуют те же правила подстановки, что и в глобальном шаблоне. +
+
+
+
+
+
+DIR/ +
+Выбирает любой каталог с именем DIR и все его содержимое, +находящееся в этом каталоге или ниже. +
+
+
+
+
+
+/PATH/FILE +
+Выбирает точно указанный файл относительно местоположения +файла `.snapraidignore`. +
+
+
+
+
+
+/PATH/DIR/ +
+Выбирает точно указанный каталог и все его содержимое +относительно местоположения файла `.snapraidignore`. +
+
+
+

В отличие от глобальной конфигурации, файлы `.snapraidignore` поддерживают +только правила исключения; вы не можете использовать шаблоны `include` или отрицание (!). +

Например, если у вас есть `.snapraidignore` в `/mnt/disk1/projects/`: +

+# Исключает ТОЛЬКО /mnt/disk1/projects/output.bin
+/output.bin
+# Исключает любой каталог с именем 'build' внутри projects/
+build/
+# Исключает любой .tmp файл внутри projects/ или его подпапок
+*.tmp
+
+
+
+

+Content +

+

SnapRAID хранит список и контрольные суммы ваших файлов в файле content. +

Это бинарный файл, который перечисляет все файлы, присутствующие в вашем дисковом массиве, +вместе со всеми контрольными суммами для проверки их целостности. +

Этот файл считывается и записывается командами `sync` и `scrub` и +считывается командами `fix`, `check` и `status`. +

+
+

+Parity +

+

SnapRAID хранит информацию четности вашего массива в файлах parity. +

Это бинарные файлы, содержащие вычисленную четность всех +блоков, определенных в файле `content`. +

Эти файлы считываются и записываются командами `sync` и `fix` и +только считываются командами `scrub` и `check`. +

+
+

+Encoding +

+

SnapRAID в Unix игнорирует любое кодирование. Он считывает и хранит +имена файлов с тем же кодированием, которое используется файловой системой. +

В Windows все имена, считанные из файловой системы, преобразуются и +обрабатываются в формате UTF-8. +

Чтобы имена файлов печатались правильно, вы должны установить консоль Windows +в режим UTF-8 командой `chcp 65001` и использовать +шрифт TrueType, такой как `Lucida Console`, в качестве шрифта консоли. +Это влияет только на печатаемые имена файлов; если вы +перенаправляете вывод консоли в файл, результирующий файл всегда +в формате UTF-8. +

+ + +
+
+
+ + + + + + + diff --git a/beta/manual-sv.html b/beta/manual-sv.html new file mode 100644 index 00000000..63941cff --- /dev/null +++ b/beta/manual-sv.html @@ -0,0 +1,1985 @@ + + + + + + + + SnapRAID Manual + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + +
+ +
+ +
+

+Synopsis +

+
+snapraid [-c, --conf CONFIG]
+    [-f, --filter PATTERN] [-d, --filter-disk NAME]
+    [-m, --filter-missing] [-e, --filter-error]
+    [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR]
+    [-p, --plan PERC|bad|new|full]
+    [-o, --older-than DAYS] [-l, --log FILE]
+    [-s, --spin-down-on-error] [-w, --bw-limit RATE]
+    [-Z, --force-zero] [-E, --force-empty]
+    [-U, --force-uuid] [-D, --force-device]
+    [-N, --force-nocopy] [-F, --force-full]
+    [-R, --force-realloc]
+    [-S, --start BLKSTART] [-B, --count BLKCOUNT]
+    [-L, --error-limit NUMBER]
+    [-A, --stats]
+    [-v, --verbose] [-q, --quiet]
+    status|smart|probe|up|down|diff|sync|scrub|fix|check
+    |list|dup|pool|devices|touch|rehash
+
+
+snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT]
+
+
+
+

+Beskrivning +

+

SnapRAID är ett säkerhetskopieringsprogram designat för disk-arrayer, +som lagrar paritetsinformation för dataåterställning vid upp till sex +diskfel. +

SnapRAID är i första hand avsett för hemmamediabibliotek med stora, +sällan ändrade filer, och erbjuder flera funktioner: +

    +
  • +Du kan använda diskar som redan är fyllda med filer utan +att behöva formatera om dem, och du får åtkomst till dem som vanligt. +
  • +
  • +All din data hashberäknas för att säkerställa dataintegritet och +förhindra tyst korruption. +
  • +
  • +När antalet felaktiga diskar överskrider paritetsantalet, +begränsas dataförlusten till de drabbade diskarna; data på +andra diskar förblir åtkomlig. +
  • +
  • +Om du oavsiktligt raderar filer på en disk är återställning +möjlig. +
  • +
  • +Diskar kan ha olika storlekar. +
  • +
  • +Du kan lägga till diskar när som helst. +
  • +
  • +SnapRAID låser inte in din data; du kan sluta använda det +när som helst utan omformatering eller dataflytt. +
  • +
  • +För att få åtkomst till en fil behöver endast en enda disk snurra, +vilket sparar ström och minskar buller. +
  • +
+

För mer information, besök den officiella SnapRAID-webbplatsen: +

+https://www.snapraid.it/
+
+
+
+

+Begränsningar +

+

SnapRAID är en hybrid mellan ett RAID- och ett säkerhetskopieringsprogram, +som syftar till att kombinera de bästa fördelarna med båda. Den har dock +vissa begränsningar som du bör överväga innan du använder den. +

Huvudbegränsningen är att om en disk misslyckas och du inte nyligen har +synkat, kanske du inte kan återställa fullständigt. +Mer specifikt, kanske du inte kan återställa upp till storleken på +de ändrade eller raderade filerna sedan den senaste synkroniseringsoperationen. +Detta inträffar även om de ändrade eller raderade filerna inte finns på +den felaktiga disken. Det är därför SnapRAID passar bättre för +data som sällan ändras. +

Å andra sidan förhindrar nyligen tillagda filer inte återställning av redan +befintliga filer. Du kommer bara att förlora de nyligen tillagda filerna om de +finns på den felaktiga disken. +

Andra SnapRAID-begränsningar är: +

    +
  • +Med SnapRAID har du fortfarande separata filsystem för varje disk. +Med RAID får du ett enda stort filsystem. +
  • +
  • +SnapRAID stripas inte data. +Med RAID får du en hastighetsökning med striping. +
  • +
  • +SnapRAID stöder inte återställning i realtid. +Med RAID behöver du inte sluta arbeta när en disk misslyckas. +
  • +
  • +SnapRAID kan bara återställa data från ett begränsat antal diskfel. +Med en säkerhetskopia kan du återställa från ett fullständigt +fel på hela disk-arrayen. +
  • +
  • +Endast filnamn, tidsstämplar, symboliska länkar och hårda länkar sparas. +Behörigheter, ägarskap och utökade attribut sparas inte. +
  • +
+
+
+

+Kom igång +

+

För att använda SnapRAID måste du först välja en disk i din disk-array +som ska dediceras till `parity`-information. Med en disk för paritet, +kommer du att kunna återställa från ett enda diskfel, liknande RAID5. +

Om du vill återställa från fler diskfel, liknande RAID6, +måste du reservera ytterligare diskar för paritet. Varje ytterligare +paritetsdisk möjliggör återställning från ett diskfel till. +

Som paritetsdiskar måste du välja de största diskarna i arrayen, +eftersom paritetsinformationen kan växa till storleken av den största +datadisken i arrayen. +

Dessa diskar kommer att dediceras till att lagra `parity`-filerna. +Du bör inte lagra din data på dem. +

Sedan måste du definiera de `data`-diskar som du vill skydda +med SnapRAID. Skyddet är mer effektivt om dessa diskar +innehåller data som sällan ändras. Av denna anledning är det bäst att +INTE inkludera Windows C:\-disken eller Unix /home, /var och /tmp +katalogerna. +

Listan över filer sparas i `content`-filerna, som vanligtvis +lagras på data-, paritets- eller startdiskarna. +Denna fil innehåller detaljerna för din säkerhetskopia, inklusive alla +checksummor för att verifiera dess integritet. +`content`-filen lagras i flera kopior, och varje kopia måste +finnas på en annan disk för att säkerställa att, även vid flera +diskfel, minst en kopia är tillgänglig. +

Anta till exempel att du bara är intresserad av en paritetsnivå +av skydd, och dina diskar finns på: +

+/mnt/diskp <- vald disk för paritet
+/mnt/disk1 <- första disken att skydda
+/mnt/disk2 <- andra disken att skydda
+/mnt/disk3 <- tredje disken att skydda
+
+

Du måste skapa konfigurationsfilen /etc/snapraid.conf med +följande alternativ: +

+parity /mnt/diskp/snapraid.parity
+content /var/snapraid/snapraid.content
+content /mnt/disk1/snapraid.content
+content /mnt/disk2/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+
+

Om du använder Windows bör du använda Windows sökvägsformat, med +enhetsbeteckningar och omvända snedstreck istället för snedstreck. +

+parity E:\snapraid.parity
+content C:\snapraid\snapraid.content
+content F:\array\snapraid.content
+content G:\array\snapraid.content
+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+
+

Om du har många diskar och får slut på enhetsbeteckningar kan du montera +diskar direkt i undermappar. Se: +

+https://www.google.com/search?q=Windows+mount+point
+
+

Vid denna punkt är du redo att köra kommandot `sync` för att bygga +paritetsinformationen. +

+snapraid sync
+
+

Denna process kan ta flera timmar första gången, beroende på storleken +på datan som redan finns på diskarna. Om diskarna är tomma är +processen omedelbar. +

Du kan stoppa det när som helst genom att trycka Ctrl+C, och vid nästa körning +återupptas det där det avbröts. +

När detta kommando är klart är din data SÄKER. +

Nu kan du börja använda din array som du vill och periodiskt +uppdatera paritetsinformationen genom att köra kommandot `sync`. +

+

+Skrubbning (Scrubbing) +

+

För att periodiskt kontrollera data och paritet för fel kan du +köra kommandot `scrub`. +

+snapraid scrub
+
+

Detta kommando jämför data i din array med den hash som beräknades +under kommandot `sync` för att verifiera integriteten. +

Varje körning av kommandot kontrollerar ungefär 8% av arrayen, exklusive data +som redan skrubbats under de föregående 10 dagarna. +Du kan använda alternativet -p, --plan för att specificera en annan mängd +och alternativet -o, --older-than för att specificera en annan ålder i dagar. +Till exempel, för att kontrollera 5% av arrayen för block äldre än 20 dagar, använd: +

+snapraid -p 5 -o 20 scrub
+
+

Om tysta eller input/output-fel hittas under processen, +markeras de motsvarande blocken som dåliga i `content`-filen +och listas i kommandot `status`. +

+snapraid status
+
+

För att fixa dem kan du använda kommandot `fix`, filtrera efter dåliga block med +alternativet -e, --filter-error: +

+snapraid -e fix
+
+

Vid nästa `scrub` kommer felen att försvinna från `status`-rapporten +om de verkligen är fixade. För att göra det snabbare kan du använda -p bad för att skrubba +endast block markerade som dåliga. +

+snapraid -p bad scrub
+
+

Att köra `scrub` på en osynkad array kan rapportera fel orsakade av +borttagna eller modifierade filer. Dessa fel rapporteras i `scrub`- +utdata, men de relaterade blocken markeras inte som dåliga. +

+
+

+Poolning +

+

Obs: Poolningsfunktionen som beskrivs nedan har ersatts av verktyget +mergefs, som nu är det rekommenderade alternativet för Linux-användare i +SnapRAID-communityt. Mergefs ger ett mer flexibelt och effektivt +sätt att poola flera enheter till en enda enhetlig monteringspunkt, +vilket möjliggör sömlös åtkomst till filer över din array utan att förlita sig +på symboliska länkar. Det integreras väl med SnapRAID för paritetsskydd +och används ofta i installationer som OpenMediaVault (OMV) +eller anpassade NAS-konfigurationer. +

För att visa alla filer i din array i samma katalogträd, +kan du aktivera funktionen `pooling`. Den skapar en skrivskyddad virtuell +vy av alla filer i din array med hjälp av symboliska länkar. +

Du kan konfigurera `pooling`-katalogen i konfigurationsfilen med: +

+pool /pool
+
+

eller, om du använder Windows, med: +

+pool C:\pool
+
+

och kör sedan kommandot `pool` för att skapa eller uppdatera den virtuella vyn. +

+snapraid pool
+
+

Om du använder en Unix-plattform och vill dela denna katalog +över nätverket till antingen Windows- eller Unix-maskiner, bör du lägga till +följande alternativ till din /etc/samba/smb.conf: +

+# I den globala sektionen av smb.conf
+unix extensions = no
+
+
+# I delningssektionen av smb.conf
+[pool]
+comment = Pool
+path = /pool
+read only = yes
+guest ok = yes
+wide links = yes
+follow symlinks = yes
+
+

I Windows kräver delning av symboliska länkar över ett nätverk att klienter +löser dem på distans. För att aktivera detta måste du, förutom att dela pool-katalogen, +även dela alla diskar oberoende, med hjälp av de disk-namn +som definieras i konfigurationsfilen som delningspunkter. Du måste också specificera +i alternativet `share` i konfigurationsfilen den Windows UNC-sökväg som +fjärrklienter behöver använda för att få åtkomst till dessa delade diskar. +

Till exempel, om du arbetar från en server som heter `darkstar`, kan du använda +alternativen: +

+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+pool C:\pool
+share \\darkstar
+
+

och dela följande kataloger över nätverket: +

+\\darkstar\pool -> C:\pool
+\\darkstar\d1 -> F:\array
+\\darkstar\d2 -> G:\array
+\\darkstar\d3 -> H:\array
+
+

för att tillåta fjärrklienter att få åtkomst till alla filer på \\darkstar\pool. +

Du kan också behöva konfigurera fjärrklienter för att möjliggöra åtkomst till +fjärrsymboliska länkar med kommandot: +

+fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
+
+
+
+

+Ångra radering (Undeleting) +

+

SnapRAID fungerar mer som ett säkerhetskopieringsprogram än ett RAID-system, och det +kan användas för att återställa eller ångra radering av filer till deras tidigare tillstånd +med hjälp av alternativet -f, --filter: +

+snapraid fix -f FIL
+
+

eller för en katalog: +

+snapraid fix -f KATALOG/
+
+

Du kan också använda det för att återställa endast oavsiktligt raderade filer inuti +en katalog med hjälp av alternativet -m, --filter-missing, som återställer +endast saknade filer, och lämnar alla andra orörda. +

+snapraid fix -m -f KATALOG/
+
+

Eller för att återställa alla raderade filer på alla enheter med: +

+snapraid fix -m
+
+
+
+

+Återställning +

+

Det värsta har hänt, och du har förlorat en eller flera diskar! +

FÅ INTE PANIK! Du kommer att kunna återställa dem! +

Det första du måste göra är att undvika ytterligare ändringar i din disk-array. +Inaktivera alla fjärranslutningar till den och alla schemalagda processer, inklusive +alla schemalagda SnapRAID nattliga sync- eller scrub-körningar. +

Fortsätt sedan med följande steg. +

+

+STEG 1 -> Omkonfigurera +

+

Du behöver lite utrymme för att återställa, helst på ytterligare +reservdiskar, men en extern USB-disk eller fjärrdisk räcker. +

Ändra SnapRAID-konfigurationsfilen för att få alternativet `data` eller `parity` +för den felaktiga disken att peka på en plats med tillräckligt tomt +utrymme för att återställa filerna. +

Om till exempel disk `d1` har misslyckats, ändra från: +

+data d1 /mnt/disk1/
+
+

till: +

+data d1 /mnt/new_spare_disk/
+
+

Om disken som ska återställas är en paritetsdisk, uppdatera det lämpliga `parity`- +alternativet. +Om du har flera felaktiga diskar, uppdatera alla deras konfigurationsalternativ. +

+
+

+STEG 2 -> Fixa +

+

Kör kommandot fix och lagra loggen i en extern fil med: +

+snapraid -d NAMN -l fix.log fix
+
+

Där NAMN är namnet på disken, till exempel `d1` i vårt tidigare exempel. +Om disken som ska återställas är en paritetsdisk, använd namnen `parity`, `2-parity`, +etc. +Om du har flera felaktiga diskar, använd flera -d-alternativ för att specificera alla +av dem. +

Detta kommando kommer att ta lång tid. +

Se till att du har några gigabyte ledigt för att lagra fix.log-filen. +Kör den från en disk med tillräckligt med ledigt utrymme. +

Nu har du återställt allt som är återställningsbart. Om vissa filer är delvis +eller helt icke-återställningsbara, kommer de att döpas om genom att lägga till tillägget +`.unrecoverable`. +

Du kan hitta en detaljerad lista över alla icke-återställningsbara block i fix.log-filen +genom att kontrollera alla rader som börjar med `unrecoverable:`. +

Om du inte är nöjd med återställningen kan du försöka igen hur många +gånger du vill. +

Om du till exempel har tagit bort filer från arrayen efter den senaste +`sync`, kan detta leda till att vissa filer inte återställs. +I detta fall kan du försöka igen `fix` med alternativet -i, --import, +specificera var dessa filer nu finns för att inkludera dem igen i +återställningsprocessen. +

Om du är nöjd med återställningen kan du fortsätta, +men notera att efter synkronisering kan du inte försöka igen kommandot `fix` +längre! +

+
+

+STEG 3 -> Kontrollera +

+

Som en försiktighetsåtgärd kan du nu köra ett `check`-kommando för att säkerställa att +allt är korrekt på den återställda disken. +

+snapraid -d NAMN -a check
+
+

Där NAMN är namnet på disken, till exempel `d1` i vårt tidigare exempel. +

Alternativen -d och -a talar om för SnapRAID att endast kontrollera den specificerade disken +och ignorera all paritetsdata. +

Detta kommando kommer att ta lång tid, men om du inte är alltför försiktig, +kan du hoppa över det. +

+
+

+STEG 4 -> Synkronisera +

+

Kör kommandot `sync` för att synkronisera arrayen igen med den nya disken. +

+snapraid sync
+
+

Om allt är återställt är detta kommando omedelbart. +

+
+
+
+

+Kommandon +

+

SnapRAID tillhandahåller några enkla kommandon som låter dig: +

    +
  • +Skriva ut statusen för arrayen -> `status` +
  • +
  • +Kontrollera diskarna -> `smart`, `probe`, `up`, `down` +
  • +
  • +Göra en säkerhetskopia/ögonblicksbild -> `sync` +
  • +
  • +Periodiskt kontrollera data -> `scrub` +
  • +
  • +Återställa den senaste säkerhetskopian/ögonblicksbilden -> `fix`. +
  • +
+

Kommandon måste skrivas med gemener. +

+

+status +

+

Skriver ut en sammanfattning av tillståndet för disk-arrayen. +

Det inkluderar information om paritetsfragmentering, hur gamla +blocken är utan kontroll, och alla registrerade tysta +fel som påträffats under skrubbning. +

Informationen som presenteras hänvisar till den senaste tidpunkten du +körde `sync`. Senare modifieringar beaktas inte. +

Om dåliga block upptäcktes, listas deras blocknummer. +För att fixa dem kan du använda kommandot `fix -e`. +

Det visar också ett diagram som representerar den senaste tidpunkten då varje block +skrubbades eller synkroniserades. Skrubbade block visas med '*', +block synkroniserade men ännu inte skrubbade med 'o'. +

Inget ändras. +

+
+

+smart +

+

Skriver ut en SMART-rapport över alla diskar i systemet. +

Det inkluderar en uppskattning av sannolikheten för fel under det kommande +året, vilket gör att du kan planera underhållsersättningar av diskar som visar +misstänkta attribut. +

Denna sannolikhetsuppskattning erhålls genom att korrelera SMART-attributen +för diskarna med Backblaze-data som finns tillgänglig på: +

+https://www.backblaze.com/hard-drive-test-data.html
+
+

Om SMART rapporterar att en disk håller på att misslyckas, skrivs `FAIL` eller `PREFAIL` ut +för den disken, och SnapRAID returnerar med ett fel. +I detta fall rekommenderas omedelbar ersättning av disken starkt. +

Andra möjliga statussträngar är: +

+
+
+logfail +
+Tidigare var vissa attribut lägre än +tröskelvärdet. +
+
+
+
+logerr +
+Enhetens fellogg innehåller fel. +
+
+
+
+selferr +
+Enhetens självtestlogg innehåller fel. +
+
+
+

Om alternativet -v, --verbose specificeras, tillhandahålls en djupare statistisk analys. +Denna analys kan hjälpa dig att bestämma om du behöver mer +eller mindre paritet. +

Detta kommando använder verktyget `smartctl` och är ekvivalent med att köra +`smartctl -a` på alla enheter. +

Om dina enheter inte upptäcks automatiskt korrekt kan du specificera +ett anpassat kommando med hjälp av alternativet `smartctl` i konfigurations- +filen. +

Inget ändras. +

+
+

+probe +

+

Skriver ut STRÖM-tillståndet för alla diskar i systemet. +

`Standby` betyder att disken inte snurrar. `Active` betyder +att disken snurrar. +

Detta kommando använder verktyget `smartctl` och är ekvivalent med att köra +`smartctl -n standby -i` på alla enheter. +

Om dina enheter inte upptäcks automatiskt korrekt kan du specificera +ett anpassat kommando med hjälp av alternativet `smartctl` i konfigurations- +filen. +

Inget ändras. +

+
+

+up +

+

Snurrar upp alla diskar i arrayen. +

Du kan snurra upp endast specifika diskar med hjälp av alternativet -d, --filter-disk. +

Att snurra upp alla diskar samtidigt kräver mycket ström. +Se till att din strömförsörjning kan klara det. +

Inget ändras. +

+
+

+down +

+

Snurrar ner alla diskar i arrayen. +

Detta kommando använder verktyget `smartctl` och är ekvivalent med att köra +`smartctl -s standby,now` på alla enheter. +

Du kan snurra ner endast specifika diskar med hjälp av alternativet -d, --filter-disk +alternativet. +

För att automatiskt snurra ner vid fel kan du använda alternativet -s, --spin-down-on-error +med alla andra kommandon, vilket är ekvivalent med att köra `down` manuellt +när ett fel inträffar. +

Inget ändras. +

+
+

+diff +

+

Listar alla filer som modifierats sedan den senaste `sync` och som behöver få +sin paritetsdata omberäknad. +

Detta kommando kontrollerar inte filens data, utan endast filens tidsstämpel, +storlek och inode. +

Efter att ha listat alla ändrade filer presenteras en sammanfattning av ändringarna, +grupperade efter: +

+
+
+equal +
+Filer oförändrade från tidigare. +
+
+
+
+added +
+Filer tillagda som inte fanns tidigare. +
+
+
+
+removed +
+Filer borttagna. +
+
+
+
+updated +
+Filer med en annan storlek eller tidsstämpel, vilket innebär att de +modifierades. +
+
+
+
+moved +
+Filer flyttade till en annan katalog på samma disk. +De identifieras genom att ha samma namn, storlek, tidsstämpel +och inode, men en annan katalog. +
+
+
+
+copied +
+Filer kopierade på samma eller en annan disk. Observera att om +de verkligen flyttas till en annan disk, kommer de också att +räknas i `removed`. +De identifieras genom att ha samma namn, storlek och +tidsstämpel. Om undertidsstämpeln är noll, +måste hela sökvägen matcha, inte bara namnet. +
+
+
+
+restored +
+Filer med en annan inode men matchande namn, storlek och tidsstämpel. +Dessa är vanligtvis filer som återställts efter att ha raderats. +
+
+
+

Om en `sync` krävs är processens returkod 2, istället för standard 0. +Returkoden 1 används för ett generiskt feltillstånd. +

Inget ändras. +

+
+

+sync +

+

Uppdaterar paritetsinformationen. Alla modifierade filer +i disk-arrayen läses, och motsvarande paritets- +data uppdateras. +

Du kan stoppa denna process när som helst genom att trycka Ctrl+C, +utan att förlora det arbete som redan utförts. +Vid nästa körning kommer `sync`-processen att återupptas där +den avbröts. +

Om tysta eller input/output-fel hittas under processen, +markeras de motsvarande blocken som dåliga. +

Filer identifieras med sökväg och/eller inode och kontrolleras med +storlek och tidsstämpel. +Om filstorleken eller tidsstämpeln skiljer sig åt, beräknas paritetsdata +om för hela filen. +Om filen flyttas eller döps om på samma disk, samtidigt som +samma inode behålls, beräknas inte pariteten om. +Om filen flyttas till en annan disk, beräknas pariteten om, +men den tidigare beräknade hash-informationen behålls. +

`content`- och `parity`-filerna modifieras vid behov. +Filerna i arrayen modifieras INTE. +

+
+

+scrub +

+

Skrubbar arrayen och söker efter tysta eller input/output-fel i data- +och paritetsdiskar. +

Varje anrop kontrollerar ungefär 8% av arrayen, exklusive +data som redan skrubbats under de senaste 10 dagarna. +Detta innebär att skrubbning en gång i veckan säkerställer att varje bit data kontrolleras +minst en gång var tredje månad. +

Du kan definiera en annan skrubbplan eller mängd med hjälp av alternativet -p, --plan +som accepterar: +bad - Skrubbar block markerade som dåliga. +new - Skrubbar nyligen synkroniserade block som ännu inte skrubbats. +full - Skrubbar allt. +0-100 - Skrubbar den specificerade procentandelen av block. +

Om du specificerar en procentsats kan du också använda alternativet -o, --older-than +för att definiera hur gammalt blocket ska vara. +De äldsta blocken skrubbas först, vilket säkerställer en optimal kontroll. +Om du bara vill skrubba de nyligen synkroniserade blocken som ännu inte skrubbats, +använd alternativet `-p new`. +

För att få detaljer om skrubbstatusen, använd kommandot `status`. +

För alla tysta eller input/output-fel som hittas, markeras de motsvarande blocken +som dåliga i `content`-filen. +Dessa dåliga block listas i `status` och kan fixas med `fix -e`. +Efter fixningen, vid nästa skrubb, kommer de att kontrolleras igen, och om de befinns +korrigerade, tas det dåliga märket bort. +För att skrubba endast de dåliga blocken kan du använda kommandot `scrub -p bad`. +

Det rekommenderas att köra `scrub` endast på en synkroniserad array för att undvika +rapporterade fel orsakade av osynkad data. Dessa fel känns igen +som att de inte är tysta fel, och blocken markeras inte som dåliga, +men sådana fel rapporteras i kommandots utdata. +

`content`-filen modifieras för att uppdatera tiden för den senaste kontrollen +för varje block och för att markera dåliga block. +`parity`-filerna modifieras INTE. +Filerna i arrayen modifieras INTE. +

+
+

+fix +

+

Fixar alla filer och paritetsdata. +

Alla filer och paritetsdata jämförs med ögonblicksbilds- +tillståndet som sparades i den senaste `sync`. +Om en skillnad hittas, återställs den till det lagrade ögonblicksbildstillståndet. +

VARNING! Kommandot `fix` skiljer inte mellan fel och +avsiktliga modifieringar. Det återställer ovillkorligen filtillståndet +till den senaste `sync`. +

Om inget annat alternativ specificeras, behandlas hela arrayen. +Använd filteralternativen för att välja en delmängd av filer eller diskar att arbeta med. +

För att fixa endast blocken markerade som dåliga under `sync` och `scrub`, +använd alternativet -e, --filter-error. +Till skillnad från andra filteralternativ tillämpar detta fixar endast på filer som är +oförändrade sedan den senaste `sync`. +

SnapRAID döper om alla filer som inte kan fixas genom att lägga till tillägget +`.unrecoverable`. +

Innan fixningen skannas hela arrayen för att hitta alla filer som flyttats +sedan den senaste `sync`-operationen. +Dessa filer identifieras av deras tidsstämpel, ignorera deras namn +och katalog, och används i återställningsprocessen vid behov. +Om du flyttade några av dem utanför arrayen kan du använda alternativet -i, --import +för att specificera ytterligare kataloger att skanna. +

Filer identifieras endast med sökväg, inte med inode. +

`content`-filen modifieras INTE. +`parity`-filerna modifieras vid behov. +Filerna i arrayen modifieras vid behov. +

+
+

+check +

+

Verifierar alla filer och paritetsdata. +

Det fungerar som `fix`, men det simulerar endast en återställning och inga ändringar +skrivs till arrayen. +

Detta kommando är i första hand avsett för manuell verifiering, +som efter en återställningsprocess eller under andra speciella förhållanden. +För periodiska och schemalagda kontroller, använd `scrub`. +

Om du använder alternativet -a, --audit-only, kontrolleras endast fil- +datan, och paritetsdatan ignoreras för en +snabbare körning. +

Filer identifieras endast med sökväg, inte med inode. +

Inget ändras. +

+
+

+list +

+

Listar alla filer som finns i arrayen vid tidpunkten för den +senaste `sync`. +

Med -v eller --verbose visas även undertiden. +

Inget ändras. +

+
+

+dup +

+

Listar alla dubblettfiler. Två filer antas vara lika om deras +hashar matchar. Filens data läses inte; endast de +förberäknade hasharna används. +

Inget ändras. +

+
+

+pool +

+

Skapar eller uppdaterar en virtuell vy av alla +filer i din disk-array i `pooling`-katalogen. +

Filerna kopieras inte utan länkas med hjälp av +symboliska länkar. +

Vid uppdatering raderas alla befintliga symboliska länkar och tomma +underkataloger och ersätts med den nya +vyn av arrayen. Alla andra vanliga filer lämnas kvar. +

Inget ändras utanför pool-katalogen. +

+
+

+devices +

+

Skriver ut de lågnivåenheter som används av arrayen. +

Detta kommando visar enhetsassociationerna i arrayen +och är främst avsett som ett skriptgränssnitt. +

De två första kolumnerna är lågnivåenhetens ID och sökväg. +De nästa två kolumnerna är högnivåenhetens ID och sökväg. +Den sista kolumnen är diskens namn i arrayen. +

I de flesta fall har du en lågnivåenhet för varje disk i +arrayen, men i vissa mer komplexa konfigurationer kan du ha flera +lågnivåenheter som används av en enda disk i arrayen. +

Inget ändras. +

+
+

+touch +

+

Anger en godtycklig undertidsstämpel för alla filer +som har den satt till noll. +

Detta förbättrar SnapRAIDs förmåga att känna igen flyttade +och kopierade filer, eftersom det gör tidsstämpeln nästan unik, +vilket minskar möjliga dubbletter. +

Mer specifikt, om undertidsstämpeln inte är noll, +identifieras en flyttad eller kopierad fil som sådan om den matchar +namn, storlek och tidsstämpel. Om undertidsstämpeln +är noll, betraktas den som en kopia endast om hela sökvägen, +storlek och tidsstämpel alla matchar. +

Tidsstämpeln med sekundprecision modifieras inte, +så alla datum och tider för dina filer bevaras. +

+
+

+rehash +

+

Schemalägger en omhashning av hela arrayen. +

Detta kommando ändrar den hash-typ som används, vanligtvis vid uppgradering +från ett 32-bitars system till ett 64-bitars system, för att byta från +MurmurHash3 till den snabbare SpookyHash. +

Om du redan använder den optimala hashen, gör detta kommando +ingenting och informerar dig om att ingen åtgärd behövs. +

Omhashningen utförs inte omedelbart utan sker +progressivt under `sync` och `scrub`. +

Du kan kontrollera omhashningstillståndet med hjälp av `status`. +

Under omhashningen bibehåller SnapRAID full funktionalitet, +med det enda undantaget att `dup` inte kan upptäcka dubbletter +med hjälp av en annan hash. +

+
+
+

+Alternativ +

+

SnapRAID tillhandahåller följande alternativ: +

+
+
+-c, --conf CONFIG +
+Väljer den konfigurationsfil som ska användas. Om den inte specificeras, i Unix +används filen `/usr/local/etc/snapraid.conf` om den finns, +annars `/etc/snapraid.conf`. +I Windows används filen `snapraid.conf` i samma +katalog som `snapraid.exe`. +
+
+
+
+
+
+-f, --filter PATTERN +
+Filtrerar filerna att behandla i `check` och `fix`. +Endast filerna som matchar det specificerade mönstret behandlas. +Detta alternativ kan användas flera gånger. +Se avsnittet MÖNSTER för mer information om +mönsterspecifikationer. +I Unix, se till att globbing-tecken citeras om de används. +Detta alternativ kan endast användas med `check` och `fix`. +Det kan inte användas med `sync` och `scrub`, eftersom de alltid +behandlar hela arrayen. +
+
+
+
+
+
+-d, --filter-disk NAME +
+Filtrerar diskarna att behandla i `check`, `fix`, `up` och `down`. +Du måste specificera ett disk-namn som definieras i konfigurations- +filen. +Du kan också specificera paritetsdiskar med namnen: `parity`, `2-parity`, +`3-parity`, etc., för att begränsa operationer till en specifik paritetsdisk. +Om du kombinerar flera --filter, --filter-disk och --filter-missing alternativ, +väljs endast filer som matchar alla filter. +Detta alternativ kan användas flera gånger. +Detta alternativ kan endast användas med `check`, `fix`, `up` och `down`. +Det kan inte användas med `sync` och `scrub`, eftersom de alltid +behandlar hela arrayen. +
+
+
+
+
+
+-m, --filter-missing +
+Filtrerar filerna att behandla i `check` och `fix`. +Endast filerna som saknas eller har raderats från arrayen behandlas. +När det används med `fix`, fungerar detta som ett `undelete`-kommando. +Om du kombinerar flera --filter, --filter-disk och --filter-missing alternativ, +väljs endast filer som matchar alla filter. +Detta alternativ kan endast användas med `check` och `fix`. +Det kan inte användas med `sync` och `scrub`, eftersom de alltid +behandlar hela arrayen. +
+
+
+
+
+
+-e, --filter-error +
+Behandlar filerna med fel i `check` och `fix`. +Det behandlar endast filer som har block markerade med tysta +eller input/output-fel under `sync` och `scrub`, som listas i `status`. +Detta alternativ kan endast användas med `check` och `fix`. +
+
+
+
+
+
+-p, --plan PERC|bad|new|full +
+Väljer skrubbplanen. Om PERC är ett numeriskt värde från 0 till 100, +tolkas det som procentandelen av block som ska skrubbas. +Istället för en procentsats kan du specificera en plan: +`bad` skrubbar dåliga block, `new` skrubbar block som ännu inte skrubbats, +och `full` skrubbar allt. +Detta alternativ kan endast användas med `scrub`. +
+
+
+
+
+
+-o, --older-than DAYS +
+Väljer den äldsta delen av arrayen att behandla i `scrub`. +DAYS är den minsta åldern i dagar för ett block att skrubbas; +standard är 10. +Block markerade som dåliga skrubbas alltid oavsett detta alternativ. +Detta alternativ kan endast användas med `scrub`. +
+
+
+
+
+
+-a, --audit-only +
+I `check`, verifierar hashen av filerna utan +att kontrollera paritetsdata. +Om du bara är intresserad av att kontrollera filens data, kan detta +alternativ avsevärt påskynda kontrollprocessen. +Detta alternativ kan endast användas med `check`. +
+
+
+
+
+
+-h, --pre-hash +
+I `sync`, kör en preliminär hash-fas av all ny data +för ytterligare verifiering innan paritetsberäkningen. +Vanligtvis görs ingen preliminär hashning i `sync`, och den nya +datan hashberäknas precis innan paritetsberäkningen när den läses +för första gången. +Denna process sker när systemet är under +tung belastning, med alla diskar snurrande och en upptagen CPU. +Detta är ett extremt tillstånd för maskinen, och om den har ett +latent hårdvaruproblem, kan tysta fel gå obemärkt förbi +eftersom datan ännu inte har hashberäknats. +För att undvika denna risk kan du aktivera `pre-hash`-läget för att få +all data läst två gånger för att säkerställa dess integritet. +Detta alternativ verifierar också filer som flyttats inom arrayen +för att säkerställa att flyttoperationen lyckades och, om nödvändigt, +låter dig köra en fix-operation innan du fortsätter. +Detta alternativ kan endast användas med `sync`. +
+
+
+
+
+
+-i, --import DIR +
+Importerar från den specificerade katalogen alla filer som raderats +från arrayen efter den senaste `sync`. +Om du fortfarande har sådana filer, kan de användas av `check` +och `fix` för att förbättra återställningsprocessen. +Filerna läses, inklusive i underkataloger, och identifieras +oavsett deras namn. +Detta alternativ kan endast användas med `check` och `fix`. +
+
+
+
+
+
+-s, --spin-down-on-error +
+Vid något fel, snurrar ner alla hanterade diskar innan den avslutas med +en statuskod som inte är noll. Detta förhindrar att enheterna +förblir aktiva och snurrar efter en avbruten operation, +vilket hjälper till att undvika onödig värmeuppbyggnad och ström- +förbrukning. Använd detta alternativ för att säkerställa att diskar stoppas säkert +även när ett kommando misslyckas. +
+
+
+
+
+
+-w, --bw-limit RATE +
+Tillämpar en global bandbreddsbegränsning för alla diskar. RATE är +antalet byte per sekund. Du kan specificera en multiplikator +som K, M eller G (t.ex. --bw-limit 1G). +
+
+
+
+
+
+-A, --stats +
+Aktiverar en utökad statusvy som visar ytterligare information. +Skärmen visar två diagram: +Det första diagrammet visar antalet buffrade strippar för varje +disk, tillsammans med filsökvägen för filen som för närvarande används +på den disken. Vanligtvis kommer den långsammaste disken att ha +ingen buffert tillgänglig, vilket bestämmer den maximalt uppnåeliga +bandbredden. +Det andra diagrammet visar procentandelen tid som spenderats i väntan +under de senaste 100 sekunderna. Den långsammaste disken förväntas +orsaka större delen av väntetiden, medan andra diskar bör ha +liten eller ingen väntetid eftersom de kan använda sina buffrade strippar. +Detta diagram visar också den tid som spenderats i väntan på hash- +beräkningar och RAID-beräkningar. +Alla beräkningar körs parallellt med diskoperationer. +Därför, så länge det finns mätbar väntetid för minst en disk, +indikerar det att CPU:n är snabb nog att +hålla jämna steg med arbetsbelastningen. +
+
+
+
+
+
+-Z, --force-zero +
+Tvingar den osäkra operationen att synkronisera en fil med noll +storlek som tidigare var icke-noll. +Om SnapRAID upptäcker ett sådant tillstånd, stoppar det att fortsätta +om du inte specificerar detta alternativ. +Detta gör att du enkelt kan upptäcka när, efter en systemkrasch, +vissa filer som användes trunkerades. +Detta är ett möjligt tillstånd i Linux med filsystemen ext3/ext4. +Detta alternativ kan endast användas med `sync`. +
+
+
+
+
+
+-E, --force-empty +
+Tvingar den osäkra operationen att synkronisera en disk där alla +ursprungliga filer saknas. +Om SnapRAID upptäcker att alla filer som ursprungligen fanns +på disken saknas eller har skrivits om, stoppar det att fortsätta +om du inte specificerar detta alternativ. +Detta gör att du enkelt kan upptäcka när ett datafilsystem inte är +monterat. +Detta alternativ kan endast användas med `sync`. +
+
+
+
+
+
+-U, --force-uuid +
+Tvingar den osäkra operationen att synkronisera, kontrollera och fixa +med diskar som har ändrat sin UUID. +Om SnapRAID upptäcker att vissa diskar har ändrat UUID, +stoppar det att fortsätta om du inte specificerar detta alternativ. +Detta gör att du kan upptäcka när dina diskar är monterade på fel +monteringspunkter. +Det är dock tillåtet att ha en enda UUID-ändring med +enkel paritet, och fler med multipel paritet, eftersom detta är +det normala fallet när man byter ut diskar efter en återställning. +Detta alternativ kan endast användas med `sync`, `check` eller +`fix`. +
+
+
+
+
+
+-D, --force-device +
+Tvingar den osäkra operationen att fixa med otillgängliga diskar +eller med diskar på samma fysiska enhet. +Till exempel, om du förlorade två datadisker och har en reservdisk för att återställa +endast den första, kan du ignorera den andra otillgängliga disken. +Eller, om du vill återställa en disk i det lediga utrymme som finns kvar på en +redan använd disk, dela samma fysiska enhet. +Detta alternativ kan endast användas med `fix`. +
+
+
+
+
+
+-N, --force-nocopy +
+I `sync`, `check` och `fix`, inaktiverar heuristiken för kopieringsdetektering. +Utan detta alternativ antar SnapRAID att filer med samma +attribut, såsom namn, storlek och tidsstämpel, är kopior med +samma data. +Detta möjliggör identifiering av kopierade eller flyttade filer från en disk +till en annan och återanvänder den redan beräknade hash-informationen +för att upptäcka tysta fel eller för att återställa saknade filer. +I vissa sällsynta fall kan detta beteende leda till falska positiva +eller en långsam process på grund av många hash-verifieringar, och detta +alternativ låter dig lösa sådana problem. +Detta alternativ kan endast användas med `sync`, `check` och `fix`. +
+
+
+
+
+
+-F, --force-full +
+I `sync`, tvingar en fullständig omberäkning av pariteten. +Detta alternativ kan användas när du lägger till en ny paritetsnivå eller om +du återgick till en gammal content-fil med mer aktuell paritetsdata. +Istället för att återskapa pariteten från grunden låter detta dig +återanvända hasharna som finns i content-filen för att validera data +och bibehålla dataskyddet under `sync`-processen med hjälp av +den befintliga paritetsdatan. +Detta alternativ kan endast användas med `sync`. +
+
+
+
+
+
+-R, --force-realloc +
+I `sync`, tvingar en fullständig omallokering av filer och ombyggnad av pariteten. +Detta alternativ kan användas för att helt omallokera alla filer, +ta bort fragmentering, samtidigt som hasharna som finns i content- +filen återanvänds för att validera data. +Detta alternativ kan endast användas med `sync`. +VARNING! Detta alternativ är endast för experter, och det rekommenderas +starkt att inte använda det. +Du HAR INGET dataskydd under `sync`-operationen. +
+
+
+
+
+
+-l, --log FILE +
+Skriver en detaljerad logg till den specificerade filen. +Om detta alternativ inte specificeras, skrivs oväntade fel ut +på skärmen, vilket potentiellt kan leda till överdriven utdata i händelse av +många fel. När -l, --log specificeras, skrivs endast +fatala fel som får SnapRAID att stoppa ut +på skärmen. +Om sökvägen börjar med '>>', öppnas filen +i tilläggsläge. Förekomster av '%D' och '%T' i namnet ersätts +med datum och tid i formatet YYYYMMDD respektive +HHMMSS. I Windows batch-filer måste du dubblera +'%'-tecknet, t.ex. result-%%D.log. För att använda '>>' måste du +omsluta namnet i citattecken, t.ex. `">>result.log"`. +För att skicka ut loggen till standardutdata eller standardfel, +kan du använda `">&1"` respektive `">&2"`. +Se filen snapraid_log.txt eller man-sidan för beskrivningar av logg-taggar. +
+
+
+
+
+
+-L, --error-limit NUMBER +
+Anger en ny felgräns innan körningen stoppas. +Som standard stoppar SnapRAID om det stöter på mer än 100 +input/output-fel, vilket indikerar att en disk troligen håller på att misslyckas. +Detta alternativ påverkar `sync` och `scrub`, som tillåts +att fortsätta efter den första uppsättningen diskfel för att försöka +slutföra sina operationer. +Däremot stoppar `check` och `fix` alltid vid det första felet. +
+
+
+
+
+
+-S, --start BLKSTART +
+Börjar behandlingen från det specificerade +blocknumret. Detta kan vara användbart för att försöka igen att kontrollera +eller fixa specifika block i händelse av en skadad disk. +Detta alternativ är främst för avancerad manuell återställning. +
+
+
+
+
+
+-B, --count BLKCOUNT +
+Behandlar endast det specificerade antalet block. +Detta alternativ är främst för avancerad manuell återställning. +
+
+
+
+
+
+-C, --gen-conf CONTENT +
+Genererar en dummy-konfigurationsfil från en befintlig +content-fil. +Konfigurationsfilen skrivs till standardutdata +och skriver inte över en befintlig fil. +Denna konfigurationsfil innehåller också den information +som behövs för att rekonstruera diskmonteringspunkterna om du +förlorar hela systemet. +
+
+
+
+
+
+-v, --verbose +
+Skriver ut mer information på skärmen. +Om det specificeras en gång, skrivs exkluderade filer +och ytterligare statistik ut. +Detta alternativ har ingen effekt på loggfilerna. +
+
+
+
+
+
+-q, --quiet +
+Skriver ut mindre information på skärmen. +Om det specificeras en gång, tas förloppsindikatorn bort; två gånger, +de pågående operationerna; tre gånger, informations- +meddelandena; fyra gånger, statusmeddelandena. +Fatala fel skrivs alltid ut på skärmen. +Detta alternativ har ingen effekt på loggfilerna. +
+
+
+
+
+
+-H, --help +
+Skriver ut en kort hjälpskärm. +
+
+
+
+
+
+-V, --version +
+Skriver ut programversionen. +
+
+
+
+
+

+Konfiguration +

+

SnapRAID kräver en konfigurationsfil för att veta var din disk-array +finns och var paritetsinformationen ska lagras. +

I Unix används filen `/usr/local/etc/snapraid.conf` om den finns, +annars `/etc/snapraid.conf`. +I Windows används filen `snapraid.conf` i samma +katalog som `snapraid.exe`. +

Den måste innehålla följande alternativ (skiftlägeskänsligt): +

+

+parity FIL [,FIL] ... +

+

Definierar de filer som ska användas för att lagra paritetsinformationen. +Pariteten möjliggör skydd från ett enda disk- +fel, liknande RAID5. +

Du kan specificera flera filer, som måste finnas på olika diskar. +När en fil inte kan växa mer, används nästa fil. +Det totala tillgängliga utrymmet måste vara minst lika stort som den största datadisken i +arrayen. +

Du kan lägga till ytterligare paritetsfiler senare, men du +kan inte ändra ordning på eller ta bort dem. +

Att hålla paritetsdiskarna reserverade för paritet säkerställer att +de inte blir fragmenterade, vilket förbättrar prestandan. +

I Windows lämnas 256 MB oanvänt på varje disk för att undvika +varningen om fulla diskar. +

Detta alternativ är obligatoriskt och kan endast användas en gång. +

+
+

+(2,3,4,5,6)-parity FIL [,FIL] ... +

+

Definierar de filer som ska användas för att lagra extra paritetsinformation. +

För varje paritetsnivå som specificeras aktiveras en ytterligare skyddsnivå: +

    +
  • +2-parity möjliggör RAID6 dubbel paritet. +
  • +
  • +3-parity möjliggör trippel paritet. +
  • +
  • +4-parity möjliggör fyrdubbel (fyra) paritet. +
  • +
  • +5-parity möjliggör penta (fem) paritet. +
  • +
  • +6-parity möjliggör hexa (sex) paritet. +
  • +
+

Varje paritetsnivå kräver närvaro av alla föregående paritets- +nivåer. +

Samma överväganden som för alternativet 'parity' gäller. +

Dessa alternativ är valfria och kan endast användas en gång. +

+
+

+z-parity FIL [,FIL] ... +

+

Definierar en alternativ fil och ett format för att lagra trippel paritet. +

Detta alternativ är ett alternativ till '3-parity', främst avsett för +lågpresterande processorer som ARM eller AMD Phenom, Athlon och Opteron som inte +stöder SSSE3-instruktionsuppsättningen. I sådana fall ger det +bättre prestanda. +

Detta format liknar, men är snabbare än, det som används av ZFS RAIDZ3. +Liksom ZFS fungerar det inte utöver trippel paritet. +

När du använder '3-parity' kommer du att varnas om det rekommenderas att använda +formatet 'z-parity' för prestandaförbättring. +

Det är möjligt att konvertera från ett format till ett annat genom att justera +konfigurationsfilen med önskad z-parity eller 3-parity fil +och använda 'fix' för att återskapa den. +

+
+

+content FIL +

+

Definierar den fil som ska användas för att lagra listan och checksummorna för alla +filer som finns i din disk-array. +

Den kan placeras på en disk som används för data, paritet eller +någon annan tillgänglig disk. +Om du använder en datadisk exkluderas denna fil automatiskt +från `sync`-processen. +

Detta alternativ är obligatoriskt och kan användas flera gånger för att spara +flera kopior av samma fil. +

Du måste lagra minst en kopia för varje paritetsdisk som används +plus en. Att använda ytterligare kopior skadar inte. +

+
+

+data NAMN KATALOG +

+

Definierar namnet och monteringspunkten för datadiskarna i +arrayen. NAMN används för att identifiera disken och måste +vara unikt. KATALOG är monteringspunkten för disken i +filsystemet. +

Du kan ändra monteringspunkten vid behov, så länge +du behåller NAMN fixerat. +

Du bör använda ett alternativ för varje datadisk i arrayen. +

Du kan byta namn på en disk senare genom att ändra NAMN direkt +i konfigurationsfilen och sedan köra ett 'sync'-kommando. +I händelse av namnbyte görs associationen med hjälp av den lagrade +UUID:n för diskarna. +

+
+

+nohidden +

+

Exkluderar alla dolda filer och kataloger. +I Unix är dolda filer de som börjar med `.`. +I Windows är de de med det dolda attributet. +

+
+

+exclude/include MÖNSTER +

+

Definierar fil- eller katalogmönstren att exkludera eller inkludera +i sync-processen. +Alla mönster behandlas i den specificerade ordningen. +

Om det första mönstret som matchar är ett `exclude`-mönster, +exkluderas filen. Om det är ett `include`-mönster, inkluderas filen. +Om inget mönster matchar, exkluderas filen om det sista mönstret +som specificerats är ett `include`-mönster, eller inkluderas om det sista mönstret +som specificerats är ett `exclude`-mönster. +

Se avsnittet MÖNSTER för mer information om mönster- +specifikationer. +

Detta alternativ kan användas flera gånger. +

+
+

+blocksize STORLEK_I_KIBIBYTES +

+

Definierar den grundläggande blockstorleken i kibibytes för pariteten. +En kibibyte är 1024 byte. +

Standard blockstorlek är 256, vilket bör fungera för de flesta fall. +

VARNING! Detta alternativ är endast för experter, och det rekommenderas +starkt att inte ändra detta värde. För att ändra detta värde i framtiden, +kommer du att behöva återskapa hela pariteten! +

En anledning att använda en annan blockstorlek är om du har många små +filer, i storleksordningen miljoner. +

För varje fil, även om den bara är några byte, allokeras ett helt block paritet, +och med många filer kan detta leda till betydande oanvänt paritetsutrymme. +När du helt fyller paritetsdisken, är du inte +tillåten att lägga till fler filer på datadiskarna. +Det bortkastade paritetsutrymmet ackumuleras dock inte över datadiskar. +Bortkastat utrymme som härrör från ett högt antal filer på en datadisk begränsar endast +mängden data på den datadisken, inte andra. +

Som en approximation kan du anta att hälften av blockstorleken är +bortkastad för varje fil. Till exempel, med 100 000 filer och en 256 KiB +blockstorlek, kommer du att slösa 12,8 GB paritet, vilket kan resultera +i 12,8 GB mindre utrymme tillgängligt på datadisken. +

Du kan kontrollera mängden bortkastat utrymme på varje disk med hjälp av `status`. +Detta är mängden utrymme du måste lämna ledigt på data- +diskarna eller använda för filer som inte ingår i arrayen. +Om detta värde är negativt betyder det att du är nära att fylla +pariteten, och det representerar det utrymme du fortfarande kan slösa. +

För att undvika detta problem kan du använda en större partition för paritet. +Om till exempel paritetspartitionen är 12,8 GB större än datadiskarna, +har du tillräckligt med extra utrymme för att hantera upp till 100 000 +filer på varje datadisk utan något bortkastat utrymme. +

Ett trick för att få en större paritetspartition i Linux är att formatera den +med kommandot: +

+mkfs.ext4 -m 0 -T largefile4 DEVICE
+
+

Detta resulterar i cirka 1,5% extra utrymme, ungefär 60 GB för +en 4 TB-disk, vilket möjliggör cirka 460 000 filer på varje datadisk utan +något bortkastat utrymme. +

+
+

+hashsize STORLEK_I_BYTE +

+

Definierar hash-storleken i byte för de sparade blocken. +

Standard hash-storlek är 16 byte (128 bitar), vilket bör fungera +för de flesta fall. +

VARNING! Detta alternativ är endast för experter, och det rekommenderas +starkt att inte ändra detta värde. För att ändra detta värde i framtiden, +kommer du att behöva återskapa hela pariteten! +

En anledning att använda en annan hash-storlek är om ditt system har +begränsat minne. Som en tumregel kräver SnapRAID vanligtvis +1 GiB RAM för varje 16 TB data i arrayen. +

Specifikt, för att lagra hasharna av datan, kräver SnapRAID +ungefär TS*(1+HS)/BS byte RAM, +där TS är den totala storleken i byte av din disk-array, BS är +blockstorleken i byte och HS är hash-storleken i byte. +

Till exempel, med 8 diskar på 4 TB, en blockstorlek på 256 KiB +(1 KiB = 1024 byte) och en hash-storlek på 16, får du: +

+RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1,93 GiB
+
+

Om du byter till en hash-storlek på 8 får du: +

+RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1,02 GiB
+
+

Om du byter till en blockstorlek på 512 får du: +

+RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0,96 GiB
+
+

Om du byter till både en hash-storlek på 8 och en blockstorlek på 512 får du: +

+RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0,51 GiB
+
+
+
+

+autosave STORLEK_I_GIGABYTES +

+

Sparar automatiskt tillståndet vid synkronisering eller skrubbning efter att den +specificerade mängden GB har behandlats. +Detta alternativ är användbart för att undvika att starta om långa `sync`- +kommandon från början om de avbryts av en maskinkrasch eller någon annan händelse. +

+
+

+temp_limit TEMPERATUR_CELSIUS +

+

Anger den maximalt tillåtna disk-temperaturen i Celsius. När den specificeras, +kontrollerar SnapRAID periodiskt temperaturen på alla diskar med hjälp av +verktyget smartctl. De aktuella disk-temperaturerna visas medan +SnapRAID är igång. Om någon disk överskrider denna gräns, stoppas alla operationer +och diskarna snurras ner (sätts i standby) under den tid +som definieras av alternativet `temp_sleep`. Efter viloperioden återupptas operationerna, +och kan potentiellt pausas igen om temperaturgränsen nås +ännu en gång. +

Under drift analyserar SnapRAID också värmekurvan för varje +disk och uppskattar den långsiktiga stabila temperaturen de förväntas +nå om aktiviteten fortsätter. Uppskattningen utförs först efter att +disk-temperaturen har ökat fyra gånger, vilket säkerställer att tillräckligt med +datapoäng finns tillgängliga för att fastställa en pålitlig trend. +Denna förutsagda stabila temperatur visas inom parentes bredvid den +aktuella värdet och hjälper till att bedöma om systemets kylning är +tillräcklig. Denna uppskattade temperatur är endast för informationssyfte +och har ingen effekt på SnapRAIDs beteende. Programmens +åtgärder baseras enbart på de faktiska uppmätta disk-temperaturerna. +

För att utföra denna analys behöver SnapRAID en referens för system- +temperaturen. Det försöker först läsa den från tillgängliga hårdvaru- +sensorer. Om ingen system-sensor kan nås, används den lägsta disk- +temperaturen som mättes vid start av körningen som en reservreferens. +

Normalt visar SnapRAID endast temperaturen på den hetaste disken. +För att visa temperaturen på alla diskar, använd alternativet -A eller --stats. +

+
+

+temp_sleep TID_I_MINUTER +

+

Anger standby-tiden, i minuter, när temperaturgränsen har +nåtts. Under denna period förblir diskarna nedsnurrade. Standard +är 5 minuter. +

+
+

+pool KATALOG +

+

Definierar poolningskatalogen där den virtuella vyn av disk- +arrayen skapas med hjälp av kommandot `pool`. +

Katalogen måste redan existera. +

+
+

+share UNC_KATALOG +

+

Definierar Windows UNC-sökvägen som krävs för att få åtkomst till diskarna på distans. +

Om detta alternativ specificeras, använder de symboliska länkarna som skapats i pool- +katalogen denna UNC-sökväg för att få åtkomst till diskarna. +Utan detta alternativ använder de genererade symboliska länkarna endast lokala sökvägar, +vilket inte tillåter delning av pool-katalogen över nätverket. +

De symboliska länkarna bildas med hjälp av den specificerade UNC-sökvägen, lägger till +disk-namnet som specificeras i `data`-alternativet, och lägger slutligen till filens +katalog och namn. +

Detta alternativ krävs endast för Windows. +

+
+

+smartctl DISK/PARITY ALTERNATIV... +

+

Definierar anpassade smartctl-alternativ för att få SMART-attributen för +varje disk. Detta kan krävas för RAID-kontroller och vissa USB- +diskar som inte kan upptäckas automatiskt. Platsinnehavaren %s ersätts av +enhetens namn, men är valfri för fixerade enheter som RAID-kontroller. +

DISK är samma disk-namn som specificeras i `data`-alternativet. +PARITY är ett av paritetsnamnen: `parity`, `2-parity`, `3-parity`, +`4-parity`, `5-parity`, `6-parity` eller `z-parity`. +

I de specificerade ALTERNATIVEN ersätts strängen `%s` med +enhetens namn. För RAID-kontroller är enheten +sannolikt fixerad, och du kanske inte behöver använda `%s`. +

Se smartmontools dokumentation för möjliga alternativ: +

+https://www.smartmontools.org/wiki/Supported_RAID-Controllers
+https://www.smartmontools.org/wiki/Supported_USB-Devices
+
+

Till exempel: +

+smartctl parity -d sat %s
+
+
+
+

+smartignore DISK/PARITY ATTR [ATTR...] +

+

Ignorerar det specificerade SMART-attributet vid beräkning av sannolikheten +för diskfel. Detta alternativ är användbart om en disk rapporterar ovanliga eller +vilseledande värden för ett visst attribut. +

DISK är samma disk-namn som specificeras i `data`-alternativet. +PARITY är ett av paritetsnamnen: `parity`, `2-parity`, `3-parity`, +`4-parity`, `5-parity`, `6-parity` eller `z-parity`. +Det speciella värdet * kan användas för att ignorera attributet på alla diskar. +

Till exempel, för att ignorera attributet `Current Pending Sector Count` på +alla diskar: +

+smartignore * 197
+
+

För att ignorera det endast på den första paritetsdisken: +

+smartignore parity 197
+
+
+
+

+Exempel +

+

Ett exempel på en typisk konfiguration för Unix är: +

+parity /mnt/diskp/snapraid.parity
+content /mnt/diskp/snapraid.content
+content /var/snapraid/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+exclude /lost+found/
+exclude /tmp/
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/sg0
+smartctl 2-parity -d areca,2/1 /dev/sg0
+
+

Ett exempel på en typisk konfiguration för Windows är: +

+parity E:\snapraid.parity
+content E:\snapraid.content
+content C:\snapraid\snapraid.content
+data d1 G:\array\
+data d2 H:\array\
+data d3 I:\array\
+exclude Thumbs.db
+exclude \$RECYCLE.BIN
+exclude \System Volume Information
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/arcmsr0
+smartctl 2-parity -d areca,2/1 /dev/arcmsr0
+
+
+
+
+

+Mönster (Pattern) +

+

Mönster ger ett flexibelt sätt att filtrera filer för inkludering eller +exkludering. Genom att använda jokertecken kan du definiera regler som +matchar specifika filnamn eller hela katalogstrukturer utan att +lista varje sökväg manuellt. +

Frågetecknet `?` matchar valfritt enskilt tecken utom katalogavgränsaren. +Detta gör det användbart för att matcha filnamn med variabla tecken +samtidigt som mönstret hålls begränsat till en enda katalognivå. +

Den enkla stjärnan `*` matchar valfri teckensekvens, men precis som +frågetecknet korsar den aldrig kataloggränser. Den stannar vid +snedstrecket, vilket gör den lämplig för matchning inom en enskild +sökvägskomponent. Detta är det standardbeteende för jokertecken som är +bekant från skal-globbing. +

Den dubbla stjärnan `**` är mer kraftfull; den matchar valfri teckensekvens +inklusive katalogavgränsare. Detta gör att mönster kan matcha över +flera katalognivåer. När `**` förekommer direkt i ett mönster kan det +matcha noll eller fler tecken inklusive snedstreck mellan den +omkringliggande bokstavliga texten. +

Den viktigaste användningen av `**` är i den speciella formen `/**/`. Detta matchar +noll eller flera kompletta katalognivåer, vilket gör det möjligt att matcha filer +på valfritt djup i ett katalogträd utan att känna till den exakta sökvägsstrukturen. +Till exempel matchar mönstret `src/**/main.js` filerna `src/main.js` (hoppar över +noll kataloger), `src/ui/main.js` (hoppar över en katalog) och +`src/ui/components/main.js` (hoppar över två kataloger). +

Teckenklasser som använder hakparenteser `[]` matchar ett enskilt tecken från en +angiven uppsättning eller ett intervall. Precis som de andra mönstren för enskilda +tecken matchar de inte katalogavgränsare. Klasser stöder intervall och +negering med ett utropstecken. +

Den grundläggande skillnaden att komma ihåg är att `*`, `?` och teckenklasser +alla respekterar kataloggränser och endast matchar inom en enskild +sökvägskomponent, medan `**` är det enda mönstret som kan matcha över +katalogavgränsare. +

Det finns fyra olika typer av mönster: +

+
+
+FILE +
+Väljer valfri fil med namnet FILE. +Detta mönster gäller endast filer, inte kataloger. +
+
+
+
+
+
+DIR/ +
+Väljer valfri katalog med namnet DIR och allt innehåll. +Detta mönster gäller endast kataloger, inte filer. +
+
+
+
+
+
+/PATH/FILE +
+Väljer den exakt angivna filsökvägen. Detta mönster gäller +endast filer, inte kataloger. +
+
+
+
+
+
+/PATH/DIR/ +
+Väljer den exakt angivna katalogsökvägen och allt innehåll. +Detta mönster gäller endast kataloger, inte filer. +
+
+
+

När du specificerar en absolut sökväg som börjar med /, tillämpas den vid +array-rotkatalogen, inte den lokala filsystemets rotkatalog. +

I Windows kan du använda bakåtsnedstrecket \ istället för framåtsnedstrecket /. +Windows systemkataloger, junction points, monteringspunkter och andra Windows +speciella kataloger behandlas som filer, vilket innebär att för att exkludera +dem måste du använda en fil-regel, inte en katalog-regel. +

Om filnamnet innehåller tecknet '*', '?', '[', +eller ']', måste du undvika det för att förhindra att det tolkas som ett +globbing-tecken. I Unix är undvikande-tecknet '\'; i Windows är det '^'. +När mönstret är på kommandoraden måste du dubbla undvikande- +tecknet för att förhindra att det tolkas av kommandoskalet. +

I konfigurationsfilen kan du använda olika strategier för att filtrera +filerna som ska behandlas. +Det enklaste tillvägagångssättet är att endast använda `exclude`-regler för att ta bort alla +filer och kataloger du inte vill behandla. Till exempel: +

+# Exkluderar alla filer som heter `*.unrecoverable`
+exclude *.unrecoverable
+# Exkluderar rotkatalogen `/lost+found`
+exclude /lost+found/
+# Exkluderar alla underkataloger som heter `tmp`
+exclude tmp/
+
+

Det motsatta tillvägagångssättet är att definiera endast de filer du vill behandla, med +endast `include`-regler. Till exempel: +

+# Inkluderar endast vissa kataloger
+include /movies/
+include /musics/
+include /pictures/
+
+

Det sista tillvägagångssättet är att blanda `exclude`- och `include`-regler. I detta fall +är ordningen på reglerna viktig. Tidigare regler har +företräde framför senare. +För att förenkla kan du lista alla `exclude`-regler först och sedan +alla `include`-regler. Till exempel: +

+# Exkluderar alla filer som heter `*.unrecoverable`
+exclude *.unrecoverable
+# Exkluderar alla underkataloger som heter `tmp`
+exclude tmp/
+# Inkluderar endast vissa kataloger
+include /movies/
+include /musics/
+include /pictures/
+
+

På kommandoraden, med hjälp av alternativet -f, kan du bara använda `include`- +mönster. Till exempel: +

+# Kontrollerar endast .mp3-filerna.
+# I Unix, använd citattecken för att undvika globbing-expansion av skalet.
+snapraid -f "*.mp3" check
+
+

I Unix, när du använder globbing-tecken på kommandoraden, måste du +citattecken dem för att förhindra att skalet expanderar dem. +

+
+

+Ignorera filer (Ignore File) +

+

Utöver de globala reglerna i konfigurationsfilen kan du placera +`.snapraidignore`-filer i vilken katalog som helst i arrayen för att definiera +decentraliserade exkluderingsregler. +

Regler som definieras i `.snapraidignore` tillämpas efter reglerna i +konfigurationsfilen. Detta innebär att de har högre prioritet och kan +användas för att exkludera filer som tidigare inkluderats av den globala +konfigurationen. I praktiken innebär det att om en lokal regel matchar, så +exkluderas filen oavsett de globala inkluderingsinställningarna. +

Mönsterlogiken i `.snapraidignore` speglar den globala konfigurationen men +förankrar mönstren till den katalog där filen finns: +

+
+
+FILE +
+Väljer alla filer med namnet FILE i denna katalog eller under. +Detta följer samma globbing-regler som det globala mönstret. +
+
+
+
+
+
+DIR/ +
+Väljer alla kataloger med namnet DIR och allt innehåll, som finns +i denna katalog eller under. +
+
+
+
+
+
+/PATH/FILE +
+Väljer den exakt angivna filen relativt platsen för +`.snapraidignore`-filen. +
+
+
+
+
+
+/PATH/DIR/ +
+Väljer den exakt angivna katalogen och allt innehåll, relativt +platsen för `.snapraidignore`-filen. +
+
+
+

Till skillnad från den globala konfigurationen stöder `.snapraidignore`-filer +endast exkluderingsregler; du kan inte använda `include`-mönster eller negation (!). +

Till exempel, om du har en `.snapraidignore` i `/mnt/disk1/projects/`: +

+# Exkluderar ENDAST /mnt/disk1/projects/output.bin
+/output.bin
+# Exkluderar alla kataloger med namnet 'build' inuti projects/
+build/
+# Exkluderar alla .tmp-filer inuti projects/ eller dess undermappar
+*.tmp
+
+
+
+

+Innehåll (Content) +

+

SnapRAID lagrar listan och checksummorna för dina filer i content-filen. +

Det är en binär fil som listar alla filer som finns i din disk-array, +tillsammans med alla checksummor för att verifiera deras integritet. +

Denna fil läses och skrivs av kommandona `sync` och `scrub` och +läses av kommandona `fix`, `check` och `status`. +

+
+

+Paritet (Parity) +

+

SnapRAID lagrar paritetsinformationen för din array i parity- +filerna. +

Dessa är binära filer som innehåller den beräknade pariteten för alla +block definierade i `content`-filen. +

Dessa filer läses och skrivs av kommandona `sync` och `fix` och +läses endast av kommandona `scrub` och `check`. +

+
+

+Kodning +

+

SnapRAID i Unix ignorerar all kodning. Det läser och lagrar +filnamnen med samma kodning som används av filsystemet. +

I Windows konverteras alla namn som läses från filsystemet och +behandlas i UTF-8-format. +

För att få filnamn utskrivna korrekt måste du ställa in Windows- +konsolen till UTF-8-läge med kommandot `chcp 65001` och använda +ett TrueType-typsnitt som `Lucida Console` som konsoltypsnitt. +Detta påverkar endast de utskrivna filnamnen; om du +omdirigerar konsolutdata till en fil, är den resulterande filen alltid +i UTF-8-format. +

+
+

+Upphovsrätt (Copyright) +

+

Denna fil är Copyright (C) 2025 Andrea Mazzoleni +

+
+

+Se Även (See Also) +

+

snapraid_log(1), snapraidd(1) +

+ + +
+
+
+ + + + + + + diff --git a/beta/manual-uk.html b/beta/manual-uk.html new file mode 100644 index 00000000..837bcc10 --- /dev/null +++ b/beta/manual-uk.html @@ -0,0 +1,2196 @@ + + + + + + + + SnapRAID Manual + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + +
+ +
+ +
+

+Короткий опис +

+
+snapraid [-c, --conf CONFIG]
+    [-f, --filter PATTERN] [-d, --filter-disk NAME]
+    [-m, --filter-missing] [-e, --filter-error]
+    [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR]
+    [-p, --plan PERC|bad|new|full]
+    [-o, --older-than DAYS] [-l, --log FILE]
+    [-s, --spin-down-on-error] [-w, --bw-limit RATE]
+    [-Z, --force-zero] [-E, --force-empty]
+    [-U, --force-uuid] [-D, --force-device]
+    [-N, --force-nocopy] [-F, --force-full]
+    [-R, --force-realloc]
+    [-S, --start BLKSTART] [-B, --count BLKCOUNT]
+    [-L, --error-limit NUMBER]
+    [-A, --stats]
+    [-v, --verbose] [-q, --quiet]
+    status|smart|probe|up|down|diff|sync|scrub|fix|check
+    |list|dup|pool|devices|touch|rehash
+
+
+snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT]
+
+
+
+

+Опис +

+

SnapRAID — це програма резервного копіювання, розроблена для +дискових масивів, яка зберігає інформацію парності для +відновлення даних у випадку відмови до шести дисків. +

В першу чергу призначена для домашніх медіацентрів з великими +файлами, що рідко змінюються, SnapRAID пропонує кілька функцій: +

    +
  • +Ви можете використовувати диски, вже заповнені файлами, без +необхідності їх переформатування, отримуючи доступ до них +як зазвичай. +
  • +
  • +Усі ваші дані хешуються для забезпечення цілісності даних +та запобігання прихованому пошкодженню. +
  • +
  • +Коли кількість дисків, що відмовили, перевищує кількість +дисків парності, втрата даних обмежується дисками, що +постраждали; дані на інших дисках залишаються доступними. +
  • +
  • +Якщо ви випадково видалили файли на диску, можливе +відновлення. +
  • +
  • +Диски можуть мати різний розмір. +
  • +
  • +Ви можете додавати диски в будь-який час. +
  • +
  • +SnapRAID не блокує ваші дані; ви можете припинити його +використання в будь-який час без переформатування або +переміщення даних. +
  • +
  • +Для доступу до файлу потрібно розкрутити лише один диск, що +заощаджує електроенергію та зменшує шум. +
  • +
+

Для отримання додаткової інформації відвідайте офіційний сайт +SnapRAID: +

+https://www.snapraid.it/
+
+
+
+

+Обмеження +

+

SnapRAID є гібридом між RAID та програмою резервного копіювання, +прагнучи поєднати найкращі переваги обох. Однак, він має деякі +обмеження, які слід врахувати перед його використанням. +

Основне обмеження полягає в тому, що якщо диск виходить з ладу, +а ви нещодавно не виконували синхронізацію, ви можете не +змогти повністю відновити дані. +Конкретніше, ви можете втратити можливість відновлення даних +обсягом до розміру змінених або видалених файлів з моменту +останньої операції синхронізації. +Це відбувається, навіть якщо змінені або видалені файли не +знаходяться на диску, що вийшов з ладу. Ось чому SnapRAID +краще підходить для даних, які рідко змінюються. +

З іншого боку, щойно додані файли не перешкоджають відновленню +вже існуючих файлів. Ви втратите лише нещодавно додані файли, +якщо вони знаходяться на диску, що вийшов з ладу. +

Інші обмеження SnapRAID: +

    +
  • +З SnapRAID у вас все ще є окремі файлові системи для +кожного диска. З RAID ви отримуєте одну велику файлову +систему. +
  • +
  • +SnapRAID не використовує чергування (striping) даних. +З RAID ви отримуєте прискорення завдяки чергуванню. +
  • +
  • +SnapRAID не підтримує відновлення в реальному часі. +З RAID вам не потрібно припиняти роботу, коли диск +виходить з ладу. +
  • +
  • +SnapRAID може відновлювати дані лише з обмеженої кількості +дисків, що вийшли з ладу. З резервним копіюванням ви +можете відновити дані навіть після повної відмови +всього дискового масиву. +
  • +
  • +Зберігаються лише імена файлів, часові мітки, символічні +та жорсткі посилання. Права доступу, власність та +розширені атрибути не зберігаються. +
  • +
+
+
+

+Початок роботи +

+

Щоб використовувати SnapRAID, спершу потрібно вибрати один диск +у вашому дисковому масиві, щоб присвятити його інформації +`парності`. З одним диском для парності ви зможете відновити +дані після відмови одного диска, подібно до RAID5. +

Якщо ви хочете відновити дані після більшої кількості +дисків, що відмовили, подібно до RAID6, ви повинні зарезервувати +додаткові диски для парності. Кожен додатковий диск парності +дозволяє відновити дані після відмови ще одного диска. +

Як диски парності ви повинні вибрати найбільші диски в масиві, +оскільки інформація парності може зрости до розміру найбільшого +диска даних у масиві. +

Ці диски будуть присвячені зберіганню файлів `парності`. Ви +не повинні зберігати на них свої дані. +

Потім ви повинні визначити диски `даних`, які ви хочете +захистити за допомогою SnapRAID. Захист є більш ефективним, +якщо ці диски містять дані, що рідко змінюються. З цієї причини +краще НЕ включати диск Windows C:\ або каталоги Unix /home, +/var та /tmp. +

Список файлів зберігається у файлах `content` (вміст), які +зазвичай зберігаються на дисках даних, парності або завантажувальних +дисках. +Цей файл містить деталі вашої резервної копії, включаючи +всі контрольні суми для перевірки її цілісності. +Файл `content` зберігається в кількох копіях, і кожна копія +повинна бути на окремому диску, щоб гарантувати, що навіть у +разі відмови кількох дисків, принаймні одна копія буде доступна. +

Наприклад, припустимо, вас цікавить лише один рівень захисту +парності, а ваші диски розташовані за адресами: +

+/mnt/diskp <- вибраний диск для парності
+/mnt/disk1 <- перший диск для захисту
+/mnt/disk2 <- другий диск для захисту
+/mnt/disk3 <- третій диск для захисту
+
+

Ви повинні створити конфігураційний файл /etc/snapraid.conf з +наступними опціями: +

+parity /mnt/diskp/snapraid.parity
+content /var/snapraid/snapraid.content
+content /mnt/disk1/snapraid.content
+content /mnt/disk2/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+
+

Якщо ви працюєте в Windows, ви повинні використовувати формат +шляху Windows, з літерами дисків та зворотними скісними рисками +замість прямих. +

+parity E:\snapraid.parity
+content C:\snapraid\snapraid.content
+content F:\array\snapraid.content
+content G:\array\snapraid.content
+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+
+

Якщо у вас багато дисків і закінчилися літери дисків, ви можете +монтувати диски безпосередньо у вкладені папки. Див: +

+https://www.google.com/search?q=Windows+mount+point
+
+

На цьому етапі ви готові запустити команду `sync` для побудови +інформації парності. +

+snapraid sync
+
+

Цей процес може зайняти кілька годин вперше, залежно від розміру +даних, які вже є на дисках. Якщо диски порожні, процес +відбувається миттєво. +

Ви можете зупинити його в будь-який час, натиснувши Ctrl+C, +і під час наступного запуску він відновить роботу з місця, +де був перерваний. +

Коли ця команда завершиться, ваші дані БЕЗПЕЧНІ. +

Тепер ви можете почати використовувати свій масив як вам подобається +і періодично оновлювати інформацію парності, запускаючи команду `sync`. +

+

+Скрабування (Scrubbing) +

+

Щоб періодично перевіряти дані та парність на наявність помилок, +ви можете запустити команду `scrub`. +

+snapraid scrub
+
+

Ця команда порівнює дані у вашому масиві з хешем, обчисленим +під час команди `sync`, для перевірки цілісності. +

Кожен запуск команди перевіряє приблизно 8% масиву, виключаючи +дані, які вже були скрабовані протягом попередніх 10 днів. +Ви можете використовувати опцію -p, --plan, щоб вказати іншу +кількість, і опцію -o, --older-than, щоб вказати інший вік +у днях. +Наприклад, щоб перевірити 5% масиву на блоки старші за 20 днів, +використовуйте: +

+snapraid -p 5 -o 20 scrub
+
+

Якщо під час процесу виявлено приховані помилки або помилки +введення/виведення, відповідні блоки позначаються як погані у +файлі `content` і перераховуються у команді `status`. +

+snapraid status
+
+

Щоб їх виправити, ви можете використовувати команду `fix`, +фільтруючи погані блоки за допомогою опції -e, --filter-error: +

+snapraid -e fix
+
+

Під час наступного `scrub` помилки зникнуть зі звіту `status`, +якщо вони справді виправлені. Щоб зробити це швидше, ви можете +використовувати -p bad, щоб скрабувати лише блоки, позначені +як погані. +

+snapraid -p bad scrub
+
+

Запуск `scrub` на несинхронізованому масиві може повідомити +про помилки, спричинені видаленими або зміненими файлами. +Ці помилки відображаються у виведенні `scrub`, але пов'язані +блоки не позначаються як погані. +

+
+

+Об'єднання (Pooling) +

+

Примітка: Функція об'єднання, описана нижче, була замінена +інструментом mergefs, який тепер є рекомендованою опцією для +користувачів Linux у спільноті SnapRAID. Mergefs забезпечує +більш гнучкий та ефективний спосіб об'єднання кількох дисків +в єдину уніфіковану точку монтування, дозволяючи безперешкодний +доступ до файлів у вашому масиві без використання символічних +посилань. Він добре інтегрується з SnapRAID для захисту +парності і зазвичай використовується в налаштуваннях, таких +як OpenMediaVault (OMV) або користувацьких конфігураціях NAS. +

Щоб відобразити всі файли у вашому масиві в одному дереві +каталогів, ви можете ввімкнути функцію `pooling` (об'єднання). +Вона створює віртуальне представлення всіх файлів у вашому +масиві лише для читання, використовуючи символічні посилання. +

Ви можете налаштувати каталог `pooling` у конфігураційному +файлі за допомогою: +

+pool /pool
+
+

або, якщо ви працюєте в Windows, за допомогою: +

+pool C:\pool
+
+

а потім запустити команду `pool` для створення або оновлення +віртуального представлення. +

+snapraid pool
+
+

Якщо ви використовуєте платформу Unix і хочете надати спільний +доступ до цього каталогу через мережу для машин Windows або +Unix, ви повинні додати наступні опції до вашого +/etc/samba/smb.conf: +

+# У глобальному розділі smb.conf
+unix extensions = no
+
+
+# У розділі спільного доступу smb.conf
+[pool]
+comment = Pool
+path = /pool
+read only = yes
+guest ok = yes
+wide links = yes
+follow symlinks = yes
+
+

У Windows спільний доступ до символічних посилань через мережу +вимагає від клієнтів віддаленого їх розпізнавання. Щоб +увімкнути це, окрім спільного доступу до каталогу pool, ви +також повинні надати спільний доступ до всіх дисків незалежно, +використовуючи імена дисків, визначені у конфігураційному +файлі, як точки спільного доступу. Ви також повинні вказати у +опції `share` конфігураційного файлу шлях Windows UNC, який +потрібен віддаленим клієнтам для доступу до цих спільних дисків. +

Наприклад, працюючи з сервера з іменем `darkstar`, ви можете +використовувати опції: +

+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+pool C:\pool
+share \\darkstar
+
+

і надати спільний доступ до наступних каталогів через мережу: +

+\\darkstar\pool -> C:\pool
+\\darkstar\d1 -> F:\array
+\\darkstar\d2 -> G:\array
+\\darkstar\d3 -> H:\array
+
+

щоб дозволити віддаленим клієнтам отримати доступ до всіх файлів +за адресою \\darkstar\pool. +

Вам також може знадобитися налаштувати віддалені клієнти, щоб +увімкнути доступ до віддалених символічних посилань за допомогою +команди: +

+fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
+
+
+
+

+Відновлення видалених файлів (Undeleting) +

+

SnapRAID функціонує більше як програма резервного копіювання, +ніж система RAID, і його можна використовувати для відновлення +або повернення файлів до їх попереднього стану за допомогою +опції -f, --filter: +

+snapraid fix -f FILE
+
+

або для каталогу: +

+snapraid fix -f DIR/
+
+

Ви також можете використовувати його для відновлення лише випадково +видалених файлів усередині каталогу за допомогою опції -m, +--filter-missing, яка відновлює лише відсутні файли, +залишаючи всі інші недоторканими. +

+snapraid fix -m -f DIR/
+
+

Або для відновлення всіх видалених файлів на всіх дисках за допомогою: +

+snapraid fix -m
+
+
+
+

+Відновлення (Recovering) +

+

Сталося найгірше, і ви втратили один або кілька дисків! +

НЕ ПАНІКУЙТЕ! Ви зможете їх відновити! +

Перше, що ви повинні зробити, це уникнути подальших змін у +вашому дисковому масиві. Вимкніть будь-які віддалені +підключення до нього та будь-які заплановані процеси, +включаючи будь-яку заплановану нічну синхронізацію або +скрабування SnapRAID. +

Потім виконайте наступні кроки. +

+

+КРОК 1 -> Переналаштування +

+

Вам потрібен деякий простір для відновлення, в ідеалі на +додаткових запасних дисках, але зовнішній USB-диск або +віддалений диск підійде. +

Змініть конфігураційний файл SnapRAID, щоб опція `data` або +`parity` диска, що вийшов з ладу, вказувала на місце розташування +з достатньою кількістю вільного місця для відновлення файлів. +

Наприклад, якщо диск `d1` вийшов з ладу, змініть з: +

+data d1 /mnt/disk1/
+
+

на: +

+data d1 /mnt/new_spare_disk/
+
+

Якщо диск, який потрібно відновити, є диском парності, оновіть +відповідну опцію `parity`. +Якщо у вас кілька дисків, що вийшли з ладу, оновіть усі їхні +конфігураційні опції. +

+
+

+КРОК 2 -> Виправлення (Fix) +

+

Запустіть команду fix, зберігаючи журнал у зовнішньому файлі +за допомогою: +

+snapraid -d NAME -l fix.log fix
+
+

Де NAME — це ім'я диска, наприклад `d1` у нашому попередньому +прикладі. +Якщо диск, який потрібно відновити, є диском парності, +використовуйте імена `parity`, `2-parity`, тощо. +Якщо у вас кілька дисків, що вийшли з ладу, використовуйте +кілька опцій -d, щоб вказати їх усі. +

Ця команда займе багато часу. +

Переконайтеся, що у вас є кілька гігабайт вільного місця для +зберігання файлу fix.log. +Запустіть її з диска з достатньою кількістю вільного місця. +

Тепер ви відновили все, що можна відновити. Якщо деякі файли +частково або повністю неможливо відновити, вони будуть перейменовані +з додаванням розширення `.unrecoverable`. +

Ви можете знайти детальний список усіх невідновлюваних блоків +у файлі fix.log, перевіривши всі рядки, що починаються з +`unrecoverable:`. +

Якщо ви не задоволені відновленням, ви можете повторити його +стільки разів, скільки забажаєте. +

Наприклад, якщо ви видалили файли з масиву після останньої +`sync`, це може призвести до того, що деякі файли не будуть +відновлені. +У цьому випадку ви можете повторити `fix`, використовуючи +опцію -i, --import, вказавши, де ці файли знаходяться зараз, +щоб знову включити їх у процес відновлення. +

Якщо ви задоволені відновленням, ви можете продовжити, але +зауважте, що після синхронізації ви більше не зможете повторити +команду `fix`! +

+
+

+КРОК 3 -> Перевірка (Check) +

+

Як обережну перевірку, ви можете тепер запустити команду +`check`, щоб переконатися, що на відновленому диску все +правильно. +

+snapraid -d NAME -a check
+
+

Де NAME — це ім'я диска, наприклад `d1` у нашому попередньому +прикладі. +

Опції -d та -a вказують SnapRAID перевіряти лише вказаний +диск та ігнорувати всі дані парності. +

Ця команда займе багато часу, але якщо ви не надто обережні, +ви можете її пропустити. +

+
+

+КРОК 4 -> Синхронізація (Sync) +

+

Запустіть команду `sync`, щоб повторно синхронізувати масив +з новим диском. +

+snapraid sync
+
+

Якщо все відновлено, ця команда виконується миттєво. +

+
+
+
+

+Команди +

+

SnapRAID надає кілька простих команд, які дозволяють: +

    +
  • +Вивести статус масиву -> `status` +
  • +
  • +Керувати дисками -> `smart`, `probe`, `up`, `down` +
  • +
  • +Створити резервну копію/знімок -> `sync` +
  • +
  • +Періодично перевіряти дані -> `scrub` +
  • +
  • +Відновити останню резервну копію/знімок -> `fix`. +
  • +
+

Команди повинні бути написані малими літерами. +

+

+status +

+

Виводить зведення стану дискового масиву. +

Включає інформацію про фрагментацію парності, вік блоків без +перевірки та всі записані приховані помилки, виявлені під +час скрабування. +

Представлена інформація стосується останнього часу, коли ви +запустили `sync`. Пізніші модифікації не враховуються. +

Якщо виявлено погані блоки, перераховуються їхні номери блоків. +Щоб їх виправити, ви можете використовувати команду `fix -e`. +

Також показує графік, що представляє останній час, коли +кожен блок був скрабований або синхронізований. Скрабовані +блоки позначаються символом '*', блоки, синхронізовані, +але ще не скрабовані, - 'o'. +

Нічого не змінюється. +

+
+

+smart +

+

Виводить звіт SMART усіх дисків у системі. +

Включає оцінку ймовірності відмови протягом наступного року, +дозволяючи вам планувати планову заміну дисків, які +виявляють підозрілі атрибути. +

Ця оцінка ймовірності отримана шляхом кореляції атрибутів +SMART дисків з даними Backblaze, доступними за адресою: +

+https://www.backblaze.com/hard-drive-test-data.html
+
+

Якщо SMART повідомляє, що диск виходить з ладу, для цього +диска виводиться `FAIL` або `PREFAIL`, і SnapRAID повертає +помилку. У цьому випадку настійно рекомендується негайна +заміна диска. +

Інші можливі рядки стану: +

+
+
+logfail +
+У минулому деякі атрибути були нижчими за +поріг. +
+
+
+
+logerr +
+Журнал помилок пристрою містить помилки. +
+
+
+
+selferr +
+Журнал самотестування пристрою містить помилки. +
+
+
+

Якщо вказано опцію -v, --verbose, надається глибший +статистичний аналіз. Цей аналіз може допомогти вам вирішити, +чи потрібна вам більша або менша парність. +

Ця команда використовує інструмент `smartctl` і еквівалентна +запуску `smartctl -a` на всіх пристроях. +

Якщо ваші пристрої не виявляються автоматично правильно, ви +можете вказати користувацьку команду, використовуючи опцію +`smartctl` у конфігураційному файлі. +

Нічого не змінюється. +

+
+

+probe +

+

Виводить стан ЖИВЛЕННЯ всіх дисків у системі. +

`Standby` означає, що диск не обертається. `Active` означає, +що диск обертається. +

Ця команда використовує інструмент `smartctl` і еквівалентна +запуску `smartctl -n standby -i` на всіх пристроях. +

Якщо ваші пристрої не виявляються автоматично правильно, ви +можете вказати користувацьку команду, використовуючи опцію +`smartctl` у конфігураційному файлі. +

Нічого не змінюється. +

+
+

+up +

+

Розкручує всі диски масиву. +

Ви можете розкрутити лише певні диски, використовуючи +опцію -d, --filter-disk. +

Одночасне розкручування всіх дисків вимагає багато енергії. +Переконайтеся, що ваш блок живлення може це витримати. +

Нічого не змінюється. +

+
+

+down +

+

Зупиняє всі диски масиву. +

Ця команда використовує інструмент `smartctl` і еквівалентна +запуску `smartctl -s standby,now` на всіх пристроях. +

Ви можете зупинити лише певні диски, використовуючи +опцію -d, --filter-disk. +

Для автоматичної зупинки при помилці ви можете +використовувати опцію -s, --spin-down-on-error з будь-якою +іншою командою, що еквівалентно ручному запуску `down` +при виникненні помилки. +

Нічого не змінюється. +

+
+

+diff +

+

Виводить список усіх файлів, змінених з моменту останньої +`sync`, для яких необхідно перерахувати дані парності. +

Ця команда не перевіряє дані файлів, а лише часову мітку +файлу, розмір та inode. +

Після перерахування всіх змінених файлів представляється +зведення змін, згруповане за: +

+
+
+equal (рівні) +
+Файли, незмінені з попереднього стану. +
+
+
+
+added (додані) +
+Файли, додані, яких не було раніше. +
+
+
+
+removed (видалені) +
+Файли, видалені. +
+
+
+
+updated (оновлені) +
+Файли з іншим розміром або часовою +міткою, що означає, що вони були змінені. +
+
+
+
+moved (переміщені) +
+Файли, переміщені в інший каталог +на тому ж диску. Вони ідентифікуються за тим же +іменем, розміром, часовою міткою та inode, але іншим +каталогом. +
+
+
+
+copied (скопійовані) +
+Файли, скопійовані на тому ж +або іншому диску. Зауважте, що якщо вони справді +переміщені на інший диск, вони також будуть враховані +як `removed`. +Вони ідентифікуються за тим же іменем, розміром +та часовою міткою. Якщо часова мітка з точністю +до долі секунди дорівнює нулю, повний шлях повинен +збігатися, а не лише ім'я. +
+
+
+
+restored (відновлені) +
+Файли з іншим inode, але +збігаються ім'я, розмір та часова мітка. Це +зазвичай файли, відновлені після видалення. +
+
+
+

Якщо потрібна `sync`, код повернення процесу дорівнює 2, +замість стандартного 0. Код повернення 1 використовується для +загальної умови помилки. +

Нічого не змінюється. +

+
+

+sync +

+

Оновлює інформацію парності. Всі змінені файли у дисковому +масиві зчитуються, і відповідні дані парності оновлюються. +

Ви можете зупинити цей процес у будь-який час, натиснувши +Ctrl+C, не втрачаючи вже виконану роботу. +Під час наступного запуску процес `sync` відновить роботу +з місця, де був перерваний. +

Якщо під час процесу виявлено приховані помилки або помилки +введення/виведення, відповідні блоки позначаються як погані. +

Файли ідентифікуються за шляхом та/або inode та перевіряються +за розміром та часовою міткою. +Якщо розмір або часова мітка файлу відрізняються, дані +парності перераховуються для всього файлу. +Якщо файл переміщено або перейменовано на тому ж диску, +зберігаючи той самий inode, парність не перераховується. +Якщо файл переміщено на інший диск, парність перераховується, +але раніше обчислена інформація хешу зберігається. +

Файли `content` та `parity` змінюються за потреби. +Файли в масиві НЕ змінюються. +

+
+

+scrub +

+

Скрабує масив, перевіряючи на наявність прихованих помилок +або помилок введення/виведення на дисках даних та парності. +

Кожен виклик перевіряє приблизно 8% масиву, виключаючи +дані, які вже були скрабовані протягом останніх 10 днів. +Це означає, що скрабування раз на тиждень забезпечує +перевірку кожного біта даних принаймні раз на три місяці. +

Ви можете визначити інший план скрабування або кількість +за допомогою опції -p, --plan, яка приймає: +bad - Скрабувати блоки, позначені як погані. +new - Скрабувати щойно синхронізовані блоки, які ще не були +

скрабовані. +

+
+
+full +
+Скрабувати все. +
+
+
+
+0-100 +
+Скрабувати вказаний відсоток блоків. +
+
+
+

Якщо ви вказуєте відсоткове значення, ви також можете +використовувати опцію -o, --older-than, щоб визначити, +яким має бути вік блоку. +Найстаріші блоки скрабуються першими, забезпечуючи оптимальну +перевірку. +Якщо ви хочете скрабувати лише щойно синхронізовані блоки, +які ще не були скрабовані, використовуйте опцію `-p new`. +

Щоб отримати деталі статусу скрабування, використовуйте команду +`status`. +

Для будь-якої знайденої прихованої помилки або помилки +введення/виведення відповідні блоки позначаються як погані +у файлі `content`. +Ці погані блоки перераховуються у `status` і можуть бути +виправлені за допомогою `fix -e`. +Після виправлення, під час наступного скрабування, вони будуть +повторно перевірені, і якщо виявиться, що вони виправлені, +позначка "поганий" буде видалена. +Щоб скрабувати лише погані блоки, ви можете використовувати +команду `scrub -p bad`. +

Рекомендується запускати `scrub` лише на синхронізованому +масиві, щоб уникнути повідомлень про помилки, спричинені +несинхронізованими даними. Ці помилки розпізнаються як +не приховані помилки, і блоки не позначаються як погані, +але такі помилки повідомляються у виведенні команди. +

Файл `content` змінюється для оновлення часу останньої перевірки +для кожного блоку та для позначення поганих блоків. +Файли `parity` НЕ змінюються. +Файли в масиві НЕ змінюються. +

+
+

+fix +

+

Виправляє всі файли та дані парності. +

Усі файли та дані парності порівнюються зі станом знімка, +збереженим під час останньої `sync`. +Якщо знайдено різницю, вона повертається до збереженого знімка. +

УВАГА! Команда `fix` не розрізняє помилки та навмисні +модифікації. Вона безумовно повертає стан файлу до останньої +`sync`. +

Якщо не вказано жодної іншої опції, обробляється весь масив. +Використовуйте опції фільтра, щоб вибрати підмножину файлів +або дисків для роботи. +

Щоб виправити лише блоки, позначені як погані під час `sync` +та `scrub`, використовуйте опцію -e, --filter-error. +На відміну від інших опцій фільтра, ця застосовує виправлення +лише до файлів, які не змінилися з моменту останньої `sync`. +

SnapRAID перейменовує всі файли, які не можуть бути виправлені, +додаючи розширення `.unrecoverable`. +

Перед виправленням сканується весь масив, щоб знайти будь-які +файли, переміщені з моменту останньої `sync`. +Ці файли ідентифікуються за їхньою часовою міткою, ігноруючи +їхнє ім'я та каталог, і використовуються в процесі відновлення, +якщо це необхідно. +Якщо ви перемістили деякі з них за межі масиву, ви можете +використовувати опцію -i, --import, щоб вказати додаткові +каталоги для сканування. +

Файли ідентифікуються лише за шляхом, а не за inode. +

Файл `content` НЕ змінюється. +Файли `parity` змінюються за потреби. +Файли в масиві змінюються за потреби. +

+
+

+check +

+

Перевіряє всі файли та дані парності. +

Працює як `fix`, але лише імітує відновлення, і жодні зміни +не записуються в масив. +

Ця команда в першу чергу призначена для ручної перевірки, +наприклад, після процесу відновлення або в інших особливих +умовах. Для періодичних та запланованих перевірок використовуйте +`scrub`. +

Якщо ви використовуєте опцію -a, --audit-only, перевіряється +лише хеш файлів, а дані парності ігноруються для швидшого +запуску. +

Файли ідентифікуються лише за шляхом, а не за inode. +

Нічого не змінюється. +

+
+

+list +

+

Виводить список усіх файлів, що містяться в масиві на момент +останньої `sync`. +

З -v або --verbose також показується час з точністю до +долі секунди. +

Нічого не змінюється. +

+
+

+dup +

+

Виводить список усіх дублікатів файлів. Два файли вважаються +рівними, якщо їхні хеші збігаються. Дані файлів не +зчитуються; використовуються лише попередньо обчислені хеші. +

Нічого не змінюється. +

+
+

+pool +

+

Створює або оновлює віртуальне представлення всіх файлів +у вашому дисковому масиві в каталозі `pooling`. +

Файли не копіюються, а пов'язуються за допомогою символічних +посилань. +

Під час оновлення всі існуючі символічні посилання та порожні +підкаталоги видаляються та замінюються новим +представленням масиву. Будь-які інші звичайні файли залишаються +на місці. +

Нічого не змінюється за межами каталогу pool. +

+
+

+devices +

+

Виводить низькорівневі пристрої, які використовуються масивом. +

Ця команда відображає асоціації пристроїв у масиві і в +основному призначена як інтерфейс для сценаріїв. +

Перші два стовпці — це низькорівневий ідентифікатор пристрою +та шлях. +Наступні два стовпці — це високорівневий ідентифікатор пристрою +та шлях. +Останній стовпець — це ім'я диска в масиві. +

У більшості випадків у вас є один низькорівневий пристрій для +кожного диска в масиві, але в деяких складніших конфігураціях +у вас може бути кілька низькорівневих пристроїв, які використовуються +одним диском у масиві. +

Нічого не змінюється. +

+
+

+touch +

+

Встановлює довільну часову мітку з точністю до долі секунди +для всіх файлів, у яких вона встановлена на нуль. +

Це покращує здатність SnapRAID розпізнавати переміщені та +скопійовані файли, оскільки робить часову мітку майже +унікальною, зменшуючи можливі дублікати. +

Зокрема, якщо часова мітка з точністю до долі секунди не +дорівнює нулю, переміщений або скопійований файл ідентифікується +як такий, якщо він збігається з іменем, розміром та часовою +міткою. Якщо часова мітка з точністю до долі секунди дорівнює +нулю, він вважається копією, лише якщо повний шлях, розмір та +часова мітка збігаються. +

Часова мітка з точністю до секунди не змінюється, тому +всі дати та час ваших файлів будуть збережені. +

+
+

+rehash +

+

Планує повторне хешування всього масиву. +

Ця команда змінює тип хешу, що використовується, як правило, +при оновленні з 32-розрядної системи на 64-розрядну, щоб +переключитися з MurmurHash3 на швидший SpookyHash. +

Якщо ви вже використовуєте оптимальний хеш, ця команда +нічого не робить і повідомляє, що жодних дій не потрібно. +

Повторне хешування не виконується негайно, а відбувається +поступово під час `sync` та `scrub`. +

Ви можете перевірити стан повторного хешування за допомогою +`status`. +

Під час повторного хешування SnapRAID зберігає повну +функціональність, за єдиним винятком, що `dup` не може +виявити дублікати файлів, використовуючи інший хеш. +

+
+
+

+Опції +

+

SnapRAID надає наступні опції: +

+
+
+-c, --conf CONFIG +
+Вибирає конфігураційний файл для використання. Якщо не +вказано, в Unix використовується файл `/usr/local/etc/snapraid.conf`, +якщо він існує, інакше `/etc/snapraid.conf`. +У Windows використовується файл `snapraid.conf` у тому +самому каталозі, що й `snapraid.exe`. +
+
+
+
+
+
+-f, --filter PATTERN +
+Фільтрує файли для обробки у `check` та `fix`. +Обробляються лише файли, що відповідають вказаному +шаблону. Цю опцію можна використовувати кілька разів. +Дивіться розділ PATTERN для отримання додаткової +інформації про специфікації шаблонів. +В Unix переконайтеся, що символи глоббінгу взяті +в лапки, якщо вони використовуються. +Цю опцію можна використовувати лише з `check` та `fix`. +Її не можна використовувати з `sync` та `scrub`, оскільки +вони завжди обробляють весь масив. +
+
+
+
+
+
+-d, --filter-disk NAME +
+Фільтрує диски для обробки у `check`, `fix`, `up` та `down`. +Ви повинні вказати ім'я диска, як визначено у +конфігураційному файлі. +Ви також можете вказати диски парності з іменами: +`parity`, `2-parity`, `3-parity`, тощо, щоб обмежити +операції певним диском парності. +Якщо ви поєднуєте кілька опцій --filter, --filter-disk +та --filter-missing, вибираються лише файли, що +відповідають усім фільтрам. +Цю опцію можна використовувати кілька разів. +Цю опцію можна використовувати лише з `check`, `fix`, +`up` та `down`. +Її не можна використовувати з `sync` та `scrub`, оскільки +вони завжди обробляють весь масив. +
+
+
+
+
+
+-m, --filter-missing +
+Фільтрує файли для обробки у `check` та `fix`. +Обробляються лише файли, що відсутні або видалені з +масиву. При використанні з `fix` це діє як команда +`undelete` (відновлення видалених файлів). +Якщо ви поєднуєте кілька опцій --filter, --filter-disk +та --filter-missing, вибираються лише файли, що +відповідають усім фільтрам. +Цю опцію можна використовувати лише з `check` та `fix`. +Її не можна використовувати з `sync` та `scrub`, оскільки +вони завжди обробляють весь масив. +
+
+
+
+
+
+-e, --filter-error +
+Обробляє файли з помилками у `check` та `fix`. +Обробляє лише файли, які мають блоки, позначені +прихованими помилками або помилками введення/виведення +під час `sync` та `scrub`, як зазначено у `status`. +Цю опцію можна використовувати лише з `check` та `fix`. +
+
+
+
+
+
+-p, --plan PERC|bad|new|full +
+Вибирає план скрабування. Якщо PERC є числовим +значенням від 0 до 100, воно інтерпретується як відсоток +блоків для скрабування. +Замість відсотка ви можете вказати план: `bad` +скрабує погані блоки, `new` скрабує блоки, які ще не +були скрабовані, і `full` скрабує все. +Цю опцію можна використовувати лише з `scrub`. +
+
+
+
+
+
+-o, --older-than DAYS +
+Вибирає найстарішу частину масиву для обробки у `scrub`. +DAYS — це мінімальний вік у днях для блоку, який +повинен бути скрабований; за замовчуванням 10. +Блоки, позначені як погані, завжди скрабуються +незалежно від цієї опції. +Цю опцію можна використовувати лише з `scrub`. +
+
+
+
+
+
+-a, --audit-only +
+У `check` перевіряє хеш файлів без перевірки даних +парності. Якщо вас цікавить лише перевірка даних файлів, +ця опція може значно прискорити процес перевірки. +Цю опцію можна використовувати лише з `check`. +
+
+
+
+
+
+-h, --pre-hash +
+У `sync` запускає попередню фазу хешування всіх нових +даних для додаткової перевірки перед обчисленням +парності. Зазвичай у `sync` не виконується попереднє +хешування, а нові дані хешуються безпосередньо перед +обчисленням парності, коли вони зчитуються вперше. +Цей процес відбувається, коли система знаходиться під +великим навантаженням, усі диски обертаються та ЦП +зайнятий. Це екстремальна умова для машини, і якщо вона +має приховану апаратну проблему, приховані помилки +можуть залишитися невиявленими, оскільки дані ще не +були хешовані. +Щоб уникнути цього ризику, ви можете ввімкнути режим +`pre-hash`, щоб усі дані були зчитані двічі для +забезпечення їх цілісності. +Ця опція також перевіряє файли, переміщені в межах +масиву, щоб переконатися, що операція переміщення була +успішною, і, якщо необхідно, дозволяє запустити операцію +виправлення перед продовженням. +Цю опцію можна використовувати лише з `sync`. +
+
+
+
+
+
+-i, --import DIR +
+Імпортує з вказаного каталогу будь-які файли, видалені +з масиву після останньої `sync`. +Якщо у вас все ще є такі файли, вони можуть бути +використані `check` та `fix` для покращення процесу +відновлення. +Файли зчитуються, включаючи підкаталоги, та +ідентифікуються незалежно від їхнього імені. +Цю опцію можна використовувати лише з `check` та `fix`. +
+
+
+
+
+
+-s, --spin-down-on-error +
+При будь-якій помилці зупиняє всі керовані диски перед +завершенням з ненульовим кодом стану. Це запобігає +тому, щоб диски залишалися активними та оберталися +після перерваної операції, допомагаючи уникнути +зайвого нагрівання та споживання електроенергії. +Використовуйте цю опцію, щоб забезпечити безпечну +зупинку дисків, навіть коли команда завершується +помилкою. +
+
+
+
+
+
+-w, --bw-limit RATE +
+Застосовує глобальне обмеження пропускної здатності +для всіх дисків. RATE — це кількість байтів на секунду. +Ви можете вказати множник, такий як K, M або G (наприклад, +--bw-limit 1G). +
+
+
+
+
+
+-A, --stats +
+Вмикає розширений перегляд стану, який показує +додаткову інформацію. +На екрані відображаються два графіки: +Перший графік показує кількість буферизованих смуг +(stripes) для кожного диска, разом зі шляхом до файлу, +до якого наразі здійснюється доступ на цьому диску. +Зазвичай найповільніший диск не матиме доступного +буфера, що визначає максимально досяжну пропускну +здатність. +Другий графік показує відсоток часу, витраченого на +очікування, за останні 100 секунд. Очікується, що +найповільніший диск спричинить більшу частину часу +очікування, тоді як інші диски повинні мати невеликий +час очікування або зовсім його не мати, оскільки +вони можуть використовувати свої буферизовані смуги. +Цей графік також показує час, витрачений на очікування +обчислення хешу та обчислень RAID. +Усі обчислення виконуються паралельно з операціями +диска. Тому, доки є вимірюваний час очікування +принаймні для одного диска, це вказує на те, що ЦП +достатньо швидкий, щоб справлятися з робочим навантаженням. +
+
+
+
+
+
+-Z, --force-zero +
+Форсує небезпечну операцію синхронізації файлу з +нульовим розміром, який раніше був ненульовим. +Якщо SnapRAID виявляє таку умову, він припиняє +продовження, якщо ви не вкажете цю опцію. +Це дозволяє легко виявити, коли після збою системи +деякі доступні файли були обрізані. +Це можлива умова в Linux з файловими системами +ext3/ext4. +Цю опцію можна використовувати лише з `sync`. +
+
+
+
+
+
+-E, --force-empty +
+Форсує небезпечну операцію синхронізації диска, на +якому відсутні всі оригінальні файли. +Якщо SnapRAID виявляє, що всі файли, які спочатку +були на диску, відсутні або перезаписані, він +припиняє продовження, якщо ви не вкажете цю опцію. +Це дозволяє легко виявити, коли файлова система +даних не змонтована. +Цю опцію можна використовувати лише з `sync`. +
+
+
+
+
+
+-U, --force-uuid +
+Форсує небезпечну операцію синхронізації, перевірки +та виправлення з дисками, які змінили свій UUID. +Якщо SnapRAID виявляє, що деякі диски змінили UUID, +він припиняє продовження, якщо ви не вкажете цю опцію. +Це дозволяє виявити, коли ваші диски змонтовані +в неправильних точках монтування. +Однак, дозволено мати одну зміну UUID з однією парністю +і більше з множинною парністю, оскільки це нормальний +випадок при заміні дисків після відновлення. +Цю опцію можна використовувати лише з `sync`, `check` +або `fix`. +
+
+
+
+
+
+-D, --force-device +
+Форсує небезпечну операцію виправлення з недоступними +дисками або з дисками на тому ж фізичному пристрої. +Наприклад, якщо ви втратили два диски даних і маєте +запасний диск для відновлення лише першого, ви можете +ігнорувати другий недоступний диск. +Або, якщо ви хочете відновити диск у вільному місці, +залишеному на вже використовуваному диску, що +використовує той самий фізичний пристрій. +Цю опцію можна використовувати лише з `fix`. +
+
+
+
+
+
+-N, --force-nocopy +
+У `sync`, `check` та `fix` вимикає евристику +виявлення копій. Без цієї опції SnapRAID припускає, +що файли з однаковими атрибутами, такими як ім'я, +розмір та часова мітка, є копіями з тими ж даними. +Це дозволяє ідентифікувати скопійовані або +переміщені файли з одного диска на інший і повторно +використовує вже обчислену інформацію хешу для +виявлення прихованих помилок або для відновлення +відсутніх файлів. +У деяких рідкісних випадках ця поведінка може +призвести до хибних спрацьовувань або повільного +процесу через багато перевірок хешу, і ця опція +дозволяє вирішити такі проблеми. +Цю опцію можна використовувати лише з `sync`, `check` +та `fix`. +
+
+
+
+
+
+-F, --force-full +
+У `sync` форсує повне переобчислення парності. +Цю опцію можна використовувати, коли ви додаєте +новий рівень парності або якщо ви повернулися до +старого файлу вмісту, використовуючи більш +нові дані парності. +Замість створення парності з нуля, це дозволяє +повторно використовувати хеші, присутні у файлі +вмісту, для перевірки даних та підтримки захисту +даних під час процесу `sync`, використовуючи +існуючі дані парності. +Цю опцію можна використовувати лише з `sync`. +
+
+
+
+
+
+-R, --force-realloc +
+У `sync` форсує повне перерозподілення файлів +та перебудову парності. +Цю опцію можна використовувати для повного +перерозподілу всіх файлів, усуваючи фрагментацію, +повторно використовуючи хеші, присутні у файлі +вмісту, для перевірки даних. +Цю опцію можна використовувати лише з `sync`. +УВАГА! Ця опція лише для експертів, і +настійно не рекомендується її використовувати. +Ви НЕ маєте захисту даних під час операції `sync`. +
+
+
+
+
+
+-l, --log FILE +
+Записує детальний журнал у вказаний файл. +Якщо ця опція не вказана, несподівані помилки +виводяться на екран, що потенційно призводить до +надмірного виведення у випадку багатьох помилок. +Коли вказано -l, --log, на екран виводяться лише +фатальні помилки, які спричиняють зупинку SnapRAID. +Якщо шлях починається з '>>', файл відкривається +у режимі доповнення. Входження '%D' та '%T' в +імені замінюються датою та часом у форматі YYYYMMDD +та HHMMSS. У пакетних файлах Windows ви повинні +подвоїти символ '%', наприклад, result-%%D.log. +Щоб використовувати '>>', ви повинні взяти ім'я +в лапки, наприклад, `">>result.log"`. +Щоб вивести журнал на стандартний вивід або +стандартну помилку, ви можете використовувати +`">&1"` та `">&2"` відповідно. +Дивіться файл snapraid_log.txt або man-сторінку +для описів тегів журналу. +
+
+
+
+
+
+-L, --error-limit NUMBER +
+Встановлює новий ліміт помилок перед зупинкою +виконання. За замовчуванням SnapRAID зупиняється, +якщо зустрічає більше 100 помилок введення/виведення, +що вказує на ймовірну відмову диска. +Ця опція впливає на `sync` та `scrub`, яким +дозволено продовжувати після першого набору +помилок диска, щоб спробувати завершити +свої операції. Однак `check` та `fix` завжди +зупиняються при першій помилці. +
+
+
+
+
+
+-S, --start BLKSTART +
+Починає обробку з вказаного номера блоку. +Це може бути корисно для повторної спроби +перевірки або виправлення певних блоків у +випадку пошкодженого диска. +Ця опція в основному для розширеного ручного +відновлення. +
+
+
+
+
+
+-B, --count BLKCOUNT +
+Обробляє лише вказану кількість блоків. +Ця опція в основному для розширеного ручного +відновлення. +
+
+
+
+
+
+-C, --gen-conf CONTENT +
+Генерує фіктивний конфігураційний файл з існуючого +файлу вмісту. +Конфігураційний файл записується на стандартний +вивід і не перезаписує існуючий. +Цей конфігураційний файл також містить інформацію, +необхідну для реконструкції точок монтування диска +у випадку втрати всієї системи. +
+
+
+
+
+
+-v, --verbose +
+Виводить більше інформації на екран. +Якщо вказано один раз, виводить виключені файли +та додаткову статистику. +Ця опція не впливає на файли журналу. +
+
+
+
+
+
+-q, --quiet +
+Виводить менше інформації на екран. +Якщо вказано один раз, видаляє індикатор прогресу; +двічі — поточні операції; тричі — інформаційні +повідомлення; чотири рази — повідомлення про +статус. Фатальні помилки завжди виводяться на +екран. Ця опція не впливає на файли журналу. +
+
+
+
+
+
+-H, --help +
+Виводить короткий довідковий екран. +
+
+
+
+
+
+-V, --version +
+Виводить версію програми. +
+
+
+
+
+

+Конфігурація +

+

SnapRAID вимагає конфігураційний файл, щоб знати, де +розташований ваш дисковий масив і де зберігати інформацію +парності. +

В Unix використовується файл `/usr/local/etc/snapraid.conf`, +якщо він існує, інакше `/etc/snapraid.conf`. +У Windows використовується файл `snapraid.conf` у тому +самому каталозі, що й `snapraid.exe`. +

Він повинен містити наступні опції (чутливі до регістру): +

+

+parity FILE [,FILE] ... +

+

Визначає файли, які потрібно використовувати для зберігання +інформації парності. Парність забезпечує захист від +відмови одного диска, подібно до RAID5. +

Ви можете вказати кілька файлів, які повинні бути на +різних дисках. Коли файл більше не може зростати, +використовується наступний. +Загальний доступний простір повинен бути принаймні +таким же великим, як найбільший диск даних у масиві. +

Ви можете додати додаткові файли парності пізніше, +але ви не можете їх переупорядковувати або видаляти. +

Збереження дисків парності зарезервованими для парності +забезпечує, що вони не стають фрагментованими, покращуючи +продуктивність. +

У Windows 256 МБ залишається невикористаними на кожному +диску, щоб уникнути попередження про повні диски. +

Ця опція є обов'язковою і може бути використана лише один раз. +

+
+

+(2,3,4,5,6)-parity FILE [,FILE] ... +

+

Визначає файли, які потрібно використовувати для зберігання +додаткової інформації парності. +

Для кожного вказаного рівня парності вмикається один +додатковий рівень захисту: +

    +
  • +2-parity вмикає подвійну парність RAID6. +
  • +
  • +3-parity вмикає потрійну парність. +
  • +
  • +4-parity вмикає четверну парність. +
  • +
  • +5-parity вмикає п'ятерну парність. +
  • +
  • +6-parity вмикає шестерну парність. +
  • +
+

Кожен рівень парності вимагає наявності всіх попередніх +рівнів парності. +

Застосовуються ті самі міркування, що й для опції 'parity'. +

Ці опції є необов'язковими і можуть бути використані лише +один раз. +

+
+

+z-parity FILE [,FILE] ... +

+

Визначає альтернативний файл та формат для зберігання +потрійної парності. +

Ця опція є альтернативою '3-parity', в першу чергу +призначена для ЦП низького класу, таких як ARM або +AMD Phenom, Athlon та Opteron, які не підтримують +набір інструкцій SSSE3. У таких випадках вона +забезпечує кращу продуктивність. +

Цей формат схожий, але швидший, ніж той, що використовується +ZFS RAIDZ3. Як і ZFS, він не працює далі потрійної парності. +

При використанні '3-parity' ви будете попереджені, +якщо рекомендується використовувати формат 'z-parity' +для покращення продуктивності. +

Можна конвертувати з одного формату в інший, налаштувавши +конфігураційний файл з бажаним файлом z-parity або +3-parity та використовуючи 'fix' для його відтворення. +

+
+

+content FILE +

+

Визначає файл, який потрібно використовувати для зберігання +списку та контрольних сум усіх файлів, присутніх у +вашому дисковому масиві. +

Він може бути розміщений на диску, що використовується для +даних, парності або будь-якому іншому доступному диску. +Якщо ви використовуєте диск даних, цей файл автоматично +виключається з процесу `sync`. +

Ця опція є обов'язковою і може бути використана кілька +разів для збереження кількох копій одного і того ж +файлу. +

Ви повинні зберігати принаймні одну копію для кожного +використаного диска парності плюс одну. Використання +додаткових копій не зашкодить. +

+
+

+data NAME DIR +

+

Визначає ім'я та точку монтування дисків даних у +масиві. NAME використовується для ідентифікації диска +і має бути унікальним. DIR — це точка монтування +диска у файловій системі. +

Ви можете змінювати точку монтування за потреби, +поки ви зберігаєте NAME фіксованим. +

Ви повинні використовувати одну опцію для кожного +диска даних у масиві. +

Ви можете перейменувати диск пізніше, змінивши NAME +безпосередньо у конфігураційному файлі, а потім +запустивши команду 'sync'. У випадку перейменування +асоціація здійснюється за допомогою збереженого +UUID дисків. +

+
+

+nohidden +

+

Виключає всі приховані файли та каталоги. +В Unix приховані файли — це ті, що починаються з `.`. +У Windows це ті, що мають прихований атрибут. +

+
+

+exclude/include PATTERN +

+

Визначає шаблони файлів або каталогів для виключення +або включення у процес синхронізації. +Усі шаблони обробляються у вказаному порядку. +

Якщо перший шаблон, який збігається, є `exclude` (виключити), +файл виключається. Якщо він є `include` (включити), +файл включається. +Якщо жоден шаблон не збігається, файл виключається, +якщо останній вказаний шаблон є `include`, або +включається, якщо останній вказаний шаблон є `exclude`. +

Дивіться розділ PATTERN для отримання додаткової +інформації про специфікації шаблонів. +

Цю опцію можна використовувати кілька разів. +

+
+

+blocksize SIZE_IN_KIBIBYTES +

+

Визначає основний розмір блоку в кібібайтах для парності. +Один кібібайт дорівнює 1024 байтам. +

Розмір блоку за замовчуванням становить 256, що має +працювати для більшості випадків. +

УВАГА! Ця опція лише для експертів, і настійно +не рекомендується змінювати це значення. Щоб змінити +це значення в майбутньому, вам потрібно буде +перестворити всю парність! +

Причина використовувати інший розмір блоку полягає +в тому, якщо у вас є багато невеликих файлів, порядку +мільйонів. +

Для кожного файлу, навіть якщо це лише кілька байтів, +виділяється цілий блок парності, і з багатьма файлами +це може призвести до значного невикористаного місця +парності. Коли ви повністю заповнюєте диск парності, +вам не дозволяється додавати більше файлів на диски +даних. Однак, витрачена парність не накопичується +між дисками даних. Витрачене місце внаслідок великої +кількості файлів на диску даних обмежує лише кількість +даних на цьому диску даних, а не на інших. +

Як наближення, ви можете припустити, що половина +розміру блоку витрачається для кожного файлу. +Наприклад, зі 100 000 файлами та розміром блоку 256 КіБ +ви витратите 12,8 ГБ парності, що може призвести до +того, що на диску даних буде на 12,8 ГБ менше місця. +

Ви можете перевірити кількість витраченого місця на +кожному диску за допомогою `status`. Це кількість +місця, яку ви повинні залишити вільною на дисках даних +або використовувати для файлів, не включених у масив. +Якщо це значення від'ємне, це означає, що ви +наближаєтеся до заповнення парності, і воно +представляє місце, яке ви ще можете витратити. +

Щоб уникнути цієї проблеми, ви можете використовувати +більший розділ для парності. Наприклад, якщо розділ +парності на 12,8 ГБ більший за диски даних, у вас є +достатньо додаткового місця для обробки до 100 000 +файлів на кожному диску даних без будь-якого +витраченого місця. +

Хитрість, щоб отримати більший розділ парності в +Linux, полягає в тому, щоб відформатувати його +командою: +

+mkfs.ext4 -m 0 -T largefile4 DEVICE
+
+

Це призводить до приблизно 1,5% додаткового місця, +приблизно 60 ГБ для диска 4 ТБ, що дозволяє +приблизно 460 000 файлів на кожному диску даних +без будь-якого витраченого місця. +

+
+

+hashsize SIZE_IN_BYTES +

+

Визначає розмір хешу в байтах для збережених блоків. +

Розмір хешу за замовчуванням становить 16 байтів +(128 біт), що має працювати для більшості випадків. +

УВАГА! Ця опція лише для експертів, і настійно +не рекомендується змінювати це значення. Щоб змінити +це значення в майбутньому, вам потрібно буде +перестворити всю парність! +

Причина використовувати інший розмір хешу полягає +в тому, якщо ваша система має обмежену пам'ять. +Як правило, SnapRAID зазвичай вимагає 1 ГіБ ОЗП +на кожні 16 ТБ даних у масиві. +

Зокрема, для зберігання хешів даних SnapRAID +вимагає приблизно $TS \times (1+HS) / BS$ байтів +ОЗП, де TS — загальний розмір вашого дискового масиву +у байтах, BS — розмір блоку у байтах, а HS — +розмір хешу у байтах. +

Наприклад, з 8 дисками по 4 ТБ, розміром блоку 256 КіБ +(1 КіБ = 1024 байта) та розміром хешу 16, ви отримуєте: +

+RAM = $(8 \times 4 \times 10^{12}) \times (1+16) / (256 \times 2^{10}) = 1.93$ ГіБ
+
+

Перехід до розміру хешу 8, ви отримуєте: +

+RAM = $(8 \times 4 \times 10^{12}) \times (1+8) / (256 \times 2^{10}) = 1.02$ ГіБ
+
+

Перехід до розміру блоку 512, ви отримуєте: +

+RAM = $(8 \times 4 \times 10^{12}) \times (1+16) / (512 \times 2^{10}) = 0.96$ ГіБ
+
+

Перехід до розміру хешу 8 та розміру блоку 512, ви отримуєте: +

+RAM = $(8 \times 4 \times 10^{12}) \times (1+8) / (512 \times 2^{10}) = 0.51$ ГіБ
+
+
+
+

+autosave SIZE_IN_GIGABYTES +

+

Автоматично зберігає стан під час синхронізації або +скрабування після обробки вказаної кількості ГБ. +Ця опція корисна, щоб уникнути перезапуску довгих +команд `sync` з нуля, якщо вони були перервані +збоєм машини або будь-якою іншою подією. +

+
+

+temp_limit TEMPERATURE_CELSIUS +

+

Встановлює максимальну дозволену температуру диска +в Цельсіях. Якщо вказано, SnapRAID періодично перевіряє +температуру всіх дисків за допомогою інструменту +smartctl. Поточні температури дисків відображаються +під час роботи SnapRAID. Якщо будь-який диск перевищує +цей ліміт, усі операції зупиняються, і диски +зупиняються (переходять у режим очікування) на час, +визначений опцією `temp_sleep`. Після періоду +очікування операції відновлюються, потенційно +знову призупиняючись, якщо ліміт температури знову +досягнутий. +

Під час роботи SnapRAID також аналізує криву +нагрівання кожного диска та оцінює довгострокову +стабільну температуру, якої вони, як очікується, +досягнуть, якщо активність продовжиться. +Оцінка виконується лише після того, як температура +диска підвищилася чотири рази, що гарантує наявність +достатньої кількості даних для встановлення +надійного тренду. Ця прогнозована стабільна +температура відображається в дужках поруч із +поточним значенням і допомагає оцінити, чи +достатнє охолодження системи. Ця оцінювана +температура є лише інформаційною і не впливає на +поведінку SnapRAID. Дії програми базуються +виключно на фактично виміряних температурах +дисків. +

Для виконання цього аналізу SnapRAID потрібна +довідкова інформація про температуру системи. +Спочатку він намагається зчитати її з доступних +апаратних датчиків. Якщо до системного датчика +неможливо отримати доступ, він використовує +найнижчу температуру диска, виміряну на початку +запуску, як резервну довідкову інформацію. +

Зазвичай SnapRAID показує лише температуру +найгарячішого диска. Щоб відобразити температуру +всіх дисків, використовуйте опцію -A або --stats. +

+
+

+temp_sleep TIME_IN_MINUTES +

+

Встановлює час очікування, у хвилинах, коли +досягнуто ліміту температури. Протягом цього +періоду диски залишаються зупиненими. +За замовчуванням 5 хвилин. +

+
+

+pool DIR +

+

Визначає каталог об'єднання, де створюється +віртуальне представлення дискового масиву за +допомогою команди `pool`. +

Каталог повинен вже існувати. +

+
+

+share UNC_DIR +

+

Визначає шлях Windows UNC, необхідний для +віддаленого доступу до дисків. +

Якщо ця опція вказана, символічні посилання, +створені в каталозі pool, використовують цей +шлях UNC для доступу до дисків. +Без цієї опції згенеровані символічні посилання +використовують лише локальні шляхи, що не +дозволяє спільно використовувати каталог pool +через мережу. +

Символічні посилання формуються за допомогою +вказаного шляху UNC, додаючи ім'я диска, як +зазначено в опції `data`, і, нарешті, +додаючи каталог та ім'я файлу. +

Ця опція потрібна лише для Windows. +

+
+

+smartctl DISK/PARITY OPTIONS... +

+

Визначає користувацькі опції smartctl для +отримання атрибутів SMART для кожного диска. +Це може знадобитися для RAID-контролерів та +деяких USB-дисків, які не можуть бути +автоматично виявлені. Заповнювач %s +замінюється іменем пристрою, але він +необов'язковий для фіксованих пристроїв, +таких як RAID-контролери. +

DISK — це те саме ім'я диска, вказане в опції `data`. +PARITY — це одне з імен парності: `parity`, +`2-parity`, `3-parity`, `4-parity`, `5-parity`, +`6-parity` або `z-parity`. +

У вказаних OPTIONS рядок `%s` замінюється +іменем пристрою. Для RAID-контролерів пристрій +ймовірно фіксований, і вам може не знадобитися +використовувати `%s`. +

Зверніться до документації smartmontools +для можливих опцій: +

+https://www.smartmontools.org/wiki/Supported_RAID-Controllers
+https://www.smartmontools.org/wiki/Supported_USB-Devices
+
+

Наприклад: +

+smartctl parity -d sat %s
+
+
+
+

+smartignore DISK/PARITY ATTR [ATTR...] +

+

Ігнорує вказаний атрибут SMART при обчисленні +ймовірності відмови диска. Ця опція корисна, +якщо диск повідомляє незвичайні або +оманливі значення для певного атрибута. +

DISK — це те саме ім'я диска, вказане в опції `data`. +PARITY — це одне з імен парності: `parity`, +`2-parity`, `3-parity`, `4-parity`, `5-parity`, +`6-parity` або `z-parity`. +Спеціальне значення * можна використовувати +для ігнорування атрибута на всіх дисках. +

Наприклад, щоб ігнорувати атрибут `Current Pending Sector Count` +на всіх дисках: +

+smartignore * 197
+
+

Щоб ігнорувати його лише на першому диску парності: +

+smartignore parity 197
+
+
+
+

+Приклади +

+

Приклад типової конфігурації для Unix: +

+parity /mnt/diskp/snapraid.parity
+content /mnt/diskp/snapraid.content
+content /var/snapraid/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+exclude /lost+found/
+exclude /tmp/
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/sg0
+smartctl 2-parity -d areca,2/1 /dev/sg0
+
+

Приклад типової конфігурації для Windows: +

+parity E:\snapraid.parity
+content E:\snapraid.content
+content C:\snapraid\snapraid.content
+data d1 G:\array\
+data d2 H:\array\
+data d3 I:\array\
+exclude Thumbs.db
+exclude \$RECYCLE.BIN
+exclude \System Volume Information
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/arcmsr0
+smartctl 2-parity -d areca,2/1 /dev/arcmsr0
+
+
+
+
+

+Шаблон (Pattern) +

+

Шаблони забезпечують гнучкий спосіб фільтрації файлів для включення або +виключення. Використовуючи символи підстановки (globbing), ви можете визначити правила, які +відповідають конкретним іменам файлів або цілим структурам каталогів без +ручного перерахування кожного шляху. +

Знак питання `?` відповідає будь-якому одному символу, крім роздільника +каталогів. Це робить його корисним для зіставлення імен файлів із змінними +символами, при цьому шаблон обмежується одним рівнем каталогу. +

Одинарна зірочка `*` відповідає будь-якій послідовності символів, але, як і +знак питання, вона ніколи не перетинає межі каталогів. Вона зупиняється на +прямій косій рисці, що робить її придатною для зіставлення всередині одного +компонента шляху. Це стандартна поведінка підстановочних знаків, знайома +з командної оболонки (shell globbing). +

Подвійна зірочка `**` є потужнішою, вона відповідає будь-якій послідовності +символів, включаючи роздільники каталогів. Це дозволяє шаблонам відповідати +кільком рівням каталогів. Коли `**` з'являється безпосередньо в шаблоні, +вона може відповідати нулю або більше символам, включаючи косі риски між +оточуючим літеральним текстом. +

Найважливішим використанням `**` є спеціальна форма `/**/`. Вона відповідає +нулю або більше повним рівням каталогів, що дозволяє зіставляти файли +на будь-якій глибині в дереві каталогів, не знаючи точної структури шляху. +Наприклад, шаблон `src/**/main.js` відповідає `src/main.js` (пропуск +нуля каталогів), `src/ui/main.js` (пропуск одного каталогу) та +`src/ui/components/main.js` (пропуск двох каталогів). +

Класи символів із використанням квадратних дужок `[]` відповідають одному символу з +визначеного набору або діапазону. Як і інші односимвольні шаблони, вони +не відповідають роздільникам каталогів. Класи підтримують діапазони та заперечення за допомогою +знаку оклику. +

Фундаментальна відмінність, яку слід пам'ятати, полягає в тому, що `*`, `?` та класи символів +усі дотримуються меж каталогів і відповідають лише в межах одного компонента +шляху, тоді як `**` — єдиний шаблон, який може відповідати через роздільники +каталогів. +

Існує чотири різні типи шаблонів: +

+
+
+FILE +
+Вибирає будь-який файл з ім'ям FILE. +Цей шаблон застосовується тільки до файлів, а не до директорій. +
+
+
+
+
+
+DIR/ +
+Вибирає будь-яку директорію з ім'ям DIR і все, що знаходиться всередині. +Цей шаблон застосовується тільки до директорій, а не до файлів. +
+
+
+
+
+
+/PATH/FILE +
+Вибирає точно вказаний шлях до файлу. Цей шаблон застосовується +тільки до файлів, а не до директорій. +
+
+
+
+
+
+/PATH/DIR/ +
+Вибирає точно вказаний шлях до директорії і все, що знаходиться +всередині. Цей шаблон застосовується тільки до директорій, а не до файлів. +
+
+
+

Коли ви вказуєте абсолютний шлях, що починається +з /, він застосовується до кореневого каталогу +масиву, а не до кореневого каталогу локальної +файлової системи. +

У Windows ви можете використовувати зворотну +скісну риску \ замість прямої скісної риски /. +Системні каталоги Windows, з'єднання, точки +монтування та інші спеціальні каталоги Windows +розглядаються як файли, що означає, що для +їх виключення ви повинні використовувати правило +файлу, а не правило каталогу. +

Якщо ім'я файлу містить символи '*', '?', '[', +або ']', ви повинні екранувати їх, щоб уникнути +їх інтерпретації як символу глоббінгу. +В Unix символом екранування є '\'; у Windows — '^'. +Коли шаблон знаходиться в командному рядку, +ви повинні подвоїти символ екранування, щоб +запобігти його інтерпретації командною оболонкою. +

У конфігураційному файлі ви можете використовувати +різні стратегії для фільтрації файлів, які потрібно +обробити. +Найпростіший підхід — використовувати лише +правила `exclude` для видалення всіх файлів та +каталогів, які ви не хочете обробляти. +Наприклад: +

+# Виключає будь-який файл з іменем `*.unrecoverable`
+exclude *.unrecoverable
+# Виключає кореневий каталог `/lost+found`
+exclude /lost+found/
+# Виключає будь-який підкаталог з іменем `tmp`
+exclude tmp/
+
+

Протилежний підхід — визначити лише файли, +які ви хочете обробити, використовуючи лише +правила `include`. Наприклад: +

+# Включає лише деякі каталоги
+include /movies/
+include /musics/
+include /pictures/
+
+

Останній підхід — змішувати правила `exclude` +та `include`. У цьому випадку порядок правил +важливий. Раніші правила мають пріоритет +над пізнішими. +Для спрощення ви можете спочатку перерахувати +всі правила `exclude`, а потім усі правила `include`. +Наприклад: +

+# Виключає будь-який файл з іменем `*.unrecoverable`
+exclude *.unrecoverable
+# Виключає будь-який підкаталог з іменем `tmp`
+exclude tmp/
+# Включає лише деякі каталоги
+include /movies/
+include /musics/
+include /pictures/
+
+

У командному рядку, використовуючи опцію -f, +ви можете використовувати лише шаблони `include`. +Наприклад: +

+# Перевіряє лише файли .mp3.
+# В Unix використовуйте лапки, щоб уникнути
+# розширення глоббінгу оболонкою.
+snapraid -f "*.mp3" check
+
+

В Unix, при використанні символів глоббінгу в +командному рядку, ви повинні взяти їх у лапки, +щоб запобігти їх розширенню оболонкою. +

+
+

+Ігнорування файлів (Ignore File) +

+

На додаток до глобальних правил у файлі конфігурації, ви можете розміщувати +файли `.snapraidignore` в будь-якому каталозі всередині масиву для визначення +децентралізованих правил виключення. +

Правила, визначені в `.snapraidignore`, застосовуються після правил у файлі +конфігурації. Це означає, що вони мають вищий пріоритет і можуть бути використані +для виключення файлів, які раніше були включені глобальною конфігурацією. +Фактично, якщо локальне правило збігається, файл виключається незалежно від +глобальних налаштувань включення. +

Логіка шаблонів у `.snapraidignore` повторює глобальну конфігурацію, але +прив'язує шаблони до каталогу, в якому знаходиться файл: +

+
+
+FILE +
+Вибирає будь-який файл із ім'ям FILE у цьому каталозі або нижче. +Це відповідає тим самим правилам підстановки, що і в глобальному шаблоні. +
+
+
+
+
+
+DIR/ +
+Вибирає будь-який каталог із ім'ям DIR та весь його вміст, що +знаходиться в цьому каталозі або нижче. +
+
+
+
+
+
+/PATH/FILE +
+Вибирає точно вказаний файл відносно розташування +файлу `.snapraidignore`. +
+
+
+
+
+
+/PATH/DIR/ +
+Вибирає точно вказаний каталог та весь його вміст відносно +розташування файлу `.snapraidignore`. +
+
+
+

На відміну від глобальної конфігурації, файли `.snapraidignore` підтримують +лише правила виключення; ви не можете використовувати шаблони `include` або заперечення (!). +

Наприклад, якщо у вас є `.snapraidignore` у `/mnt/disk1/projects/`: +

+# Виключає ТІЛЬКИ /mnt/disk1/projects/output.bin
+/output.bin
+# Виключає будь-який каталог із назвою 'build' всередині projects/
+build/
+# Виключає будь-який .tmp файл всередині projects/ або його підпапок
+*.tmp
+
+
+
+

+Вміст (Content) +

+

SnapRAID зберігає список та контрольні суми +ваших файлів у файлі вмісту. +

Це бінарний файл, який перераховує всі файли, +присутні у вашому дисковому масиві, разом з +усіма контрольними сумами для перевірки їх +цілісності. +

Цей файл зчитується та записується командами +`sync` та `scrub` та зчитується командами `fix`, +`check` та `status`. +

+
+

+Парність (Parity) +

+

SnapRAID зберігає інформацію парності вашого +масиву у файлах парності. +

Це бінарні файли, що містять обчислену +парність усіх блоків, визначених у файлі +`content`. +

Ці файли зчитуються та записуються командами +`sync` та `fix` і лише зчитуються командами +`scrub` та `check`. +

+
+

+Кодування (Encoding) +

+

SnapRAID в Unix ігнорує будь-яке кодування. +Він зчитує та зберігає імена файлів з +тим самим кодуванням, що використовується +файловою системою. +

У Windows усі імена, зчитані з файлової +системи, конвертуються та обробляються +у форматі UTF-8. +

Щоб імена файлів відображалися правильно, +ви повинні встановити консоль Windows +у режим UTF-8 за допомогою команди +`chcp 65001` та використовувати шрифт +TrueType, такий як `Lucida Console`, як +шрифт консолі. +Це впливає лише на надруковані імена +файлів; якщо ви перенаправляєте вивід +консолі у файл, отриманий файл завжди +буде у форматі UTF-8. +

+
+

+Авторське право (Copyright) +

+

Цей файл захищений авторським правом (C) 2025 Andrea Mazzoleni +

+
+

+Див. також (See Also) +

+

snapraid_log(1), snapraidd(1) +

+ + +
+
+
+ + + + + + + diff --git a/beta/manual-zh.html b/beta/manual-zh.html new file mode 100644 index 00000000..5d87446a --- /dev/null +++ b/beta/manual-zh.html @@ -0,0 +1,1813 @@ + + + + + + + + SnapRAID Manual + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + +
+ +
+ +
+

+Synopsis +

+
+snapraid [-c, --conf CONFIG]
+    [-f, --filter PATTERN] [-d, --filter-disk NAME]
+    [-m, --filter-missing] [-e, --filter-error]
+    [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR]
+    [-p, --plan PERC|bad|new|full]
+    [-o, --older-than DAYS] [-l, --log FILE]
+    [-s, --spin-down-on-error] [-w, --bw-limit RATE]
+    [-Z, --force-zero] [-E, --force-empty]
+    [-U, --force-uuid] [-D, --force-device]
+    [-N, --force-nocopy] [-F, --force-full]
+    [-R, --force-realloc]
+    [-S, --start BLKSTART] [-B, --count BLKCOUNT]
+    [-L, --error-limit NUMBER]
+    [-A, --stats]
+    [-v, --verbose] [-q, --quiet]
+    status|smart|probe|up|down|diff|sync|scrub|fix|check
+    |list|dup|pool|devices|touch|rehash
+
+
+snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT]
+
+
+
+

+Description +

+

SnapRAID 是一款专为磁盘阵列设计的备份程序,它存储奇偶校验信息, +以在最多六个磁盘发生故障时进行数据恢复。 +

SnapRAID 主要面向拥有大型、不常更改文件的家庭媒体中心,提供以下特性: +

    +
  • +您可以使用已填充文件的磁盘,无需重新格式化,并像往常一样访问它们。 +
  • +
  • +您的所有数据都会被散列,以确保存储完整性并防止静默损坏。 +
  • +
  • +当故障磁盘数量超过奇偶校验数时,数据丢失仅限于受影响的磁盘; +其他磁盘上的数据仍然可访问。 +
  • +
  • +如果您不小心删除了磁盘上的文件,可以进行恢复。 +
  • +
  • +磁盘可以有不同的尺寸。 +
  • +
  • +您可以随时添加磁盘。 +
  • +
  • +SnapRAID 不会锁定您的数据;您可以随时停止使用它,无需重新格式化或移动数据。 +
  • +
  • +访问文件时,只需一个磁盘转动,从而节省电力并降低噪音。 +
  • +
+

欲了解更多信息,请访问 SnapRAID 官方网站: +

+https://www.snapraid.it/
+
+
+
+

+Limitations +

+

SnapRAID 是 RAID 和备份程序之间的混合体,旨在结合两者的优点。 +然而,在使用它之前,您应该考虑一些限制。 +

主要的限制是,如果一个磁盘发生故障而您最近没有进行同步(sync), +您可能无法完全恢复。 +更具体地说,您可能无法恢复自上次同步操作以来已更改或已删除文件的 +大小所对应的部分。 +即使更改或删除的文件不在发生故障的磁盘上,也会发生这种情况。 +这就是为什么 SnapRAID 更适用于很少更改的数据。 +

另一方面,新添加的文件不会阻止对已有文件的恢复。 +您只会丢失位于发生故障磁盘上的最近添加的文件。 +

SnapRAID 的其他限制包括: +

    +
  • +使用 SnapRAID,每个磁盘仍然有单独的文件系统。 +使用 RAID,您可以获得一个单一的大型文件系统。 +
  • +
  • +SnapRAID 不进行数据条带化。 +使用 RAID,您可以通过条带化获得速度提升。 +
  • +
  • +SnapRAID 不支持实时恢复。 +使用 RAID,当磁盘发生故障时,您不必停止工作。 +
  • +
  • +SnapRAID 只能从有限数量的磁盘故障中恢复数据。 +使用备份,您可以从整个磁盘阵列的完全故障中恢复。 +
  • +
  • +仅保存文件名、时间戳、符号链接和硬链接。 +不保存权限、所有权和扩展属性。 +
  • +
+
+
+

+Getting Started +

+

要使用 SnapRAID,您需要首先选择磁盘阵列中的一个磁盘专用于 +`parity`(奇偶校验)信息。使用一个奇偶校验磁盘, +您将能够从单磁盘故障中恢复,类似于 RAID5。 +

如果您想从更多的磁盘故障中恢复,类似于 RAID6, +您必须预留额外的磁盘用于奇偶校验。每增加一个奇偶校验磁盘, +就可以多恢复一个磁盘故障。 +

作为奇偶校验磁盘,您必须选择阵列中最大的磁盘, +因为奇偶校验信息可能会增长到阵列中最大的数据磁盘的大小。 +

这些磁盘将专门用于存储 `parity` 文件。 +您不应该在它们上面存储您的数据。 +

然后,您必须定义要使用 SnapRAID 保护的 `data`(数据)磁盘。 +如果这些磁盘包含很少更改的数据,保护会更有效。因此, +最好**不要**包含 Windows C:\ 磁盘或 Unix 的 /home、/var 和 /tmp 目录。 +

文件列表保存在 `content`(内容)文件中,通常存储在数据、奇偶校验或 +引导磁盘上。 +该文件包含备份的详细信息,包括所有用于验证其完整性的校验和。 +`content` 文件存储有多个副本,每个副本必须位于不同的磁盘上, +以确保存储有多个磁盘故障时,至少有一个副本可用。 +

例如,假设您只对一个奇偶校验保护级别感兴趣,并且您的磁盘位于: +

+/mnt/diskp <- 选定的奇偶校验磁盘
+/mnt/disk1 <- 第一个要保护的磁盘
+/mnt/disk2 <- 第二个要保护的磁盘
+/mnt/disk3 <- 第三个要保护的磁盘
+
+

您必须创建配置文件 /etc/snapraid.conf,并包含以下选项: +

+parity /mnt/diskp/snapraid.parity
+content /var/snapraid/snapraid.content
+content /mnt/disk1/snapraid.content
+content /mnt/disk2/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+
+

如果您使用 Windows,您应该使用 Windows 路径格式, +用驱动器号和反斜杠代替斜杠。 +

+parity E:\snapraid.parity
+content C:\snapraid\snapraid.content
+content F:\array\snapraid.content
+content G:\array\snapraid.content
+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+
+

如果您有许多磁盘且驱动器号用尽,您可以将磁盘直接挂载到子文件夹中。请参阅: +

+https://www.google.com/search?q=Windows+mount+point
+
+

此时,您已准备好运行 `sync` 命令来构建奇偶校验信息。 +

+snapraid sync
+
+

第一次运行此过程可能需要几个小时,具体取决于磁盘上已存在数据的大小。 +如果磁盘是空的,则过程是即时的。 +

您可以随时按 Ctrl+C 停止它,在下次运行时,它将从中断的地方恢复。 +

当此命令完成时,您的数据是**安全的**。 +

现在您可以开始随意使用您的阵列,并定期运行 `sync` 命令更新奇偶校验信息。 +

+

+Scrubbing +

+

要定期检查数据和奇偶校验的错误,您可以运行 `scrub` 命令。 +

+snapraid scrub
+
+

此命令将阵列中的数据与 `sync` 命令期间计算的散列进行比较, +以验证完整性。 +

每次运行该命令会检查大约 8% 的阵列,排除在过去 10 天内 +已被 scrub 的数据。 +您可以使用 -p, --plan 选项来指定不同的量, +并使用 -o, --older-than 选项来指定不同的天数。 +例如,要检查 20 天以上块的 5% 阵列,请使用: +

+snapraid -p 5 -o 20 scrub
+
+

如果在过程中发现静默错误或输入/输出错误, +相应的块会在 `content` 文件中被标记为坏块,并列在 `status` 命令中。 +

+snapraid status
+
+

要修复它们,您可以使用 `fix` 命令,使用 -e, --filter-error 选项过滤坏块: +

+snapraid -e fix
+
+

在下次 `scrub` 时,如果它们确实被修复了,错误将从 `status` 报告中消失。 +为了更快,您可以使用 -p bad 来仅 scrub 标记为坏块的块。 +

+snapraid -p bad scrub
+
+

在未同步的阵列上运行 `scrub` 可能会报告由已删除或已修改文件引起的错误。 +这些错误会在 `scrub` 输出中报告,但相关块不会被标记为坏块。 +

+
+

+Pooling +

+

注意:下面描述的 pooling 功能已被 mergefs 工具取代, +mergefs 现在是 SnapRAID 社区推荐的 Linux 用户选项。 +Mergefs 提供了一种更灵活、更高效的方式,将多个驱动器汇集到一个 +统一的挂载点中,允许跨阵列无缝访问文件,而无需依赖符号链接。 +它与 SnapRAID 很好地集成以提供奇偶校验保护,常用于 +OpenMediaVault (OMV) 或自定义 NAS 配置等设置中。 +

要使阵列中的所有文件显示在同一个目录树中, +您可以启用 `pooling` 功能。它使用符号链接创建了一个 +阵列中所有文件的只读虚拟视图。 +

您可以在配置文件中使用以下选项配置 `pooling` 目录: +

+pool /pool
+
+

或者,如果您使用 Windows,则使用: +

+pool C:\pool
+
+

然后运行 `pool` 命令创建或更新虚拟视图。 +

+snapraid pool
+
+

如果您使用 Unix 平台并希望通过网络将此目录共享给 Windows 或 Unix 机器, +您应该在 /etc/samba/smb.conf 中添加以下选项: +

+# 在 smb.conf 的全局部分
+unix extensions = no
+
+
+# 在 smb.conf 的共享部分
+[pool]
+comment = Pool
+path = /pool
+read only = yes
+guest ok = yes
+wide links = yes
+follow symlinks = yes
+
+

在 Windows 中,通过网络共享符号链接需要客户端远程解析它们。 +要启用此功能,除了共享 pool 目录之外,您还必须独立共享所有磁盘, +使用配置文件中定义的磁盘名称作为共享点。 +您还必须在配置文件的 `share` 选项中指定远程客户端访问这些 +共享磁盘所需的 Windows UNC 路径。 +

例如,在名为 `darkstar` 的服务器上操作,您可以使用以下选项: +

+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+pool C:\pool
+share \\darkstar
+
+

并通过网络共享以下目录: +

+\\darkstar\pool -> C:\pool
+\\darkstar\d1 -> F:\array
+\\darkstar\d2 -> G:\array
+\\darkstar\d3 -> H:\array
+
+

以允许远程客户端访问 \\darkstar\pool 处的所有文件。 +

您可能还需要配置远程客户端,使用以下命令启用对远程符号链接的访问: +

+fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
+
+
+
+

+Undeleting +

+

SnapRAID 的功能更像一个备份程序而不是 RAID 系统, +它可以使用 -f, --filter 选项来恢复或取消删除文件到其以前的状态: +

+snapraid fix -f FILE
+
+

或者对于一个目录: +

+snapraid fix -f DIR/
+
+

您也可以使用 -m, --filter-missing 选项来仅恢复目录内意外删除的文件, +该选项仅恢复丢失的文件,保持所有其他文件不变。 +

+snapraid fix -m -f DIR/
+
+

或者使用以下命令恢复所有驱动器上所有已删除的文件: +

+snapraid fix -m
+
+
+
+

+Recovering +

+

最糟糕的情况发生了,您丢失了一个或多个磁盘! +

**不要惊慌!** 您将能够恢复它们! +

您必须做的第一件事是避免对磁盘阵列进行进一步的更改。 +禁用对其的任何远程连接以及任何计划的进程,包括任何计划的 SnapRAID +夜间同步或 scrub。 +

然后继续执行以下步骤。 +

+

+STEP 1 -> 重新配置 +

+

您需要一些空间来恢复,理想情况下是在额外的备用磁盘上, +但外部 USB 磁盘或远程磁盘也足够。 +

修改 SnapRAID 配置文件,使故障磁盘的 `data` 或 `parity` 选项指向 +一个具有足够空闲空间来恢复文件的位置。 +

例如,如果磁盘 `d1` 发生故障,则从: +

+data d1 /mnt/disk1/
+
+

更改为: +

+data d1 /mnt/new_spare_disk/
+
+

如果需要恢复的磁盘是奇偶校验磁盘,请更新相应的 `parity` 选项。 +如果您有多个故障磁盘,请更新所有它们的配置选项。 +

+
+

+STEP 2 -> 修复 +

+

运行 fix 命令,并将日志存储在外部文件中: +

+snapraid -d NAME -l fix.log fix
+
+

其中 NAME 是磁盘的名称,例如我们前面例子中的 `d1`。 +如果需要恢复的磁盘是奇偶校验磁盘,请使用名称 `parity`、`2-parity` 等。 +如果您有多个故障磁盘,请使用多个 -d 选项来指定所有它们。 +

此命令将花费很长时间。 +

确保您有几 GB 的可用空间来存储 fix.log 文件。 +在有足够可用空间的磁盘上运行它。 +

现在您已经恢复了所有可恢复的内容。如果有些文件部分或完全不可恢复, +它们将被重命名并添加 `.unrecoverable` 扩展名。 +

您可以通过检查所有以 `unrecoverable:` 开头的行,在 fix.log 文件中 +找到所有不可恢复块的详细列表。 +

如果您对恢复不满意,您可以根据需要重试多次。 +

例如,如果您在上次 `sync` 之后从阵列中删除了文件, +这可能导致某些文件无法恢复。 +在这种情况下,您可以使用 -i, --import 选项重试 `fix`, +指定这些文件现在在哪里,以便将它们再次包含在恢复过程中。 +

如果您对恢复感到满意,您可以继续进行, +但请注意,在同步之后,您不能再重试 `fix` 命令了! +

+
+

+STEP 3 -> 检查 +

+

作为一项谨慎的检查,您现在可以运行 `check` 命令,以确保 +恢复的磁盘上的一切都是正确的。 +

+snapraid -d NAME -a check
+
+

其中 NAME 是磁盘的名称,例如我们前面例子中的 `d1`。 +

+
+
+-d 和 -a 选项告诉 SnapRAID 只检查指定的磁盘并忽略所有奇偶校验数据。 +
+
+
+
+

此命令将花费很长时间,但如果您不是过于谨慎,可以跳过它。 +

+
+

+STEP 4 -> 同步 +

+

运行 `sync` 命令以将阵列与新磁盘重新同步。 +

+snapraid sync
+
+

如果所有内容都已恢复,此命令是即时的。 +

+
+
+
+

+Commands +

+

SnapRAID 提供了一些简单的命令,允许您: +

    +
  • +打印阵列的状态 -> `status` +
  • +
  • +控制磁盘 -> `smart`、`probe`、`up`、`down` +
  • +
  • +进行备份/快照 -> `sync` +
  • +
  • +定期检查数据 -> `scrub` +
  • +
  • +恢复上次备份/快照 -> `fix`。 +
  • +
+

命令必须用小写字母书写。 +

+

+status +

+

打印磁盘阵列状态的摘要。 +

它包括有关奇偶校验碎片、块未经检查有多久,以及在 scrubbing +期间遇到的所有记录的静默错误的信息。 +

所提供的信息指的是您上次运行 `sync` 的时间。 +不考虑后来的修改。 +

如果检测到坏块,则会列出它们的块号。 +要修复它们,您可以使用 `fix -e` 命令。 +

它还会显示一个图表,表示每个块上次被 scrub 或 sync 的时间。 +被 scrub 的块显示为 '*',已同步但尚未 scrub 的块显示为 'o'。 +

不会修改任何内容。 +

+
+

+smart +

+

打印系统中所有磁盘的 SMART 报告。 +

它包括对明年故障概率的估计,允许您计划更换显示 +可疑属性的磁盘进行维护。 +

此概率估计是通过将磁盘的 SMART 属性与 +Backblaze 提供的以下数据进行关联获得的: +

+https://www.backblaze.com/hard-drive-test-data.html
+
+

如果 SMART 报告磁盘正在发生故障,则会为该磁盘打印 `FAIL` 或 `PREFAIL`, +并且 SnapRAID 返回错误。 +在这种情况下,**强烈建议**立即更换磁盘。 +

其他可能的状态字符串有: +

+
+
+logfail +
+过去,某些属性低于阈值。 +
+
+
+
+logerr +
+设备错误日志包含错误。 +
+
+
+
+selferr +
+设备自检日志包含错误。 +
+
+
+

如果指定了 -v, --verbose 选项,则会提供更深入的统计分析。 +此分析可以帮助您决定是否需要更多或更少的奇偶校验。 +

此命令使用 `smartctl` 工具,相当于在所有设备上运行 `smartctl -a`。 +

如果您的设备未正确自动检测,您可以使用配置 +文件中的 `smartctl` 选项指定自定义命令。 +

不会修改任何内容。 +

+
+

+probe +

+

打印系统中所有磁盘的**电源**状态。 +

`Standby`(待机)表示磁盘未转动。`Active`(活动)表示 +磁盘正在转动。 +

此命令使用 `smartctl` 工具,相当于在所有设备上运行 +`smartctl -n standby -i`。 +

如果您的设备未正确自动检测,您可以使用配置 +文件中的 `smartctl` 选项指定自定义命令。 +

不会修改任何内容。 +

+
+

+up +

+

使阵列中的所有磁盘转动起来。 +

您可以使用 -d, --filter-disk 选项只启动特定的磁盘。 +

同时启动所有磁盘需要大量的电力。 +确保您的电源能够承受。 +

不会修改任何内容。 +

+
+

+down +

+

使阵列中的所有磁盘停转。 +

此命令使用 `smartctl` 工具,相当于在所有设备上运行 +`smartctl -s standby,now`。 +

您可以使用 -d, --filter-disk 选项只停转特定的磁盘。 +

要在发生错误时自动停转,您可以将 -s, --spin-down-on-error +选项与任何其他命令一起使用,这相当于在发生错误时手动运行 `down`。 +

不会修改任何内容。 +

+
+

+diff +

+

列出自上次 `sync` 以来所有已修改、需要重新计算奇偶校验数据的 +文件。 +

此命令不检查文件数据,仅检查文件时间戳、大小和 inode。 +

列出所有更改的文件后,会显示更改的摘要,按以下方式分组: +

+
+
+equal +
+文件与之前相比未更改。 +
+
+
+
+added +
+之前不存在、已添加的文件。 +
+
+
+
+removed +
+已删除的文件。 +
+
+
+
+updated +
+大小或时间戳不同的文件,表示它们已被修改。 +
+
+
+
+moved +
+在同一磁盘上移动到不同目录的文件。 +它们通过具有相同的名称、大小、时间戳和 inode,但目录不同来识别。 +
+
+
+
+copied +
+在同一磁盘或不同磁盘上复制的文件。请注意,如果 +它们确实移动到了不同的磁盘,它们也会被计入 `removed` 中。 +它们通过具有相同的名称、大小和时间戳来识别。如果亚秒级时间戳为零, +则必须匹配完整路径,而不仅仅是名称。 +
+
+
+
+restored +
+inode 不同但名称、大小和时间戳匹配的文件。 +这些通常是删除后恢复的文件。 +
+
+
+

如果需要 `sync`,进程返回码为 2,而不是默认的 0。 +返回码 1 用于一般错误情况。 +

不会修改任何内容。 +

+
+

+sync +

+

更新奇偶校验信息。读取磁盘阵列中所有已修改的文件, +并更新相应的奇偶校验数据。 +

您可以随时按 Ctrl+C 停止此过程,而不会丢失已完成的工作。 +在下次运行时,`sync` 过程将从中断的地方恢复。 +

如果在过程中发现静默错误或输入/输出错误, +相应的块会被标记为坏块。 +

文件通过路径和/或 inode 识别,并检查大小和时间戳。 +如果文件大小或时间戳不同,则会为整个文件重新计算奇偶校验数据。 +如果文件在同一磁盘上被移动或重命名,保持相同的 inode,则不重新计算奇偶校验。 +如果文件移动到另一个磁盘,则重新计算奇偶校验, +但保留以前计算的散列信息。 +

如果需要,会修改 `content` 和 `parity` 文件。 +阵列中的文件**不会**被修改。 +

+
+

+scrub +

+

Scrub 阵列,检查数据和奇偶校验磁盘中的静默或输入/输出错误。 +

每次调用检查大约 8% 的阵列,排除在过去 10 天内 +已被 scrub 的数据。 +这意味着每周 scrub 一次可确保每隔三个月至少检查一次数据的每一位。 +

您可以使用 -p, --plan 选项定义不同的 scrub 计划或数量, +该选项接受: +bad - Scrub 标记为坏块的块。 +new - Scrub 刚刚同步但尚未 scrub 的块。 +full - Scrub 所有内容。 +0-100 - Scrub 指定百分比的块。 +

如果指定了百分比数量,您还可以使用 -o, --older-than +选项来定义块应该有多旧。 +最旧的块首先被 scrub,确保最佳检查。 +如果您只想 scrub 刚刚同步但尚未 scrub 的块, +请使用 `-p new` 选项。 +

要获取 scrub 状态的详细信息,请使用 `status` 命令。 +

对于发现的任何静默错误或输入/输出错误,相应的块 +会在 `content` 文件中被标记为坏块。 +这些坏块列在 `status` 中,可以使用 `fix -e` 修复。 +修复后,在下次 scrub 时,它们将被重新检查,如果发现已更正, +则会删除坏块标记。 +要仅 scrub 坏块,您可以使用 `scrub -p bad` 命令。 +

建议仅在已同步的阵列上运行 `scrub`,以避免 +由未同步数据引起的报告错误。这些错误被识别为不是静默错误, +并且块不会被标记为坏块,但此类错误会在命令的输出中报告。 +

`content` 文件会被修改以更新每个块上次检查的时间 +并标记坏块。 +`parity` 文件**不会**被修改。 +阵列中的文件**不会**被修改。 +

+
+

+fix +

+

修复所有文件和奇偶校验数据。 +

所有文件和奇偶校验数据都与上次 `sync` 中保存的快照 +状态进行比较。 +如果发现差异,则将其恢复到存储的快照。 +

**警告!** `fix` 命令不区分错误和 +故意修改。它**无条件地**将文件状态恢复到上次 `sync`。 +

如果未指定其他选项,则处理整个阵列。 +使用过滤选项选择要操作的文件或磁盘的子集。 +

要仅修复在 `sync` 和 `scrub` 期间标记为坏块的块, +请使用 -e, --filter-error 选项。 +与其他过滤选项不同,此选项仅对自上次 `sync` 以来未更改的 +文件应用修复。 +

SnapRAID 会重命名所有无法修复的文件,并添加 +`.unrecoverable` 扩展名。 +

在修复之前,会扫描整个阵列以查找自上次 `sync` +操作以来移动的任何文件。 +这些文件通过它们的时间戳识别,忽略它们的名称 +和目录,并在必要时用于恢复过程。 +如果您将其中一些移到了阵列之外,您可以使用 -i, --import +选项指定额外的目录进行扫描。 +

文件仅通过路径识别,而不通过 inode 识别。 +

`content` 文件**不会**被修改。 +如果需要,`parity` 文件会被修改。 +如果需要,阵列中的文件会被修改。 +

+
+

+check +

+

验证所有文件和奇偶校验数据。 +

它的工作方式类似于 `fix`,但它只模拟恢复,**不会**对阵列 +写入任何更改。 +

此命令主要用于手动验证, +例如在恢复过程之后或在其他特殊条件下。 +对于定期和计划的检查,请使用 `scrub`。 +

如果您使用 -a, --audit-only 选项,则仅检查文件 +数据散列,而忽略奇偶校验数据,以加快运行速度。 +

文件仅通过路径识别,而不通过 inode 识别。 +

不会修改任何内容。 +

+
+

+list +

+

列出上次 `sync` 时阵列中包含的所有文件。 +

使用 -v 或 --verbose,还会显示亚秒级时间。 +

不会修改任何内容。 +

+
+

+dup +

+

列出所有重复文件。如果两个文件的散列匹配,则认为它们相等。 +不读取文件数据;仅使用预先计算的散列。 +

不会修改任何内容。 +

+
+

+pool +

+

在 `pooling` 目录中创建或更新磁盘阵列中所有文件 +的虚拟视图。 +

文件不会被复制,而是使用符号链接连接。 +

更新时,所有现有的符号链接和空 +子目录都会被删除,并替换为阵列的新视图。 +任何其他常规文件保留在原位。 +

不会修改 pool 目录之外的任何内容。 +

+
+

+devices +

+

打印阵列使用的低级设备。 +

此命令显示阵列中的设备关联,主要用作脚本接口。 +

前两列是低级设备 ID 和路径。 +接下来的两列是高级设备 ID 和路径。 +最后一列是阵列中的磁盘名称。 +

在大多数情况下,阵列中的每个磁盘都有一个低级设备, +但在一些更复杂的配置中,单个阵列磁盘可能会使用多个 +低级设备。 +

不会修改任何内容。 +

+
+

+touch +

+

为所有亚秒级时间戳设置为零的文件设置一个任意的 +亚秒级时间戳。 +

这提高了 SnapRAID 识别移动和复制文件的能力, +因为它使时间戳几乎独一无二,减少了可能的重复。 +

更具体地说,如果亚秒级时间戳不为零, +则移动或复制的文件在名称、大小和时间戳匹配时被识别为 +此类。如果亚秒级时间戳为零,则仅当完整路径、 +大小和时间戳都匹配时才被视为副本。 +

不会修改秒精度时间戳, +因此会保留文件的所有日期和时间。 +

+
+

+rehash +

+

安排对整个阵列进行重新散列。 +

此命令更改使用的散列类型,通常是在从 32 位系统升级到 64 位系统时, +以从 MurmurHash3 切换到更快的 SpookyHash。 +

如果您已经在使用最佳散列,则此命令不执行任何操作, +并通知您无需执行任何操作。 +

重新散列不会立即执行,而是在 `sync` 和 `scrub` 期间 +逐步进行。 +

您可以使用 `status` 检查重新散列状态。 +

在重新散列期间,SnapRAID 保持完全功能, +唯一的例外是 `dup` 无法使用不同的散列检测重复的文件。 +

+
+
+

+Options +

+

SnapRAID 提供以下选项: +

+
+
+-c, --conf CONFIG +
+选择要使用的配置文件。如果未指定,在 Unix 中, +如果存在,则使用文件 `/usr/local/etc/snapraid.conf`, +否则使用 `/etc/snapraid.conf`。 +在 Windows 中,它使用与 `snapraid.exe` 相同的目录中的文件 `snapraid.conf`。 +
+
+
+
+
+
+-f, --filter PATTERN +
+过滤要在 `check` 和 `fix` 中处理的文件。 +仅处理与指定模式匹配的文件。 +此选项可以多次使用。 +有关模式规范的更多详细信息,请参阅 PATTERN 部分。 +在 Unix 中,如果使用 globbing 字符,请确保它们被引用。 +此选项只能与 `check` 和 `fix` 一起使用。 +不能与 `sync` 和 `scrub` 一起使用,因为它们总是处理整个阵列。 +
+
+
+
+
+
+-d, --filter-disk NAME +
+过滤要在 `check`、`fix`、`up` 和 `down` 中处理的磁盘。 +您必须指定配置文件中定义的磁盘名称。 +您也可以指定奇偶校验磁盘的名称:`parity`、`2-parity`、 +`3-parity` 等,以将操作限制到特定的奇偶校验磁盘。 +如果您组合使用多个 --filter、--filter-disk 和 --filter-missing 选项, +则仅选择与所有过滤器匹配的文件。 +此选项可以多次使用。 +此选项只能与 `check`、`fix`、`up` 和 `down` 一起使用。 +不能与 `sync` 和 `scrub` 一起使用,因为它们总是处理整个阵列。 +
+
+
+
+
+
+-m, --filter-missing +
+过滤要在 `check` 和 `fix` 中处理的文件。 +仅处理阵列中丢失或已删除的文件。 +与 `fix` 一起使用时,此选项充当 `undelete` 命令。 +如果您组合使用多个 --filter、--filter-disk 和 --filter-missing 选项, +则仅选择与所有过滤器匹配的文件。 +此选项只能与 `check` 和 `fix` 一起使用。 +不能与 `sync` 和 `scrub` 一起使用,因为它们总是处理整个阵列。 +
+
+
+
+
+
+-e, --filter-error +
+处理 `check` 和 `fix` 中有错误的文件。 +它仅处理在 `sync` 和 `scrub` 期间块被标记为静默或输入/输出错误的 +文件,如 `status` 中所列。 +此选项只能与 `check` 和 `fix` 一起使用。 +
+
+
+
+
+
+-p, --plan PERC|bad|new|full +
+选择 scrub 计划。如果 PERC 是一个介于 0 到 100 之间的数值, +则将其解释为要 scrub 的块的百分比。 +除了百分比,您还可以指定一个计划: +`bad` scrub 坏块,`new` scrub 尚未 scrub 的块, +`full` scrub 所有内容。 +此选项只能与 `scrub` 一起使用。 +
+
+
+
+
+
+-o, --older-than DAYS +
+选择要在 `scrub` 中处理的阵列的最旧部分。 +DAYS 是块被 scrub 的最小天数;默认值为 10。 +无论此选项如何,标记为坏块的块始终会被 scrub。 +此选项只能与 `scrub` 一起使用。 +
+
+
+
+
+
+-a, --audit-only +
+在 `check` 中,验证文件的散列而不 +检查奇偶校验数据。 +如果您只对检查文件数据感兴趣,此选项可以显著加快 +检查过程。 +此选项只能与 `check` 一起使用。 +
+
+
+
+
+
+-h, --pre-hash +
+在 `sync` 中,运行所有新数据的初步散列阶段, +以便在奇偶校验计算之前进行额外验证。 +通常,在 `sync` 中,不进行初步散列,并且新 +数据仅在首次读取进行奇偶校验计算之前散列。 +此过程在系统处于 +重负载下发生,所有磁盘都在转动,CPU 也很忙。 +这对机器来说是一种极端情况,如果它有潜在的硬件问题, +静默错误可能无法被检测到,因为数据尚未散列。 +为避免此风险,您可以启用 `pre-hash` 模式,将 +所有数据读取两次以确保其完整性。 +此选项还会验证阵列内移动的文件, +以确保移动操作成功,并在必要时 +允许您在继续之前运行 fix 操作。 +此选项只能与 `sync` 一起使用。 +
+
+
+
+
+
+-i, --import DIR +
+从指定目录导入自上次 `sync` 以来从阵列中删除的任何文件。 +如果您仍然拥有此类文件,它们可用于 `check` +和 `fix` 以改进恢复过程。 +读取文件,包括在子目录中,并且无论其名称如何都会被识别。 +此选项只能与 `check` 和 `fix` 一起使用。 +
+
+
+
+
+
+-s, --spin-down-on-error +
+在任何错误发生时,在退出并带有非零状态码之前, +将所有托管的磁盘停转。这可以防止驱动器在中止操作后 +保持活动和转动,有助于避免不必要的热量积聚和功耗。 +使用此选项可确保即使命令失败,磁盘也能安全停止。 +
+
+
+
+
+
+-w, --bw-limit RATE +
+对所有磁盘应用全局带宽限制。RATE 是 +每秒的字节数。您可以指定乘数,例如 K、M 或 G +(例如,--bw-limit 1G)。 +
+
+
+
+
+
+-A, --stats +
+启用扩展状态视图,显示附加信息。 +屏幕显示两个图表: +第一个图表显示每个磁盘的缓冲条带数,以及 +当前正在该磁盘上访问的文件的文件路径。 +通常,最慢的磁盘将没有可用缓冲区, +这决定了可达到的最大带宽。 +第二个图表显示在过去 100 秒内等待所花费的时间百分比。 +预计最慢的磁盘会导致大部分等待时间, +而其他磁盘应该只有很少或没有等待时间, +因为它们可以使用缓冲条带。 +此图表还显示了等待散列计算和 RAID +计算所花费的时间。 +所有计算都与磁盘操作并行运行。 +因此,只要至少一个磁盘有可测量的等待时间, +就表明 CPU 足够快,能够跟上工作负载。 +
+
+
+
+
+
+-Z, --force-zero +
+强制执行不安全的同步操作:同步大小为零但以前非零的文件。 +如果 SnapRAID 检测到这种情况,它会停止进行, +除非您指定此选项。 +这使您可以轻松检测到在系统崩溃后, +某些访问的文件被截断的情况。 +这在带有 ext3/ext4 文件系统的 Linux 中是一种可能的情况。 +此选项只能与 `sync` 一起使用。 +
+
+
+
+
+
+-E, --force-empty +
+强制执行不安全的同步操作:同步所有原始文件丢失的磁盘。 +如果 SnapRAID 检测到磁盘上最初存在的所有文件都丢失或被重写, +它会停止进行,除非您指定此选项。 +这使您可以轻松检测到数据文件系统未挂载的情况。 +此选项只能与 `sync` 一起使用。 +
+
+
+
+
+
+-U, --force-uuid +
+强制执行不安全的同步、检查和修复操作,当磁盘更改了它们的 UUID 时。 +如果 SnapRAID 检测到某些磁盘更改了 UUID, +它会停止进行,除非您指定此选项。 +这使您可以检测到您的磁盘被挂载在 +错误的挂载点的情况。 +但是,允许在单奇偶校验下进行单个 UUID 更改, +在多奇偶校验下进行更多更改,因为这是恢复后更换磁盘时的正常情况。 +此选项只能与 `sync`、`check` 或 `fix` 一起使用。 +
+
+
+
+
+
+-D, --force-device +
+强制执行不安全的修复操作,当磁盘无法访问或位于同一物理设备上时。 +例如,如果您丢失了两个数据磁盘,并且有一个备用磁盘 +只能恢复第一个,您可以忽略第二个无法访问的磁盘。 +或者,如果您想在已使用的磁盘上剩余的可用空间中恢复一个磁盘, +共享同一物理设备。 +此选项只能与 `fix` 一起使用。 +
+
+
+
+
+
+-N, --force-nocopy +
+在 `sync`、`check` 和 `fix` 中,禁用复制检测启发式。 +如果没有此选项,SnapRAID 假定具有相同属性(例如名称、大小和时间戳) +的文件是具有相同数据的副本。 +这允许识别从一个磁盘移动到另一个磁盘的复制或移动的文件, +并重用已计算的散列信息以检测静默错误或恢复丢失的文件。 +在某些罕见的情况下,此行为可能导致误报 +或由于许多散列验证而导致过程缓慢,此选项允许您解决此类问题。 +此选项只能与 `sync`、`check` 和 `fix` 一起使用。 +
+
+
+
+
+
+-F, --force-full +
+在 `sync` 中,强制完全重新计算奇偶校验。 +当您添加新的奇偶校验级别或如果使用较新的奇偶校验数据恢复到旧的内容文件时, +可以使用此选项。 +这允许您重用内容文件中存在的散列来验证数据, +并使用现有奇偶校验数据在 `sync` 过程中保持数据保护, +而不是从头开始重新创建奇偶校验。 +此选项只能与 `sync` 一起使用。 +
+
+
+
+
+
+-R, --force-realloc +
+在 `sync` 中,强制完全重新分配文件并重建奇偶校验。 +此选项可用于完全重新分配所有文件, +消除碎片,同时重用内容文件中存在的散列来验证数据。 +此选项只能与 `sync` 一起使用。 +**警告!** 此选项仅供专家使用,强烈建议不要使用它。 +在 `sync` 操作期间,您**没有**数据保护。 +
+
+
+
+
+
+-l, --log FILE +
+将详细日志写入指定文件。 +如果未指定此选项,则会将意外错误打印到屏幕, +在出现许多错误的情况下,可能导致输出过多。 +指定 -l, --log 时,仅将导致 SnapRAID 停止的**致命错误**打印到 +屏幕。 +如果路径以 '>>' 开头,则文件以追加模式打开。 +名称中的 '%D' 和 '%T' 出现会被替换为日期和时间,格式分别为 YYYYMMDD 和 +HHMMSS。在 Windows 批处理文件中,您必须双写 '%' 字符, +例如 result-%%D.log。要使用 '>>',您必须将名称括在引号中, +例如 `">>result.log"`。 +要将日志输出到标准输出或标准错误, +您可以使用 `">&1"` 和 `">&2"`。 +有关日志标签描述,请参阅 snapraid_log.txt 文件或 man 页面。 +
+
+
+
+
+
+-L, --error-limit NUMBER +
+设置停止执行前的新错误限制。 +默认情况下,如果 SnapRAID 遇到超过 100 个 +输入/输出错误,它会停止,表明磁盘可能正在发生故障。 +此选项影响 `sync` 和 `scrub`,它们被允许在第一组 +磁盘错误后继续,以尝试完成其操作。 +但是,`check` 和 `fix` 总是会在第一次错误时停止。 +
+
+
+
+
+
+-S, --start BLKSTART +
+从指定的块号开始处理。 +在磁盘损坏的情况下,这对于重试检查或修复特定块可能很有用。 +此选项主要用于高级手动恢复。 +
+
+
+
+
+
+-B, --count BLKCOUNT +
+仅处理指定数量的块。 +此选项主要用于高级手动恢复。 +
+
+
+
+
+
+-C, --gen-conf CONTENT +
+从现有内容文件生成一个虚拟配置文件。 +配置文件写入标准输出,不会覆盖现有文件。 +此配置文件还包含在您丢失整个系统的情况下 +重建磁盘挂载点所需的信息。 +
+
+
+
+
+
+-v, --verbose +
+向屏幕打印更多信息。 +如果指定一次,它会打印排除的文件 +和附加统计信息。 +此选项对日志文件没有影响。 +
+
+
+
+
+
+-q, --quiet +
+向屏幕打印更少信息。 +如果指定一次,它会删除进度条;两次, +正在运行的操作;三次,信息 +消息;四次,状态消息。 +致命错误始终会打印到屏幕。 +此选项对日志文件没有影响。 +
+
+
+
+
+
+-H, --help +
+打印简短的帮助屏幕。 +
+
+
+
+
+
+-V, --version +
+打印程序版本。 +
+
+
+
+
+

+Configuration +

+

SnapRAID 需要一个配置文件来了解您的磁盘阵列 +位于何处以及在哪里存储奇偶校验信息。 +

在 Unix 中,如果存在,它使用文件 `/usr/local/etc/snapraid.conf`, +否则使用 `/etc/snapraid.conf`。 +在 Windows 中,它使用与 `snapraid.exe` 相同的目录中的文件 `snapraid.conf`。 +

它必须包含以下选项(区分大小写): +

+

+parity FILE [,FILE] ... +

+

定义用于存储奇偶校验信息的文件。 +奇偶校验可实现针对单个磁盘 +故障的保护,类似于 RAID5。 +

您可以指定多个文件,它们必须位于不同的磁盘上。 +当一个文件不能再增长时,使用下一个文件。 +总可用空间必须至少与阵列中最大的数据磁盘一样大。 +

您可以稍后添加额外的奇偶校验文件,但是您 +不能重新排序或删除它们。 +

将奇偶校验磁盘保留用于奇偶校验可确保它们不会碎片化,从而提高性能。 +

在 Windows 中,每个磁盘会留下 256 MB 未使用空间,以避免 +有关磁盘已满的警告。 +

此选项是强制性的,并且只能使用一次。 +

+
+

+(2,3,4,5,6)-parity FILE [,FILE] ... +

+

定义用于存储额外奇偶校验信息的文件。 +

为指定的每个奇偶校验级别启用一个额外的保护级别: +

    +
  • +2-parity 启用 RAID6 双奇偶校验。 +
  • +
  • +3-parity 启用三奇偶校验。 +
  • +
  • +4-parity 启用四奇偶校验。 +
  • +
  • +5-parity 启用五奇偶校验。 +
  • +
  • +6-parity 启用六奇偶校验。 +
  • +
+

每个奇偶校验级别都需要存在所有先前的奇偶校验级别。 +

与 'parity' 选项相同的注意事项适用。 +

这些选项是可选的,并且只能使用一次。 +

+
+

+z-parity FILE [,FILE] ... +

+

定义用于存储三奇偶校验的备用文件和格式。 +

此选项是 '3-parity' 的替代方案,主要面向不支持 +SSSE3 指令集的低端 CPU,如 ARM 或 AMD Phenom、Athlon 和 Opteron。 +在这种情况下,它提供了更好的性能。 +

此格式类似于 ZFS RAIDZ3 使用的格式,但更快。 +与 ZFS 一样,它在三奇偶校验之外不起作用。 +

当使用 '3-parity' 时,如果建议使用 'z-parity' 格式以提高性能, +您将收到警告。 +

可以通过调整配置文件中的所需 z-parity 或 3-parity 文件, +并使用 'fix' 重新创建它,从一种格式转换为另一种格式。 +

+
+

+content FILE +

+

定义用于存储磁盘阵列中所有文件的列表和校验和的文件。 +

它可以放置在用于数据、奇偶校验或 +任何其他可用磁盘上。 +如果您使用数据磁盘,此文件会自动从 `sync` 过程中排除。 +

此选项是强制性的,并且可以多次使用以保存 +同一文件的多个副本。 +

您必须为使用的每个奇偶校验磁盘存储至少一个副本, +再加上一个。使用额外的副本不会有害。 +

+
+

+data NAME DIR +

+

定义阵列中数据磁盘的名称和挂载点。 +NAME 用于标识磁盘,并且必须是唯一的。 +DIR 是磁盘在文件系统中的挂载点。 +

您可以根据需要更改挂载点,只要保持 NAME 固定即可。 +

您应该为阵列中的每个数据磁盘使用一个选项。 +

您可以通过直接在配置文件中更改 NAME,然后运行 `sync` 命令来 +稍后重命名磁盘。 +在重命名的情况下,关联是使用存储的磁盘 UUID 完成的。 +

+
+

+nohidden +

+

排除所有隐藏文件和目录。 +在 Unix 中,隐藏文件是以 `.` 开头的文件。 +在 Windows 中,它们是具有隐藏属性的文件。 +

+
+

+exclude/include PATTERN +

+

定义要从同步过程中排除或包含的文件或目录模式。 +所有模式都按指定的顺序处理。 +

如果匹配的第一个模式是 `exclude` 模式,则排除该文件。 +如果它是 `include` 模式,则包含该文件。 +如果没有模式匹配,则如果指定的最后一个模式是 `include`,则排除该文件, +或者如果指定的最后一个模式是 `exclude`,则包含该文件。 +

有关模式规范的更多详细信息,请参阅 PATTERN 部分。 +

此选项可以多次使用。 +

+
+

+blocksize SIZE_IN_KIBIBYTES +

+

定义奇偶校验的基本块大小(以 KiB 为单位)。 +一 KiB 是 1024 字节。 +

默认的 blocksize 是 256,这应该适用于大多数情况。 +

**警告!** 此选项仅供专家使用,强烈建议不要更改此值。 +将来要更改此值,您将需要重新创建整个奇偶校验! +

使用不同 blocksize 的一个原因是,如果您有许多小型文件, +数量级为数百万。 +

对于每个文件,即使只有几个字节,也会分配一个完整的奇偶校验块, +并且对于许多文件,这可能导致大量的未使用奇偶校验空间。 +当您完全填满奇偶校验磁盘时,不允许向数据磁盘 +添加更多文件。 +但是,浪费的奇偶校验不会跨数据磁盘累积。 +数据磁盘上大量文件导致的浪费空间仅限制该数据磁盘上的数据量, +而不限制其他磁盘上的数据量。 +

作为一个近似值,您可以假设每个文件浪费了半个块大小的空间。 +例如,对于 100,000 个文件和 256 KiB 的块大小,您将浪费 12.8 GB 的奇偶校验空间, +这可能导致数据磁盘上少 12.8 GB 的可用空间。 +

您可以使用 `status` 检查每个磁盘上浪费的空间量。 +这是您必须在数据磁盘上留出的空闲空间量, +或用于不包含在阵列中的文件的空间量。 +如果此值为负,则表示您即将填满奇偶校验空间, +它表示您仍然可以浪费的空间。 +

为避免此问题,您可以为奇偶校验使用更大的分区。 +例如,如果奇偶校验分区比数据磁盘大 12.8 GB, +则您有足够的额外空间来处理每个数据磁盘上多达 100,000 个 +文件而不会浪费任何空间。 +

在 Linux 中获得更大的奇偶校验分区的一个技巧是使用以下命令格式化它: +

+mkfs.ext4 -m 0 -T largefile4 DEVICE
+
+

这会导致大约 1.5% 的额外空间,对于 4 TB 磁盘约为 60 GB, +这允许每个数据磁盘上大约 460,000 个文件而不会浪费任何空间。 +

+
+

+hashsize SIZE_IN_BYTES +

+

定义保存块的散列大小(以字节为单位)。 +

默认的 hashsize 是 16 字节(128 位),这应该适用于大多数情况。 +

**警告!** 此选项仅供专家使用,强烈建议不要更改此值。 +将来要更改此值,您将需要重新创建整个奇偶校验! +

使用不同 hashsize 的一个原因是,如果您的系统内存有限。 +根据经验,SnapRAID 通常每 16 TB 的阵列数据需要 1 GiB 的 RAM。 +

具体来说,为了存储数据的散列,SnapRAID 大约需要 +$TS*(1+HS)/BS$ 字节的 RAM, +其中 $TS$ 是您的磁盘阵列的总大小(以字节为单位),$BS$ 是块大小(以字节为单位), +$HS$ 是散列大小(以字节为单位)。 +

例如,对于 8 个 4 TB 磁盘,块大小为 256 KiB +(1 KiB = 1024 字节),散列大小为 16,您将获得: +

+RAM = $(8 * 4 * 10^{12}) * (1+16) / (256 * 2^{10}) = 1.93$ GiB
+
+

切换到散列大小为 8,您将获得: +

+RAM = $(8 * 4 * 10^{12}) * (1+8) / (256 * 2^{10}) = 1.02$ GiB
+
+

切换到块大小为 512,您将获得: +

+RAM = $(8 * 4 * 10^{12}) * (1+16) / (512 * 2^{10}) = 0.96$ GiB
+
+

切换到散列大小为 8 和块大小为 512,您将获得: +

+RAM = $(8 * 4 * 10^{12}) * (1+8) / (512 * 2^{10}) = 0.51$ GiB
+
+
+
+

+autosave SIZE_IN_GIGABYTES +

+

在同步或 scrub 之后,处理指定数量的 GB 后,自动保存状态。 +此选项有助于避免在机器崩溃或任何其他事件中断时, +从头开始重新启动长时间的 `sync` 命令。 +

+
+

+temp_limit TEMPERATURE_CELSIUS +

+

设置允许的最高磁盘温度(摄氏度)。指定后, +SnapRAID 会使用 smartctl 工具定期检查所有磁盘的温度。 +SnapRAID 运行时会显示当前磁盘温度。 +如果任何磁盘超过此限制,所有操作都会停止, +并在 `temp_sleep` 选项定义的持续时间内将磁盘停转(置于待机状态)。 +在休眠期过后,操作恢复,如果温度限制再次达到, +可能会再次暂停。 +

在操作期间,SnapRAID 还会分析每个磁盘的加热曲线, +并估计如果活动继续,它们预计将达到的长期稳定温度。 +仅在磁盘温度增加了四次后才执行估计, +以确保有足够的数据点来建立可靠的趋势。 +此预测的稳定温度显示在当前值旁边的括号中, +有助于评估系统的冷却是否足够。 +此估计温度仅供参考,对 SnapRAID 的行为没有影响。 +程序的动作仅基于实际测量的磁盘温度。 +

要执行此分析,SnapRAID 需要一个系统温度的参考。 +它首先尝试从可用的硬件传感器读取。 +如果无法访问系统传感器,它会使用运行时测量的最低磁盘温度 +作为备用参考。 +

通常,SnapRAID 只显示最热磁盘的温度。 +要显示所有磁盘的温度,请使用 -A 或 --stats 选项。 +

+
+

+temp_sleep TIME_IN_MINUTES +

+

设置达到温度限制时的待机时间(以分钟为单位)。 +在此期间,磁盘保持停转状态。默认值为 5 分钟。 +

+
+

+pool DIR +

+

定义 `pooling` 目录,其中使用 `pool` 命令创建磁盘 +阵列的虚拟视图。 +

目录必须已经存在。 +

+
+

+share UNC_DIR +

+

定义远程访问磁盘所需的 Windows UNC 路径。 +

如果指定了此选项,则在 pool 目录中创建的符号链接会使用此 UNC 路径 +来访问磁盘。 +如果没有此选项,则生成的符号链接仅使用本地路径, +这不允许通过网络共享 pool 目录。 +

符号链接是使用指定的 UNC 路径,添加在 `data` 选项中指定的 +磁盘名称,最后添加文件目录和名称形成的。 +

此选项仅在 Windows 中需要。 +

+
+

+smartctl DISK/PARITY OPTIONS... +

+

定义自定义 smartctl 选项以获取每个磁盘的 SMART 属性。 +这对于 RAID 控制器和一些无法自动检测的 USB +磁盘可能需要。%s 占位符会被设备名称替换, +但对于固定的设备(如 RAID 控制器)是可选的。 +

DISK 是在 `data` 选项中指定的相同磁盘名称。 +PARITY 是奇偶校验名称之一:`parity`、`2-parity`、`3-parity`、 +`4-parity`、`5-parity`、`6-parity` 或 `z-parity`。 +

在指定的 OPTIONS 中,字符串 `%s` 被设备名称替换。 +对于 RAID 控制器,设备可能是固定的, +您可能不需要使用 `%s`。 +

请参阅 smartmontools 文档以了解可能的选项: +

+https://www.smartmontools.org/wiki/Supported_RAID-Controllers
+https://www.smartmontools.org/wiki/Supported_USB-Devices
+
+

例如: +

+smartctl parity -d sat %s
+
+
+
+

+smartignore DISK/PARITY ATTR [ATTR...] +

+

在计算磁盘故障概率时忽略指定的 SMART 属性。 +如果磁盘报告了特定属性的不寻常或误导值,此选项很有用。 +

DISK 是在 `data` 选项中指定的相同磁盘名称。 +PARITY 是奇偶校验名称之一:`parity`、`2-parity`、`3-parity`、 +`4-parity`、`5-parity`、`6-parity` 或 `z-parity`。 +特殊值 * 可用于在所有磁盘上忽略该属性。 +

例如,要在所有磁盘上忽略 `Current Pending Sector Count` 属性: +

+smartignore * 197
+
+

要仅在第一个奇偶校验磁盘上忽略它: +

+smartignore parity 197
+
+
+
+

+Examples +

+

Unix 的典型配置示例如下: +

+parity /mnt/diskp/snapraid.parity
+content /mnt/diskp/snapraid.content
+content /var/snapraid/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+exclude /lost+found/
+exclude /tmp/
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/sg0
+smartctl 2-parity -d areca,2/1 /dev/sg0
+
+

Windows 的典型配置示例如下: +

+parity E:\snapraid.parity
+content E:\snapraid.content
+content C:\snapraid\snapraid.content
+data d1 G:\array\
+data d2 H:\array\
+data d3 I:\array\
+exclude Thumbs.db
+exclude \$RECYCLE.BIN
+exclude \System Volume Information
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/arcmsr0
+smartctl 2-parity -d areca,2/1 /dev/arcmsr0
+
+
+
+
+

+Pattern +

+

模式提供了一种灵活的方法来过滤要包含或排除的文件。通过使用通配符(globbing), +您可以定义匹配特定文件名或整个目录结构的规则,而无需手动列出每个路径。 +

问号 `?` 匹配除目录分隔符以外的任何单个字符。这使得它在匹配具有变量字符 +的文件名时非常有用,同时将模式限制在单个目录层级内。 +

单星号 `*` 匹配任何字符序列,但与问号一样,它绝不会跨越目录边界。 +它在正斜杠处停止,因此适用于匹配单个路径组件内的内容。 +这是 Shell 通配符中常见的标准行为。 +

双星号 `**` 功能更强大,它可以匹配任何字符序列,包括目录分隔符。 +这允许模式匹配跨越多个目录层级。当 `**` 直接嵌入在模式中时, +它可以匹配零个或多个字符,包括周围文字文本之间的斜杠。 +

`**` 最重要的用法是特殊形式 `/**/`。它可以匹配零个或多个完整的目录层级, +从而可以在不知道确切路径结构的情况下,匹配目录树中任何深度的文件。 +例如,模式 `src/**/main.js` 匹配 `src/main.js`(跳过零个目录)、 +`src/ui/main.js`(跳过一个目录)以及 `src/ui/components/main.js` +(跳过两个目录)。 +

使用方括号 `[]` 的字符类匹配指定集合或范围内的单个字符。 +与其他单字符模式一样,它们不匹配目录分隔符。字符类支持使用 +感叹号进行范围指定和否定。 +

需要记住的根本区别是,`*`、`?` 和字符类都遵循目录边界, +并且仅在单个路径组件内匹配,而 `**` 是唯一可以跨越目录分隔符匹配的模式。 +

有四种不同类型的模式: +

+
+
+FILE +
+选择任何名为 FILE 的文件。 +此模式仅适用于文件,不适用于目录。 +
+
+
+
+
+
+DIR/ +
+选择任何名为 DIR 的目录及其内部的所有内容。 +此模式仅适用于目录,不适用于文件。 +
+
+
+
+
+
+/PATH/FILE +
+选择指定的确切文件路径。此模式仅适用于文件,不适用于目录。 +
+
+
+
+
+
+/PATH/DIR/ +
+选择指定的确切目录路径及其内部的所有内容。此模式仅适用于目录, +不适用于文件。 +
+
+
+

当您指定以 / 开头的绝对路径时,它应用于阵列**根目录**, +而不是本地文件系统根目录。 +

在 Windows 中,您可以使用反斜杠 \ 代替正斜杠 /。 +Windows 系统目录、连接点、挂载点和其他 Windows +特殊目录被视为文件,这意味着要排除它们, +您必须使用文件规则,而不是目录规则。 +

如果文件名包含 '*'、'?'、'[' +或 ']' 字符,您必须对其进行转义,以避免将其解释为 +globbing 字符。在 Unix 中,转义字符是 '\';在 Windows 中,它是 '^'。 +当模式在命令行上时,您必须双写转义 +字符,以避免命令 shell 对其进行解释。 +

在配置文件中,您可以使用不同的策略来过滤要处理的文件。 +最简单的方法是仅使用 `exclude` 规则来删除所有您不想处理的 +文件和目录。例如: +

+# 排除任何名为 `*.unrecoverable` 的文件
+exclude *.unrecoverable
+# 排除根目录 `/lost+found`
+exclude /lost+found/
+# 排除任何名为 `tmp` 的子目录
+exclude tmp/
+
+

相反的方法是仅定义您想要处理的文件,仅使用 `include` 规则。例如: +

+# 仅包含一些目录
+include /movies/
+include /musics/
+include /pictures/
+
+

最后的方法是混合使用 `exclude` 和 `include` 规则。在这种情况下, +规则的顺序很重要。较早的规则优先于 +较晚的规则。 +为了简化,您可以先列出所有 `exclude` 规则,然后 +列出所有 `include` 规则。例如: +

+# 排除任何名为 `*.unrecoverable` 的文件
+exclude *.unrecoverable
+# 排除任何名为 `tmp` 的子目录
+exclude tmp/
+# 仅包含一些目录
+include /movies/
+include /musics/
+include /pictures/
+
+

在命令行上,使用 -f 选项,您只能使用 `include` +模式。例如: +

+# 仅检查 .mp3 文件。
+# 在 Unix 中,使用引号以避免 shell 扩展 globbing。
+snapraid -f "*.mp3" check
+
+

在 Unix 中,在命令行上使用 globbing 字符时,必须 +引用它们以防止 shell 扩展它们。 +

+
+

+Ignore File +

+

除了配置文件中的全局规则外,您还可以在阵列内的任何目录中放置 +`.snapraidignore` 文件,以定义分散的排除规则。 +

在 `.snapraidignore` 中定义的规则会在配置文件中的规则之后应用。 +这意味着它们具有更高的优先级,可用于排除先前由全局配置包含的文件。 +实际上,如果本地规则匹配,则无论全局包含设置如何,该文件都会被排除。 +

`.snapraidignore` 中的模式逻辑与全局配置相同,但模式锚定在 +该文件所在的目录: +

+
+
+FILE +
+选择此目录或其下方任何名为 FILE 的文件。 +这遵循与全局模式相同的通配符规则。 +
+
+
+
+
+
+DIR/ +
+选择任何名为 DIR 的目录及其内部的所有内容, +位于此目录或其下方。 +
+
+
+
+
+
+/PATH/FILE +
+选择相对于 `.snapraidignore` 文件位置指定的精确文件。 +
+
+
+
+
+
+/PATH/DIR/ +
+选择相对于 `.snapraidignore` 文件位置指定的精确目录 +及其内部的所有内容。 +
+
+
+

与全局配置不同,`.snapraidignore` 文件仅支持排除规则; +您不能使用 `include` 模式或否定符号 (!)。 +

例如,如果您在 `/mnt/disk1/projects/` 中有一个 `.snapraidignore`: +

+# 仅排除 /mnt/disk1/projects/output.bin
+/output.bin
+# 排除 projects/ 中任何名为 'build' 的目录
+build/
+# 排除 projects/ 或其子文件夹中任何 .tmp 文件
+*.tmp
+
+
+
+

+Content +

+

SnapRAID 将文件列表和校验和存储在 content 文件中。 +

它是一个二进制文件,列出了磁盘阵列中存在的所有文件, +以及用于验证其完整性的所有校验和。 +

此文件由 `sync` 和 `scrub` 命令读取和写入,并由 +`fix`、`check` 和 `status` 命令读取。 +

+
+

+Parity +

+

SnapRAID 将阵列的奇偶校验信息存储在 parity 文件中。 +

这些是二进制文件,包含 `content` 文件中定义的所有 +块的计算奇偶校验。 +

这些文件由 `sync` 和 `fix` 命令读取和写入, +并且仅由 `scrub` 和 `check` 命令读取。 +

+
+

+Encoding +

+

SnapRAID 在 Unix 中忽略任何编码。它读取并存储 +文件系统使用的相同编码的文件名。 +

在 Windows 中,从文件系统读取的所有名称都会被转换并 +以 UTF-8 格式处理。 +

要使文件名正确打印,您必须使用命令 `chcp 65001` 将 Windows +控制台设置为 UTF-8 模式,并使用 TrueType 字体,如 `Lucida Console`, +作为控制台字体。这仅影响打印的文件名;如果 +您将控制台输出重定向到文件,则生成的文件始终 +采用 UTF-8 格式。 +

+ + +
+
+
+ + + + + + + diff --git a/beta/manual.html b/beta/manual.html new file mode 100644 index 00000000..e4160543 --- /dev/null +++ b/beta/manual.html @@ -0,0 +1,2022 @@ + + + + + + + + SnapRAID Manual + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + +
+ +
+ +
+

+Synopsis +

+
+snapraid [-c, --conf CONFIG]
+    [-f, --filter PATTERN] [-d, --filter-disk NAME]
+    [-m, --filter-missing] [-e, --filter-error]
+    [-a, --audit-only] [-h, --pre-hash] [-i, --import DIR]
+    [-p, --plan PERC|bad|new|full]
+    [-o, --older-than DAYS] [-l, --log FILE]
+    [-s, --spin-down-on-error] [-w, --bw-limit RATE]
+    [-t, --tail]
+    [-Z, --force-zero] [-E, --force-empty]
+    [-U, --force-uuid] [-D, --force-device]
+    [-N, --force-nocopy] [-F, --force-full]
+    [-R, --force-realloc] [-W, --force-realloc-tail]
+    [-S, --start BLKSTART] [-B, --count BLKCOUNT]
+    [-L, --error-limit NUMBER]
+    [-A, --stats]
+    [-v, --verbose] [-q, --quiet]
+    status|smart|probe|up|down|diff|sync|scrub|fix|check
+    |list|dup|pool|devices|touch|rehash|locate
+
+
+snapraid [-V, --version] [-H, --help] [-C, --gen-conf CONTENT]
+
+
+
+

+Description +

+

SnapRAID is a backup program designed for disk arrays, storing +parity information for data recovery in the event of up to six +disk failures. +

Primarily intended for home media centers with large, +infrequently changing files, SnapRAID offers several features: +

    +
  • +You can utilize disks already filled with files without the +need to reformat them, accessing them as usual. +
  • +
  • +All your data is hashed to ensure data integrity and prevent +silent corruption. +
  • +
  • +When the number of failed disks exceeds the parity count, +data loss is confined to the affected disks; data on +other disks remains accessible. +
  • +
  • +If you accidentally delete files on a disk, recovery is +possible. +
  • +
  • +Disks can have different sizes. +
  • +
  • +You can add disks at any time. +
  • +
  • +SnapRAID doesn't lock in your data; you can stop using it +anytime without reformatting or moving data. +
  • +
  • +To access a file, only a single disk needs to spin, saving +power and reducing noise. +
  • +
+

For more information, please visit the official SnapRAID site: +

+https://www.snapraid.it/
+
+
+
+

+Limitations +

+

SnapRAID is a hybrid between a RAID and a backup program, aiming to combine +the best benefits of both. However, it has some limitations that you should +consider before using it. +

The main limitation is that if a disk fails and you haven't recently synced, +you may not be able to fully recover. +More specifically, you may be unable to recover up to the size of +the changed or deleted files since the last sync operation. +This occurs even if the changed or deleted files are not on the +failed disk. This is why SnapRAID is better suited for +data that rarely changes. +

On the other hand, newly added files don't prevent recovery of already +existing files. You will only lose the recently added files if they +are on the failed disk. +

Other SnapRAID limitations are: +

    +
  • +With SnapRAID, you still have separate file systems for each disk. +With RAID, you get a single large file system. +
  • +
  • +SnapRAID doesn't stripe data. +With RAID, you get a speed boost with striping. +
  • +
  • +SnapRAID doesn't support real-time recovery. +With RAID, you do not have to stop working when a disk fails. +
  • +
  • +SnapRAID can recover data only from a limited number of disk failures. +With a backup, you can recover from a complete +failure of the entire disk array. +
  • +
  • +Only file names, timestamps, symlinks, and hardlinks are saved. +Permissions, ownership, and extended attributes are not saved. +
  • +
+
+
+

+Getting Started +

+

To use SnapRAID, you need to first select one disk in your disk array +to dedicate to `parity` information. With one disk for parity, you +will be able to recover from a single disk failure, similar to RAID5. +

If you want to recover from more disk failures, similar to RAID6, +you must reserve additional disks for parity. Each additional parity +disk allows recovery from one more disk failure. +

As parity disks, you must pick the largest disks in the array, +as the parity information may grow to the size of the largest data +disk in the array. +

These disks will be dedicated to storing the `parity` files. +You should not store your data on them. +

Then, you must define the `data` disks that you want to protect +with SnapRAID. The protection is more effective if these disks +contain data that rarely changes. For this reason, it's better to +NOT include the Windows C:\ disk or the Unix /home, /var, and /tmp +directories. +

The list of files is saved in the `content` files, usually +stored on the data, parity, or boot disks. +This file contains the details of your backup, including all the +checksums to verify its integrity. +The `content` file is stored in multiple copies, and each copy must +be on a different disk to ensure that, even in case of multiple +disk failures, at least one copy is available. +

For example, suppose you are interested in only one parity level +of protection, and your disks are located at: +

+/mnt/diskp <- selected disk for parity
+/mnt/disk1 <- first disk to protect
+/mnt/disk2 <- second disk to protect
+/mnt/disk3 <- third disk to protect
+
+

You must create the configuration file /etc/snapraid.conf with +the following options: +

+parity /mnt/diskp/snapraid.parity
+content /var/snapraid/snapraid.content
+content /mnt/disk1/snapraid.content
+content /mnt/disk2/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+
+

If you are on Windows, you should use the Windows path format, with drive +letters and backslashes instead of slashes. +

+parity E:\snapraid.parity
+content C:\snapraid\snapraid.content
+content F:\array\snapraid.content
+content G:\array\snapraid.content
+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+
+

If you have many disks and run out of drive letters, you can mount +disks directly in subfolders. See: +

+https://www.google.com/search?q=Windows+mount+point
+
+

At this point, you are ready to run the `sync` command to build the +parity information. +

+snapraid sync
+
+

This process may take several hours the first time, depending on the size +of the data already present on the disks. If the disks are empty, +the process is immediate. +

You can stop it at any time by pressing Ctrl+C, and at the next run, it +will resume where it was interrupted. +

When this command completes, your data is SAFE. +

Now you can start using your array as you like and periodically +update the parity information by running the `sync` command. +

+

+Scrubbing +

+

To periodically check the data and parity for errors, you can +run the `scrub` command. +

+snapraid scrub
+
+

This command compares the data in your array with the hash computed +during the `sync` command to verify integrity. +

Each run of the command checks approximately 8% of the array, excluding data +already scrubbed in the previous 10 days. +You can use the -p, --plan option to specify a different amount +and the -o, --older-than option to specify a different age in days. +For example, to check 5% of the array for blocks older than 20 days, use: +

+snapraid -p 5 -o 20 scrub
+
+

If silent or input/output errors are found during the process, +the corresponding blocks are marked as bad in the `content` file +and listed in the `status` command. +

+snapraid status
+
+

To fix them, you can use the `fix` command, filtering for bad blocks with +the -e, --filter-error option: +

+snapraid -e fix
+
+

At the next `scrub`, the errors will disappear from the `status` report +if they are truly fixed. To make it faster, you can use -p bad to scrub +only blocks marked as bad. +

+snapraid -p bad scrub
+
+

Running `scrub` on an unsynced array may report errors caused by +removed or modified files. These errors are reported in the `scrub` +output, but the related blocks are not marked as bad. +

+
+

+Pooling +

+

Note: The pooling feature described below has been superseded by the +mergefs tool, which is now the recommended option for Linux users in +the SnapRAID community. Mergefs provides a more flexible and efficient +way to pool multiple drives into a single unified mount point, +allowing seamless access to files across your array without relying +on symbolic links. It integrates well with SnapRAID for parity +protection and is commonly used in setups like OpenMediaVault (OMV) +or custom NAS configurations. +

To have all the files in your array shown in the same directory tree, +you can enable the `pooling` feature. It creates a read-only virtual +view of all the files in your array using symbolic links. +

You can configure the `pooling` directory in the configuration file with: +

+pool /pool
+
+

or, if you are on Windows, with: +

+pool C:\pool
+
+

and then run the `pool` command to create or update the virtual view. +

+snapraid pool
+
+

If you are using a Unix platform and want to share this directory +over the network to either Windows or Unix machines, you should add +the following options to your /etc/samba/smb.conf: +

+# In the global section of smb.conf
+unix extensions = no
+
+
+# In the share section of smb.conf
+[pool]
+comment = Pool
+path = /pool
+read only = yes
+guest ok = yes
+wide links = yes
+follow symlinks = yes
+
+

In Windows, sharing symbolic links over a network requires clients to +resolve them remotely. To enable this, besides sharing the pool directory, +you must also share all the disks independently, using the disk names +defined in the configuration file as share points. You must also specify +in the `share` option of the configuration file the Windows UNC path that +remote clients need to use to access these shared disks. +

For example, operating from a server named `darkstar`, you can use +the options: +

+data d1 F:\array\
+data d2 G:\array\
+data d3 H:\array\
+pool C:\pool
+share \\darkstar
+
+

and share the following directories over the network: +

+\\darkstar\pool -> C:\pool
+\\darkstar\d1 -> F:\array
+\\darkstar\d2 -> G:\array
+\\darkstar\d3 -> H:\array
+
+

to allow remote clients to access all the files at \\darkstar\pool. +

You may also need to configure remote clients to enable access to remote +symlinks with the command: +

+fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
+
+
+
+

+Undeleting +

+

SnapRAID functions more like a backup program than a RAID system, and it +can be used to restore or undelete files to their previous state using +the -f, --filter option: +

+snapraid fix -f FILE
+
+

or for a directory: +

+snapraid fix -f DIR/
+
+

You can also use it to recover only accidentally deleted files inside +a directory using the -m, --filter-missing option, which restores +only missing files, leaving all others untouched. +

+snapraid fix -m -f DIR/
+
+

Or to recover all the deleted files on all drives with: +

+snapraid fix -m
+
+
+
+

+Recovering +

+

The worst has happened, and you have lost one or more disks! +

DO NOT PANIC! You will be able to recover them! +

The first thing you must do is avoid further changes to your disk array. +Disable any remote connections to it and any scheduled processes, including +any scheduled SnapRAID nightly sync or scrub. +

Then proceed with the following steps. +

+

+STEP 1 -> Reconfigure +

+

You need some space to recover, ideally on additional +spare disks, but an external USB disk or remote disk will suffice. +

Modify the SnapRAID configuration file to make the `data` or `parity` +option of the failed disk point to a location with enough empty +space to recover the files. +

For example, if disk `d1` has failed, change from: +

+data d1 /mnt/disk1/
+
+

to: +

+data d1 /mnt/new_spare_disk/
+
+

If the disk to recover is a parity disk, update the appropriate `parity` +option. +If you have multiple failed disks, update all their configuration options. +

+
+

+STEP 2 -> Fix +

+

Run the fix command, storing the log in an external file with: +

+snapraid -d NAME -l fix.log fix
+
+

Where NAME is the name of the disk, such as `d1` in our previous example. +If the disk to recover is a parity disk, use the names `parity`, `2-parity`, +etc. +If you have multiple failed disks, use multiple -d options to specify all +of them. +

This command will take a long time. +

Ensure you have a few gigabytes free to store the fix.log file. +Run it from a disk with sufficient free space. +

Now you have recovered all that is recoverable. If some files are partially +or totally unrecoverable, they will be renamed by adding the `.unrecoverable` +extension. +

You can find a detailed list of all unrecoverable blocks in the fix.log file +by checking all lines starting with `unrecoverable:`. +

If you are not satisfied with the recovery, you can retry it as many +times as you wish. +

For example, if you have removed files from the array after the last +`sync`, this may result in some files not being recovered. +In this case, you can retry the `fix` using the -i, --import option, +specifying where these files are now to include them again in the +recovery process. +

If you are satisfied with the recovery, you can proceed further, +but note that after syncing, you cannot retry the `fix` command +anymore! +

+
+

+STEP 3 -> Check +

+

As a cautious check, you can now run a `check` command to ensure that +everything is correct on the recovered disk. +

+snapraid -d NAME -a check
+
+

Where NAME is the name of the disk, such as `d1` in our previous example. +

The -d and -a options tell SnapRAID to check only the specified disk +and ignore all parity data. +

This command will take a long time, but if you are not overly cautious, +you can skip it. +

+
+

+STEP 4 -> Sync +

+

Run the `sync` command to resynchronize the array with the new disk. +

+snapraid sync
+
+

If everything is recovered, this command is immediate. +

+
+
+
+

+Commands +

+

SnapRAID provides a few simple commands that allow you to: +

    +
  • +Print the status of the array -> `status` +
  • +
  • +Control the disks -> `smart`, `probe`, `up`, `down` +
  • +
  • +Make a backup/snapshot -> `sync` +
  • +
  • +Periodically check data -> `scrub` +
  • +
  • +Restore the last backup/snapshot -> `fix`. +
  • +
+

Commands must be written in lowercase. +

+

+status +

+

Prints a summary of the state of the disk array. +

It includes information about parity fragmentation, how old +the blocks are without checking, and all recorded silent +errors encountered while scrubbing. +

The information presented refers to the latest time you +ran `sync`. Later modifications are not taken into account. +

If bad blocks were detected, their block numbers are listed. +To fix them, you can use the `fix -e` command. +

It also shows a graph representing the last time each block +was scrubbed or synced. Scrubbed blocks are shown with '*', +blocks synced but not yet scrubbed with 'o'. +

Nothing is modified. +

+
+

+smart +

+

Prints a SMART report of all the disks in the system. +

It includes an estimation of the probability of failure in the next +year, allowing you to plan maintenance replacements of disks that show +suspicious attributes. +

This probability estimation is obtained by correlating the SMART attributes +of the disks with the Backblaze data available at: +

+https://www.backblaze.com/hard-drive-test-data.html
+
+

If SMART reports that a disk is failing, `FAIL` or `PREFAIL` is printed +for that disk, and SnapRAID returns with an error. +In this case, immediate replacement of the disk is highly recommended. +

Other possible status strings are: +

+
+
+logfail +
+In the past, some attributes were lower than +the threshold. +
+
+
+
+logerr +
+The device error log contains errors. +
+
+
+
+selferr +
+The device self-test log contains errors. +
+
+
+

If the -v, --verbose option is specified, a deeper statistical analysis +is provided. This analysis can help you decide if you need more +or less parity. +

This command uses the `smartctl` tool and is equivalent to running +`smartctl -a` on all devices. +

If your devices are not auto-detected correctly, you can specify +a custom command using the `smartctl` option in the configuration +file. +

Nothing is modified. +

+
+

+probe +

+

Prints the POWER state of all disks in the system. +

`Standby` means the disk is not spinning. `Active` means +the disk is spinning. +

This command uses the `smartctl` tool and is equivalent to running +`smartctl -n standby -i` on all devices. +

If your devices are not auto-detected correctly, you can specify +a custom command using the `smartctl` option in the configuration +file. +

Nothing is modified. +

+
+

+up +

+

Spins up all the disks of the array. +

You can spin up only specific disks using the -d, --filter-disk option. +

Spinning up all the disks at the same time requires a lot of power. +Ensure that your power supply can sustain it. +

Nothing is modified. +

+
+

+down +

+

Spins down all the disks of the array. +

This command uses the `smartctl` tool and is equivalent to running +`smartctl -s standby,now` on all devices. +

You can spin down only specific disks using the -d, --filter-disk +option. +

To automatically spin down on error, you can use the -s, --spin-down-on-error +option with any other command, which is equivalent to running `down` manually +when an error occurs. +

Nothing is modified. +

+
+

+diff +

+

Lists all the files modified since the last `sync` that need to have +their parity data recomputed. +

This command doesn't check the file data, but only the file timestamp, +size, and inode. +

After listing all changed files, a summary of the changes is +presented, grouped by: +

+
+
+equal +
+Files unchanged from before. +
+
+
+
+added +
+Files added that were not present before. +
+
+
+
+removed +
+Files removed. +
+
+
+
+updated +
+Files with a different size or timestamp, meaning they +were modified. +
+
+
+
+moved +
+Files moved to a different directory on the same disk. +They are identified by having the same name, size, timestamp, +and inode, but a different directory. +
+
+
+
+copied +
+Files copied on the same or a different disk. Note that if +they are truly moved to a different disk, they will also be +counted in `removed`. +They are identified by having the same name, size, and +timestamp. If the sub-second timestamp is zero, +the full path must match, not just the name. +
+
+
+
+restored +
+Files with a different inode but matching name, size, and timestamp. +These are usually files restored after being deleted. +
+
+
+

If a `sync` is required, the process return code is 2, instead of the +default 0. The return code 1 is used for a generic error condition. +

Nothing is modified. +

+
+

+sync +

+

Updates the parity information. All modified files +in the disk array are read, and the corresponding parity +data is updated. +

You can stop this process at any time by pressing Ctrl+C, +without losing the work already done. +At the next run, the `sync` process will resume where +it was interrupted. +

If silent or input/output errors are found during the process, +the corresponding blocks are marked as bad. +

Files are identified by path and/or inode and checked by +size and timestamp. +If the file size or timestamp differs, the parity data +is recomputed for the entire file. +If the file is moved or renamed on the same disk, keeping the +same inode, the parity is not recomputed. +If the file is moved to another disk, the parity is recomputed, +but the previously computed hash information is retained. +

The `content` and `parity` files are modified if necessary. +The files in the array are NOT modified. +

+
+

+scrub +

+

Scrubs the array, checking for silent or input/output errors in data +and parity disks. +

Each invocation checks approximately 8% of the array, excluding +data already scrubbed in the last 10 days. +This means that scrubbing once a week ensures every bit of data is checked +at least once every three months. +

You can define a different scrub plan or amount using the -p, --plan +option, which accepts: +bad - Scrub blocks marked bad. +new - Scrub just-synced blocks not yet scrubbed. +full - Scrub everything. +0-100 - Scrub the specified percentage of blocks. +

If you specify a percentage amount, you can also use the -o, --older-than +option to define how old the block should be. +The oldest blocks are scrubbed first, ensuring an optimal check. +If you want to scrub only the just-synced blocks not yet scrubbed, +use the `-p new` option. +

To get details of the scrub status, use the `status` command. +

For any silent or input/output error found, the corresponding blocks +are marked as bad in the `content` file. +These bad blocks are listed in `status` and can be fixed with `fix -e`. +After the fix, at the next scrub, they will be rechecked, and if found +corrected, the bad mark will be removed. +To scrub only the bad blocks, you can use the `scrub -p bad` command. +

It's recommended to run `scrub` only on a synced array to avoid +reported errors caused by unsynced data. These errors are recognized +as not being silent errors, and the blocks are not marked as bad, +but such errors are reported in the output of the command. +

The `content` file is modified to update the time of the last check +for each block and to mark bad blocks. +The `parity` files are NOT modified. +The files in the array are NOT modified. +

+
+

+fix +

+

Fixes all the files and the parity data. +

All files and parity data are compared with the snapshot +state saved in the last `sync`. +If a difference is found, it is reverted to the stored snapshot. +

WARNING! The `fix` command does not differentiate between errors and +intentional modifications. It unconditionally reverts the file state +to the last `sync`. +

If no other option is specified, the entire array is processed. +Use the filter options to select a subset of files or disks to operate on. +

To fix only the blocks marked bad during `sync` and `scrub`, +use the -e, --filter-error option. +Unlike other filter options, this one applies fixes only to files that are +unchanged since the latest `sync`. +

SnapRAID renames all files that cannot be fixed by adding the +`.unrecoverable` extension. +

Before fixing, the entire array is scanned to find any files moved +since the last `sync` operation. +These files are identified by their timestamp, ignoring their name +and directory, and are used in the recovery process if necessary. +If you moved some of them outside the array, you can use the -i, --import +option to specify additional directories to scan. +

Files are identified only by path, not by inode. +

The `content` file is NOT modified. +The `parity` files are modified if necessary. +The files in the array are modified if necessary. +

+
+

+check +

+

Verifies all the files and the parity data. +

It works like `fix`, but it only simulates a recovery and no changes +are written to the array. +

This command is primarily intended for manual verification, +such as after a recovery process or in other special conditions. +For periodic and scheduled checks, use `scrub`. +

If you use the -a, --audit-only option, only the file +data is checked, and the parity data is ignored for a +faster run. +

Files are identified only by path, not by inode. +

Nothing is modified. +

+
+

+list +

+

Lists all the files contained in the array at the time of the +last `sync`. +

With -v or --verbose, the subsecond time is also shown. +

Nothing is modified. +

+
+

+dup +

+

Lists all duplicate files. Two files are assumed equal if their +hashes match. The file data is not read; only the +precomputed hashes are used. +

Nothing is modified. +

+
+

+pool +

+

Creates or updates a virtual view of all +the files in your disk array in the `pooling` directory. +

The files are not copied but linked using +symbolic links. +

When updating, all existing symbolic links and empty +subdirectories are deleted and replaced with the new +view of the array. Any other regular files are left in place. +

Nothing is modified outside the pool directory. +

+
+

+devices +

+

Prints the low-level devices used by the array. +

This command displays the device associations in the array +and is mainly intended as a script interface. +

The first two columns are the low-level device ID and path. +The next two columns are the high-level device ID and path. +The last column is the disk name in the array. +

In most cases, you have one low-level device for each disk in the +array, but in some more complex configurations, you may have multiple +low-level devices used by a single disk in the array. +

Nothing is modified. +

+
+

+touch +

+

Sets an arbitrary sub-second timestamp for all files +that have it set to zero. +

This improves SnapRAID's ability to recognize moved +and copied files, as it makes the timestamp almost unique, +reducing possible duplicates. +

More specifically, if the sub-second timestamp is not zero, +a moved or copied file is identified as such if it matches +the name, size, and timestamp. If the sub-second timestamp +is zero, it is considered a copy only if the full path, +size, and timestamp all match. +

The second-precision timestamp is not modified, +so all the dates and times of your files will be preserved. +

+
+

+rehash +

+

Schedules a rehash of the entire array. +

This command changes the hash kind used, typically when upgrading +from a 32-bit system to a 64-bit one, to switch from +MurmurHash3 to the faster SpookyHash. +

If you are already using the optimal hash, this command +does nothing and informs you that no action is needed. +

The rehash is not performed immediately but takes place +progressively during `sync` and `scrub`. +

You can check the rehash state using `status`. +

During the rehash, SnapRAID maintains full functionality, +with the only exception that `dup` cannot detect duplicated +files using a different hash. +

+
+

+locate +

+

Locate files stored in the parity disks. For each matching file, it +prints its location within the parity file and the number of fragments +it occupies. +

You can use the -t, --tail option to restrict the operation to files +using only the specified tail portion of the parity. +

+
+
+

+Options +

+

SnapRAID provides the following options: +

+
+
+-c, --conf CONFIG +
+Selects the configuration file to use. If not specified, in Unix +it uses the file `/usr/local/etc/snapraid.conf` if it exists, +otherwise `/etc/snapraid.conf`. +In Windows, it uses the file `snapraid.conf` in the same +directory as `snapraid.exe`. +
+
+
+
+
+
+-f, --filter PATTERN +
+Filters the files to process in `check` and `fix`. +Only the files matching the specified pattern are processed. +This option can be used multiple times. +See the PATTERN section for more details on +pattern specifications. +In Unix, ensure globbing characters are quoted if used. +This option can be used only with `check` and `fix`. +It cannot be used with `sync` and `scrub`, as they always +process the entire array. +
+
+
+
+
+
+-d, --filter-disk NAME +
+Filters the disks to process in `check`, `fix`, `up`, and `down`. +You must specify a disk name as defined in the configuration +file. +You can also specify parity disks with the names: `parity`, `2-parity`, +`3-parity`, etc., to limit operations to a specific parity disk. +If you combine multiple --filter, --filter-disk, and --filter-missing options, +only files matching all the filters are selected. +This option can be used multiple times. +This option can be used only with `check`, `fix`, `up`, and `down`. +It cannot be used with `sync` and `scrub`, as they always +process the entire array. +
+
+
+
+
+
+-m, --filter-missing +
+Filters the files to process in `check` and `fix`. +Only the files missing or deleted from the array are processed. +When used with `fix`, this acts as an `undelete` command. +If you combine multiple --filter, --filter-disk, and --filter-missing options, +only files matching all the filters are selected. +This option can be used only with `check` and `fix`. +It cannot be used with `sync` and `scrub`, as they always +process the entire array. +
+
+
+
+
+
+-e, --filter-error +
+Processes the files with errors in `check` and `fix`. +It processes only files that have blocks marked with silent +or input/output errors during `sync` and `scrub`, as listed in `status`. +This option can be used only with `check` and `fix`. +
+
+
+
+
+
+-p, --plan PERC|bad|new|full +
+Selects the scrub plan. If PERC is a numeric value from 0 to 100, +it is interpreted as the percentage of blocks to scrub. +Instead of a percentage, you can specify a plan: +`bad` scrubs bad blocks, `new` scrubs blocks not yet scrubbed, +and `full` scrubs everything. +This option can be used only with `scrub`. +
+
+
+
+
+
+-o, --older-than DAYS +
+Selects the oldest part of the array to process in `scrub`. +DAYS is the minimum age in days for a block to be scrubbed; +the default is 10. +Blocks marked as bad are always scrubbed regardless of this option. +This option can be used only with `scrub`. +
+
+
+
+
+
+-a, --audit-only +
+In `check`, verifies the hash of the files without +checking the parity data. +If you are interested only in checking the file data, this +option can significantly speed up the checking process. +This option can be used only with `check`. +
+
+
+
+
+
+-h, --pre-hash +
+In `sync`, runs a preliminary hashing phase of all new data +for additional verification before the parity computation. +Usually, in `sync`, no preliminary hashing is done, and the new +data is hashed just before the parity computation when it is read +for the first time. +This process occurs when the system is under +heavy load, with all disks spinning and a busy CPU. +This is an extreme condition for the machine, and if it has a +latent hardware problem, silent errors may go undetected +because the data is not yet hashed. +To avoid this risk, you can enable the `pre-hash` mode to have +all the data read twice to ensure its integrity. +This option also verifies files moved within the array +to ensure the move operation was successful and, if necessary, +allows you to run a fix operation before proceeding. +This option can be used only with `sync`. +
+
+
+
+
+
+-i, --import DIR +
+Imports from the specified directory any files deleted +from the array after the last `sync`. +If you still have such files, they can be used by `check` +and `fix` to improve the recovery process. +The files are read, including in subdirectories, and are +identified regardless of their name. +This option can be used only with `check` and `fix`. +
+
+
+
+
+
+-s, --spin-down-on-error +
+On any error, spins down all managed disks before exiting with +a non-zero status code. This prevents the drives from +remaining active and spinning after an aborted operation, +helping to avoid unnecessary heat buildup and power +consumption. Use this option to ensure disks are safely +stopped even when a command fails. +
+
+
+
+
+
+-w, --bw-limit RATE +
+Applies a global bandwidth limit for all disks. The RATE is +the number of bytes per second. You can specify a multiplier +such as K, M, G, or T (e.g., --bw-limit 1G). +
+
+
+
+
+
+-t, --tail SIZE +
+Limit file listing to those using no more than the specified +tail size of the parity disks. +You can use multipliers such as K, M, G, or T (e.g. --tail 1G). +This option is only valid when used together with the `locate` +command. +
+
+
+
+
+
+-A, --stats +
+Enables an extended status view that shows additional information. +The screen displays two graphs: +The first graph shows the number of buffered stripes for each +disk, along with the file path of the file currently being +accessed on that disk. Typically, the slowest disk will have +no buffer available, which determines the maximum achievable +bandwidth. +The second graph shows the percentage of time spent waiting +over the past 100 seconds. The slowest disk is expected to +cause most of the wait time, while other disks should have +little or no wait time because they can use their buffered stripes. +This graph also shows the time spent waiting for hash +calculations and RAID computations. +All computations run in parallel with disk operations. +Therefore, as long as there is measurable wait time for at +least one disk, it indicates that the CPU is fast enough to +keep up with the workload. +
+
+
+
+
+
+-Z, --force-zero +
+Forces the insecure operation of syncing a file with zero +size that was previously non-zero. +If SnapRAID detects such a condition, it stops proceeding +unless you specify this option. +This allows you to easily detect when, after a system crash, +some accessed files were truncated. +This is a possible condition in Linux with the ext3/ext4 +file systems. +This option can be used only with `sync`. +
+
+
+
+
+
+-E, --force-empty +
+Forces the insecure operation of syncing a disk with all +the original files missing. +If SnapRAID detects that all the files originally present +on the disk are missing or rewritten, it stops proceeding +unless you specify this option. +This allows you to easily detect when a data file system is not +mounted. +This option can be used only with `sync`. +
+
+
+
+
+
+-U, --force-uuid +
+Forces the insecure operation of syncing, checking, and fixing +with disks that have changed their UUID. +If SnapRAID detects that some disks have changed UUID, +it stops proceeding unless you specify this option. +This allows you to detect when your disks are mounted at the +wrong mount points. +It is, however, allowed to have a single UUID change with +single parity, and more with multiple parity, because this is +the normal case when replacing disks after a recovery. +This option can be used only with `sync`, `check`, or +`fix`. +
+
+
+
+
+
+-D, --force-device +
+Forces the insecure operation of fixing with inaccessible disks +or with disks on the same physical device. +For example, if you lost two data disks and have a spare disk to recover +only the first one, you can ignore the second inaccessible disk. +Or, if you want to recover a disk in the free space left on an +already used disk, sharing the same physical device. +This option can be used only with `fix`. +
+
+
+
+
+
+-N, --force-nocopy +
+In `sync`, `check`, and `fix`, disables the copy detection heuristic. +Without this option, SnapRAID assumes that files with the same +attributes, such as name, size, and timestamp, are copies with the +same data. +This allows identification of copied or moved files from one disk +to another and reuses the already computed hash information +to detect silent errors or to recover missing files. +In some rare cases, this behavior may result in false positives +or a slow process due to many hash verifications, and this +option allows you to resolve such issues. +This option can be used only with `sync`, `check`, and `fix`. +
+
+
+
+
+
+-F, --force-full +
+In `sync`, forces a full recomputation of the parity. +This option can be used when you add a new parity level or if +you reverted to an old content file using more recent parity data. +Instead of recreating the parity from scratch, this allows +you to reuse the hashes present in the content file to validate data +and maintain data protection during the `sync` process using +the existing parity data. +This option can be used only with `sync`. +
+
+
+
+
+
+-R, --force-realloc +
+In `sync`, forces a full reallocation of files and rebuild of the parity. +This option can be used to completely reallocate all files, +removing fragmentation, while reusing the hashes present in the content +file to validate data. +This option can be used only with `sync`. +WARNING! This option is for experts only, and it is highly +recommended not to use it. +You DO NOT have data protection during the `sync` operation. +
+
+
+
+
+
+-W, --force-realloc-tail SIZE +
+Works like -R, --force-realloc, but limited to the specified +tail portion (last SIZE bytes) of each parity file. +It forces reallocation (movement) of any file fragments/blocks +currently stored in that tail section, allowing them to be +placed anywhere in the parity file where free space is +available (including existing holes). +The main purpose of this option is to shrink the on-disk size +of the parity file. If the reallocation successfully clears +the entire tail section (no blocks remain using it), the +parity file is truncated, reclaiming the unused tail space. +You can use multipliers such as K, M, G, or T (e.g. +--force-realloc-tail 1G). +WARNING! This option is for experts only, and it is highly +recommended not to use it. +You DO NOT have data protection during the `sync` operation +for the affected files. +
+
+
+
+
+
+-l, --log FILE +
+Writes a detailed log to the specified file. +If this option is not specified, unexpected errors are printed +to the screen, potentially resulting in excessive output in case of +many errors. When -l, --log is specified, only +fatal errors that cause SnapRAID to stop are printed +to the screen. +If the path starts with '>>', the file is opened +in append mode. Occurrences of '%D' and '%T' in the name are +replaced with the date and time in the format YYYYMMDD and +HHMMSS. In Windows batch files, you must double +the '%' character, e.g., result-%%D.log. To use '>>', you must +enclose the name in quotes, e.g., `">>result.log"`. +To output the log to standard output or standard error, +you can use `">&1"` and `">&2"`, respectively. +See the snapraid_log.txt file or man page for log tag descriptions. +
+
+
+
+
+
+-L, --error-limit NUMBER +
+Sets a new error limit before stopping execution. +By default, SnapRAID stops if it encounters more than 100 +input/output errors, indicating that a disk is likely failing. +This option affects `sync` and `scrub`, which are allowed +to continue after the first set of disk errors to try +to complete their operations. +However, `check` and `fix` always stop at the first error. +
+
+
+
+
+
+-S, --start BLKSTART +
+Starts processing from the specified +block number. This can be useful for retrying to check +or fix specific blocks in case of a damaged disk. +This option is mainly for advanced manual recovery. +
+
+
+
+
+
+-B, --count BLKCOUNT +
+Processes only the specified number of blocks. +This option is mainly for advanced manual recovery. +
+
+
+
+
+
+-C, --gen-conf CONTENT +
+Generates a dummy configuration file from an existing +content file. +The configuration file is written to standard output +and does not overwrite an existing one. +This configuration file also contains the information +needed to reconstruct the disk mount points in case you +lose the entire system. +
+
+
+
+
+
+-v, --verbose +
+Prints more information to the screen. +If specified once, it prints excluded files +and additional statistics. +This option has no effect on the log files. +
+
+
+
+
+
+-q, --quiet +
+Prints less information to the screen. +If specified once, it removes the progress bar; twice, +the running operations; three times, the info +messages; four times, the status messages. +Fatal errors are always printed to the screen. +This option has no effect on the log files. +
+
+
+
+
+
+-H, --help +
+Prints a short help screen. +
+
+
+
+
+
+-V, --version +
+Prints the program version. +
+
+
+
+
+

+Configuration +

+

SnapRAID requires a configuration file to know where your disk array +is located and where to store the parity information. +

In Unix, it uses the file `/usr/local/etc/snapraid.conf` if it exists, +otherwise `/etc/snapraid.conf`. +In Windows, it uses the file `snapraid.conf` in the same +directory as `snapraid.exe`. +

It must contain the following options (case-sensitive): +

+

+parity FILE [,FILE] ... +

+

Defines the files to use to store the parity information. +The parity enables protection from a single disk +failure, similar to RAID5. +

You can specify multiple files, which must be on different disks. +When a file cannot grow anymore, the next one is used. +The total space available must be at least as large as the largest data disk in +the array. +

You can add additional parity files later, but you +cannot reorder or remove them. +

Keeping the parity disks reserved for parity ensures that +they do not become fragmented, improving performance. +

In Windows, 256 MB is left unused on each disk to avoid the +warning about full disks. +

This option is mandatory and can be used only once. +

+
+

+(2,3,4,5,6)-parity FILE [,FILE] ... +

+

Defines the files to use to store extra parity information. +

For each parity level specified, one additional level of protection +is enabled: +

    +
  • +2-parity enables RAID6 dual parity. +
  • +
  • +3-parity enables triple parity. +
  • +
  • +4-parity enables quad (four) parity. +
  • +
  • +5-parity enables penta (five) parity. +
  • +
  • +6-parity enables hexa (six) parity. +
  • +
+

Each parity level requires the presence of all previous parity +levels. +

The same considerations as for the 'parity' option apply. +

These options are optional and can be used only once. +

+
+

+z-parity FILE [,FILE] ... +

+

Defines an alternate file and format to store triple parity. +

This option is an alternative to '3-parity', primarily intended for +low-end CPUs like ARM or AMD Phenom, Athlon, and Opteron that do not +support the SSSE3 instruction set. In such cases, it provides +better performance. +

This format is similar to but faster than the one used by ZFS RAIDZ3. +Like ZFS, it does not work beyond triple parity. +

When using '3-parity', you will be warned if it is recommended to use +the 'z-parity' format for performance improvement. +

It is possible to convert from one format to another by adjusting +the configuration file with the desired z-parity or 3-parity file +and using 'fix' to recreate it. +

+
+

+content FILE +

+

Defines the file to use to store the list and checksums of all the +files present in your disk array. +

It can be placed on a disk used for data, parity, or +any other disk available. +If you use a data disk, this file is automatically excluded +from the `sync` process. +

This option is mandatory and can be used multiple times to save +multiple copies of the same file. +

You must store at least one copy for each parity disk used +plus one. Using additional copies does not hurt. +

+
+

+data NAME DIR +

+

Defines the name and mount point of the data disks in +the array. NAME is used to identify the disk and must +be unique. DIR is the mount point of the disk in the +file system. +

You can change the mount point as needed, as long as +you keep the NAME fixed. +

You should use one option for each data disk in the array. +

You can rename a disk later by changing the NAME directly +in the configuration file and then running a 'sync' command. +In the case of renaming, the association is done using the stored +UUID of the disks. +

+
+

+nohidden +

+

Excludes all hidden files and directories. +In Unix, hidden files are those starting with `.`. +In Windows, they are those with the hidden attribute. +

+
+

+exclude/include PATTERN +

+

Defines the file or directory patterns to exclude or include +in the sync process. +All patterns are processed in the specified order. +

If the first pattern that matches is an `exclude` one, the file +is excluded. If it is an `include` one, the file is included. +If no pattern matches, the file is excluded if the last pattern +specified is an `include`, or included if the last pattern +specified is an `exclude`. +

See the PATTERN section for more details on pattern +specifications. +

This option can be used multiple times. +

+
+

+blocksize SIZE_IN_KIBIBYTES +

+

Defines the basic block size in kibibytes for the parity. +One kibibyte is 1024 bytes. +

The default blocksize is 256, which should work for most cases. +

WARNING! This option is for experts only, and it is highly +recommended not to change this value. To change this value in the +future, you will need to recreate the entire parity! +

A reason to use a different blocksize is if you have many small +files, on the order of millions. +

For each file, even if only a few bytes, an entire block of parity is allocated, +and with many files, this may result in significant unused parity space. +When you completely fill the parity disk, you are not +allowed to add more files to the data disks. +However, the wasted parity does not accumulate across data disks. Wasted space +resulting from a high number of files on a data disk limits only +the amount of data on that data disk, not others. +

As an approximation, you can assume that half of the block size is +wasted for each file. For example, with 100,000 files and a 256 KiB +block size, you will waste 12.8 GB of parity, which may result +in 12.8 GB less space available on the data disk. +

You can check the amount of wasted space on each disk using `status`. +This is the amount of space you must leave free on the data +disks or use for files not included in the array. +If this value is negative, it means you are close to filling +the parity, and it represents the space you can still waste. +

To avoid this issue, you can use a larger partition for parity. +For example, if the parity partition is 12.8 GB larger than the data disks, +you have enough extra space to handle up to 100,000 +files on each data disk without any wasted space. +

A trick to get a larger parity partition in Linux is to format it +with the command: +

+mkfs.ext4 -m 0 -T largefile4 DEVICE
+
+

This results in about 1.5% extra space, approximately 60 GB for +a 4 TB disk, which allows about 460,000 files on each data disk without +any wasted space. +

+
+

+hashsize SIZE_IN_BYTES +

+

Defines the hash size in bytes for the saved blocks. +

The default hashsize is 16 bytes (128 bits), which should work +for most cases. +

WARNING! This option is for experts only, and it is highly +recommended not to change this value. To change this value in the +future, you will need to recreate the entire parity! +

A reason to use a different hashsize is if your system has +limited memory. As a rule of thumb, SnapRAID typically requires +1 GiB of RAM for each 16 TB of data in the array. +

Specifically, to store the hashes of the data, SnapRAID requires +approximately TS*(1+HS)/BS bytes of RAM, +where TS is the total size in bytes of your disk array, BS is the +block size in bytes, and HS is the hash size in bytes. +

For example, with 8 disks of 4 TB, a block size of 256 KiB +(1 KiB = 1024 bytes), and a hash size of 16, you get: +

+RAM = (8 * 4 * 10^12) * (1+16) / (256 * 2^10) = 1.93 GiB
+
+

Switching to a hash size of 8, you get: +

+RAM = (8 * 4 * 10^12) * (1+8) / (256 * 2^10) = 1.02 GiB
+
+

Switching to a block size of 512, you get: +

+RAM = (8 * 4 * 10^12) * (1+16) / (512 * 2^10) = 0.96 GiB
+
+

Switching to both a hash size of 8 and a block size of 512, you get: +

+RAM = (8 * 4 * 10^12) * (1+8) / (512 * 2^10) = 0.51 GiB
+
+
+
+

+autosave SIZE_IN_GIGABYTES +

+

Automatically saves the state when syncing or scrubbing after the +specified amount of GB processed. +This option is useful to avoid restarting long `sync` +commands from scratch if interrupted by a machine crash or any other event. +

+
+

+temp_limit TEMPERATURE_CELSIUS +

+

Sets the maximum allowed disk temperature in Celsius. When specified, +SnapRAID periodically checks the temperature of all disks using the +smartctl tool. The current disk temperatures are displayed while +SnapRAID is operating. If any disk exceeds this limit, all operations +stop, and the disks are spun down (put into standby) for the duration +defined by the `temp_sleep` option. After the sleep period, operations +resume, potentially pausing again if the temperature limit is reached +once more. +

During operation, SnapRAID also analyzes the heating curve of each +disk and estimates the long-term steady temperature they are expected +to reach if activity continues. The estimation is performed only after +the disk temperature has increased four times, ensuring that enough +data points are available to establish a reliable trend. +This predicted steady temperature is shown in parentheses next to the +current value and helps assess whether the system's cooling is +adequate. This estimated temperature is for informational purposes +only and has no effect on the behavior of SnapRAID. The program's +actions are based solely on the actual measured disk temperatures. +

To perform this analysis, SnapRAID needs a reference for the system +temperature. It first attempts to read it from available hardware +sensors. If no system sensor can be accessed, it uses the lowest disk +temperature measured at the start of the run as a fallback reference. +

Normally, SnapRAID shows only the temperature of the hottest disk. +To display the temperature of all disks, use the -A or --stats option. +

+
+

+temp_sleep TIME_IN_MINUTES +

+

Sets the standby time, in minutes, when the temperature limit is +reached. During this period, the disks remain spun down. The default +is 5 minutes. +

+
+

+pool DIR +

+

Defines the pooling directory where the virtual view of the disk +array is created using the `pool` command. +

The directory must already exist. +

+
+

+share UNC_DIR +

+

Defines the Windows UNC path required to access the disks remotely. +

If this option is specified, the symbolic links created in the pool +directory use this UNC path to access the disks. +Without this option, the symbolic links generated use only local paths, +which does not allow sharing the pool directory over the network. +

The symbolic links are formed using the specified UNC path, adding the +disk name as specified in the `data` option, and finally adding the +file directory and name. +

This option is required only for Windows. +

+
+

+smartctl DISK/PARITY OPTIONS... +

+

Defines custom smartctl options to obtain the SMART attributes for +each disk. This may be required for RAID controllers and some USB +disks that cannot be auto-detected. The %s placeholder is replaced by +the device name, but it is optional for fixed devices like RAID controllers. +

DISK is the same disk name specified in the `data` option. +PARITY is one of the parity names: `parity`, `2-parity`, `3-parity`, +`4-parity`, `5-parity`, `6-parity`, or `z-parity`. +

In the specified OPTIONS, the `%s` string is replaced by the +device name. For RAID controllers, the device is +likely fixed, and you may not need to use `%s`. +

Refer to the smartmontools documentation for possible options: +

+https://www.smartmontools.org/wiki/Supported_RAID-Controllers
+https://www.smartmontools.org/wiki/Supported_USB-Devices
+
+

For example: +

+smartctl parity -d sat %s
+
+
+
+

+smartignore DISK/PARITY ATTR [ATTR...] +

+

Ignores the specified SMART attribute when computing the probability +of disk failure. This option is useful if a disk reports unusual or +misleading values for a particular attribute. +

DISK is the same disk name specified in the `data` option. +PARITY is one of the parity names: `parity`, `2-parity`, `3-parity`, +`4-parity`, `5-parity`, `6-parity`, or `z-parity`. +The special value * can be used to ignore the attribute on all disks. +

For example, to ignore the `Current Pending Sector Count` attribute on +all disks: +

+smartignore * 197
+
+

To ignore it only on the first parity disk: +

+smartignore parity 197
+
+
+
+

+Examples +

+

An example of a typical configuration for Unix is: +

+parity /mnt/diskp/snapraid.parity
+content /mnt/diskp/snapraid.content
+content /var/snapraid/snapraid.content
+data d1 /mnt/disk1/
+data d2 /mnt/disk2/
+data d3 /mnt/disk3/
+exclude /lost+found/
+exclude /tmp/
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/sg0
+smartctl 2-parity -d areca,2/1 /dev/sg0
+
+

An example of a typical configuration for Windows is: +

+parity E:\snapraid.parity
+content E:\snapraid.content
+content C:\snapraid\snapraid.content
+data d1 G:\array\
+data d2 H:\array\
+data d3 I:\array\
+exclude Thumbs.db
+exclude \$RECYCLE.BIN
+exclude \System Volume Information
+smartctl d1 -d sat %s
+smartctl d2 -d usbjmicron %s
+smartctl parity -d areca,1/1 /dev/arcmsr0
+smartctl 2-parity -d areca,2/1 /dev/arcmsr0
+
+
+
+
+

+Pattern +

+

Patterns are used to select a subset of files to exclude or include in +the process. Globbing characters can be used to match files and paths +in a flexible way. +

The question mark `?` matches any single character except the directory +separator. This makes it useful for matching filenames with variable +characters while keeping the pattern confined to a single directory level. +

The single star `*` matches any sequence of characters, but like the +question mark, it never crosses directory boundaries. It stops at the +forward slash, making it suitable for matching within a single path +component. This is the standard wildcard behavior familiar from shell +globbing. +

The double star `**` is more powerful, it matches any sequence of +characters including directory separators. This allows patterns to match +across multiple directory levels. When `**` appears embedded directly in +a pattern, it can match zero or more characters including slashes between +the surrounding literal text. +

The most important use of `**` is in the special form `/**/`. This matches +zero or more complete directory levels, making it possible to match files +at any depth in a directory tree without knowing the exact path structure. +For example, the pattern `src/**/main.js` matches `src/main.js` (skipping +zero directories), `src/ui/main.js` (skipping one directory), and +`src/ui/components/main.js` (skipping two directories). +

Character classes using square brackets match a single character from a +specified set or range. Like the other single character patterns, they do +not match directory separators. Classes support ranges and negation using +an exclamation mark. +

The fundamental distinction to remember is that `*`, `?`, and character +classes all respect directory boundaries and only match within a single path +component, while `**` is the only pattern that can match across directory +separators. +

There are four different types of patterns: +

+
+
+FILE +
+Selects any file named FILE. +This pattern applies only to files, not directories. +
+
+
+
+
+
+DIR/ +
+Selects any directory named DIR and everything inside. +This pattern applies only to directories, not files. +
+
+
+
+
+
+/PATH/FILE +
+Selects the exact specified file path. This pattern applies +only to files, not directories. +
+
+
+
+
+
+/PATH/DIR/ +
+Selects the exact specified directory path and everything +inside.    This pattern applies only to directories, not files. +
+
+
+

When you specify an absolute path starting with /, it is applied at +the array root directory, not the local file system root directory. +

In Windows, you can use the backslash \ instead of the forward slash /. +Windows system directories, junctions, mount points, and other Windows +special directories are treated as files, meaning that to exclude +them, you must use a file rule, not a directory one. +

If the file name contains a '*', '?', '[', +or ']' character, you must escape it to avoid having it interpreted as a +globbing character. In Unix, the escape character is '\'; in Windows, it is '^'. +When the pattern is on the command line, you must double the escape +character to avoid having it interpreted by the command shell. +

In the configuration file, you can use different strategies to filter +the files to process. +The simplest approach is to use only `exclude` rules to remove all the +files and directories you do not want to process. For example: +

+# Excludes any file named `*.unrecoverable`
+exclude *.unrecoverable
+# Excludes the root directory `/lost+found`
+exclude /lost+found/
+# Excludes any subdirectory named `tmp`
+exclude tmp/
+
+

The opposite approach is to define only the files you want to process, using +only `include` rules. For example: +

+# Includes only some directories
+include /movies/
+include /musics/
+include /pictures/
+
+

The final approach is to mix `exclude` and `include` rules. In this case, +the order of rules is important. Earlier rules take +precedence over later ones. +To simplify, you can list all the `exclude` rules first and then +all the `include` rules. For example: +

+# Excludes any file named `*.unrecoverable`
+exclude *.unrecoverable
+# Excludes any subdirectory named `tmp`
+exclude tmp/
+# Includes only some directories
+include /movies/
+include /musics/
+include /pictures/
+
+

On the command line, using the -f option, you can only use `include` +patterns. For example: +

+# Checks only the .mp3 files.
+# In Unix, use quotes to avoid globbing expansion by the shell.
+snapraid -f "*.mp3" check
+
+

In Unix, when using globbing characters on the command line, you must +quote them to prevent the shell from expanding them. +

+
+

+Ignore File +

+

In addition to the global rules in the configuration file, you can +place `.snapraidignore` files in any directory within the array to +define decentralized exclusion rules. +

Rules defined in `.snapraidignore` are applied after the rules in the +configuration file. This means they have a higher priority and can be +used to exclude files that were previously included by the global +configuration. Effectively, if a local rule matches, the file is +excluded regardless of the global include settings. +

The pattern logic in `.snapraidignore` mirrors the global configuration +but anchors patterns to the directory where the file is located: +

+
+
+FILE +
+Selects any file named FILE in this directory or below. +This follows the same globbing rules as the global pattern. +
+
+
+
+
+
+DIR/ +
+Selects any directory named DIR and everything inside, +residing in this directory or below. +
+
+
+
+
+
+/PATH/FILE +
+Selects the exact specified file relative to the location +of the `.snapraidignore` file. +
+
+
+
+
+
+/PATH/DIR/ +
+Selects the exact specified directory and everything inside, +relative to the location of the `.snapraidignore` file. +
+
+
+

Unlike the global configuration, `.snapraidignore` files only support +exclusion rules; you cannot use `include` patterns or negation (!). +

For example, if you have a `.snapraidignore` in `/mnt/disk1/projects/`: +

+# Excludes ONLY /mnt/disk1/projects/output.bin
+/output.bin
+# Excludes any directory named 'build' inside projects/
+build/
+# Excludes any .tmp file inside projects/ or its subfolders
+*.tmp
+
+
+
+

+Content +

+

SnapRAID stores the list and checksums of your files in the content file. +

It is a binary file that lists all the files present in your disk array, +along with all the checksums to verify their integrity. +

This file is read and written by the `sync` and `scrub` commands and +read by the `fix`, `check`, and `status` commands. +

+
+

+Parity +

+

SnapRAID stores the parity information of your array in the parity +files. +

These are binary files containing the computed parity of all the +blocks defined in the `content` file. +

These files are read and written by the `sync` and `fix` commands and +only read by the `scrub` and `check` commands. +

+
+

+Encoding +

+

SnapRAID in Unix ignores any encoding. It reads and stores the +file names with the same encoding used by the file system. +

In Windows, all names read from the file system are converted and +processed in UTF-8 format. +

To have file names printed correctly, you must set the Windows +console to UTF-8 mode with the command `chcp 65001` and use +a TrueType font like `Lucida Console` as the console font. +This affects only the printed file names; if you +redirect the console output to a file, the resulting file is always +in UTF-8 format. +

+ + +
+
+
+ + + + + + + diff --git a/beta/recovery.png b/beta/recovery.png new file mode 100644 index 0000000000000000000000000000000000000000..1c947eb2b1a726271696cb695ded408821c25085 GIT binary patch literal 104728 zcmZ_0by$=^+diy-NJ%UyEwXe;H%NC#EiEn0vUEz9(j5}g-RzRm(ji^KBCNEu^tV3m z`~LCM=R1!3j~n*dnb~u$x#qlLCQ3t1{uvfI)}u#{o+&EGym|BpZTrz9R9Xylx|9vD^2=ll| zFO~ZqCrTdR=W*$YtSqwrzaq$QNcO&vG^^gI(a3JSgC-w(l`#$Ivj z(guaUe&1u%3$htc{C8v*7#isnVi)@vXz)zrz@R47xUv6AQU4hY9!Y{0ZBQmHvUi5k zdQ|}Jb| zOr_6+n}lYrihQk%YLNI>DqIfvk+dOrJPnOS5%~&yea!oh)MG#?9kL@Gv_U(1jqiVY zKVludO85)=N0>AGNU5d{l>J;Zcrp?SL1Qx9n17*I`vZk@Y9ir_pj{vm3Lo!!zW>rE z2J*Amc{Jp7fl!FHz0Cfe>pv4Y20%8|;I}A@Iirsh+TEW9um3xb?xBAare1@R0kiMV z6oCkB0{@kI_7V9}cr!ek6H_}8`KlBQxBXX&UPBhyQ8`BJtU_KVQa|**>!qK*{AV6Z z9g$LYzE2h;F#DL1sDN9!C`tZR#Ew6TxW)!#ltP(RM#6u7VrlJ;9*FFy!0_+L(t$KB-^ne z`B0CewU8|5jQ3U}_mMn_l(_%=+DDk7jL0d~L;uf|x~ryZC4J>&`Vz?_XR&-iWu)_8 zbRg0f2_rlpN>CC|N`-PvH+pyWjn2q-wF*c}hJ(&)KS$($Llv9l+)h50CGagy{lN>J zLCvq!Bd<>HzqR%rIcSWx$J&5*3TSZI^qb?7FzEGe)`(1CA3?-MPK)VWoHMCCY*SrO zZ2xKyM;xmp7fg=3w~G3aoKMP3lYrl8B{YKv@ph?Eeccr{ykDZ8yC#U(=b1$OT6?!t zh}lk!*X*<$9)=y*-FBqfJD$@vT)EuoZ}>s{$N`7U1rcde*Xx}3`w z5!9jT#a*9Uz&BKv@Ie}qx6_4fE~BsHyLVhIeopd$d(ZXEW=eU^PdVCdeb@{d3unkg z+}=fGd=DrOyzj+31&=iW`{%;X+WKLMf34y7xsSqxOt6tEXofjMY^L_?zNJWlPDn^U zD*`a@b0J*cmkj_A{`w_N2tFAaOoJ^|=vECBr5RUXT6fFpBUIB}Di|tLbg=ruE@F=f zWi4;YW|&D${luL*cMQ^1in;fkmz#|%QJe=e`5tx=*+S-I4CP~Fr0 z{i|2tY@%58hUik_mqM9$>~jdmAtepIo(|g={RZn(fw;dlm|PUO44&NsXdeME)bpw_ zAab7xx*qsxqUbuy-e`kDdvB<<%-;|)t`+IGU5%{3B&1+po8L`Ql76K6IFn3tpdo1A zuvguNqGv3mR#U-tqP;5jkzylo@L71j`BZEfTOHzKC)vX-A^!Y0jejh|?v=8cS-!4k zpe{+PrvzGukH>u6!Ey`DOF5JG9ljTKxkV)fNmAcuySqpwJKScES?+ej+(gQ!0KZyx}q*7GpD09|KCbz?HqJJ$_fB3lp;T7 z-dOk@%pzQVB-}Mk=um!n9iq-*^#W85koenh1ffeJtqv;4QY`_kTg-E5p9+^g+R-@YJlD*$J`B zm6+rCXq{`{irMJ?80)>B9i&!Y25`B;qwniKHk-DQX^%qpoxMdZ-pdVW%=O*NpQZIu5H0LU*w?YKetjF$QvC^I z@Krx_Bm8~XatNMy?4<+-G@|?>CGYaiGuIv^kEML=eb7V5nDw_cJcI`m88v9c0 zpS5Pv$6tFNC+xNEIrpx>#66eZZBwy~mR$_Qb^y9KjCFUTZ5g5jw#TmCkaC)OpRl4^nyJdzO=(DTWzR)o7aY z>VJFdw1keCgBuFdd74ha7xIFgP&US<;9a+#51;fKtiL3&XF`6p z9DY|4Z8klQ=9q|>7cEYAayT^NO1@PxEss&JcimI4i|hR=RJ@IMadFChgXs$w7@TVJ zx9)Ek*DDi(EQz~O(p~F}X-U8V0;?MK4UD;73UOI!Nm-0h&(-Go#B>TWJWIJ+Y`6wiOy>i@eR+G(brN(iR0 zdKDG+F0_kHHj1t6u&;9)Zg8;3YzIB1ZGs4p5hn2(PZ(;yztunb{4PK;{WKb=bW-;+ zo_pV1sGIdUQOYC(UWmyRcwu9)g|M34ego7682?zYF|=g7eXdbfr@J|8X%~nOh^0n9 zecWM|ctufJW^Q2deqI-2BH;ODc-IE#nkqYxZPIe=T6gA_rx=Y}FqKcD20G=9<+{Ge zvIo7D7YxXJF)#IHtcH%mcGEPhNPdX^@uFug>cqf%3KJ;5)F1+ML3ol2HIQg(Kdw;u zwALf)bqZO(KB9r@KA;a4)NHUbWw_)O)D6PDi~-x)E8HnwlKOUG(c&z+ncwNExK~!3 z1bogYOLMMspasqL%LcwxXf;(NYNrsx?3@6~j@arSJ7dIvBce!4%| zZ;0FY{cvTzeegY({diGrI#ix`*=eKaC_a@XkfspL@Ve}BYE(o!J?nhcs7|H5VHB3@ zcY^7467}?aQ>jnO{1XeLKeIZ;vOs5R)l;G`IU={5SNfB}-*o;wM{<;X+b{gx8h6#E z%0Vk#zP);SD;2u49iiZX8uSEvgXs0RaeM?CW>K>DJ3RWvcR)v`u`z5+_yc5q0PZS6I5-y$gl8*#98to)zCSCJGSNsaEt{VY4tM*q%Asisa$^ zg5(p=Mx3U4j;2aAzsxpqzrVSlC;)1JpzFS?s=85ucRx;tQ-|lMSce#$y4d4&&Vz>H z6pO#bojZl&iak~rrN-}&i=&Q^xHk$4f)CtW+fVEvjJXfV+4SqR18K(ErNdx5G!yYM z0K62T^H4PGfLkyFH_vnvoqXX+2ZWFR%>CHGvR#&6Ib5aqY#fGi7vP`|MS(|l!<$11?24AwbT8$Z@+B`~9Dd9Q4Wby8i8XC7#ZMMtpI6I;6 zx>!tWbf{t3t6=e^Puh#$RAV(`C;QLT#EDS(%I#hP?Ov?E@4B|c;$m%uLyWniO%rCcGM(-i2YhgWwIjopyR z)~K_2V(s9mM8Hn-mxMg(8dZJ^;l*?5{~n>N?2 z&v~-wt^yHXguT+$lfR`1biy7*Qhe$g|TD0WTxX2Kb3TOv&!X%SF(+IQS z;}6Yj>GwB;sqBG0>rB(3`MYe}y|J&atAbR*!%RDHmm3*-J#$esM!_>;l6|)%FRCBNUT;` zVo)KWeDAa`mkPUxLS-8f0XJ}bb_=iB@QG35^Vfe>OI9rRl_} zCXT5%Jt==dT+gpFJGNJMU)fZC--qtZCcj-Jik?px6HDak-uXkCrvH*Yk z7_@-oj%R3Vfe)Vnt4ySmFi59V62r%)iIlc|P5B%Qs~l1zHBqz3zKK&9h!qSTO&=+$ znm^O(fkn#k9F=20?6^z=UOh8z^OzfO-~8zL7G8+i>TB<^0%I|buax;`V~zh~JS+yK z32(R_;SWnA^F?h+T=jEWV&hC&8@6Goo?)TdeE@c=9b2mS;ERJ)#2HCU zr#H4NjVK8iFTX(R-Z04wf9jR@iocn$k0aeE@vu;S{{pNHBaE{reS;9EhZwOW5zkma zvQMXdtyeGW%j?6v9$o@3exB7RHC<;D?$~>=iD2?OKLiZY5i~cRr{&7kaE857oKx!{ zt>fD3F|mqW_L+09js5jx`7&}L%l(`d{DS&pGWOt&IHBi)!<7mU6H||c+*Ec@dRc`W zOq@7@1ws?E9 z7&mO2vajW^C^=-^-H|FNo#_c(+f%&}7 z{C3mVn+s#XW~X>{m0yK?VI}%Dg3BKBp+b>urA{V#qN2HHT1M?o=`B@KClg0Hd*JwO*@I_+G{ah6C5gD%H+4=dc>B`sR{^@578w393yhO+m zthGPqq7M4lM)Z}|inQT7=MH#JMdhA$dq?Oe`IN7gb~lIqM4f~fSk4Y}Vc6^K%&UDP{RUaHy zuRs1aTT_SEe|o=3ziE5p;n-*~`~>ntpEOm09*oEluo!)UK)PAA#paVmB}E&dn-R1_ zyEp!CQXN>vja^XCiBZ-1gHO|pz!SMV2zmB8WGwBHc_X?FycsAcpZK!WVq^Go+)CUx zH4)fMKB=h>71AGfT@cpE`J+I^s#zHGHD*|f6&!9>JK@xw;FIgjpK}w?w6^07v~l0+OJmWdCCEsc>r#t<-r?pPQ6xSj14N%x&)|t z0U5F!yGv@>bDqUmx~o$8h>srN&8%4X_ajd19xNW8h?9)))}>Cly#~KHGe}%lRSGEq z8wwgyKk__v5+4y7Q({m^);cOow0$5c9DimhU0EHbmdpEWyIM?%w*;Wcgw2wM5m((5 zXxC%mt=6dY){cHr?oKu;=kQrY{7ooyMv+ZCQb&KukuwE(Wx!8uL4xB(*Yh!-N2?p||E@63CI7z!}OJ#nX75vvoJU0tI z^gHwEa28oDd9?NdmOHA)eH*2BlAo?}e*a7pDK~?EULYl*79rjVO`m zbMXvG+0BZdUQlq++PN?Qmnx5DxYLG6ltNc`zDTFYV>g(qgn{4TH?x<_isGGY|9c8? zKO)!Dlkp_%;2bT z$*vF`#K$(v4^Vd#W2H(gCyTA&K$jeh=r)f74v3%KzE*Bv`^>RfubkOk_(!un9rraI z;_Vq)WXOq`5~4z@7!DB8F~_oc^;PO`6GE?%h}>pijjYr`ifqj|aF$(&^f@Mb;dC~jK`a(s58zgBj=%L}$~cQ(ep{G?jjxQ7#ib|Fx@ z$+95>HburIGz2d#76PAv+^(|b$6ql<(%PhuL7uxb2`g0o^!bvMUpb&{Bl zw#9N|XA>8u%y=i<0y-=yx39-}l>B4*#+Ah{NyxrY>^N?9`3X>-O5nALcV{?@3Ed>P zkG&G^?IWC!AC~nbHce6kgT;#bpzZ+&cmVK;R>$4?4_vdsu6@QItY(ebiGDlu^ols* zfkXcLN>CY@>ajO^p+fyX#{^6!jYVc}{wHdswIqAvRTrz33RwkezP7ezI61|xwHQ<* z*d&1`sds+)6W^8**8m7*`_JwCTy0|{7jVL9Gg@8-X7mP!Dbvrb4sOjIEYyj~#fej( zUSGX*7e|Lv0xh;Hg??WwAH@)kBzM4Bs8{{KHae+3_w_#KU4jrxF9Km` zkphD1BbVoN)Zj*02};j>fvmF2;+FWOF3I0PJKCT`G;@|wtCh1vOVgAE7r0MpTOCWk zvU%_#i68oMy-+5To@Sj}TKZemh;BAI)4HT`brHyttR=WNJ(cd&K0Qeici-vt{)i}m zX1vah`J~H_cx|Q9wQbV1S?LXyr?ve;EE%SAG<^sLU>j#z{rZD1E4g(_ECqKao$c=; z1yPSeYM!df@D&mM7tXr}zZ{H;asezKV98A@Vu<8-QmRGAB8hzkf*X=hNY8m08ea&s zRA1ic+1^gtPRWlIfBqGUhq<+giz5&W?MiDP#g1buQ$E4Vl9tfw@JF4?U4ym=r*?V_ zS|PyrG`B;sWgNS@V&MC`a_9$=7_a8VZ}gpOsE<7ox#&+}G%|vzds<5Odr9l*0v+0y z#QJ?YZlWuGl@?8R*?~`{(7+J=Z=AG2{y1tmWEe)M*F_|ip(FV^UrYrc)c}Pw_`%At`JM&I0 zE?I2onlybih}I-?+p8Qto1sc)r{8Bjo_3%UWydi@Z@~0i(lL;|+HI6y-JAvMsVPbv zhTCgfw-VF~mZVwJBR%_*dBTUqc}l%A4brV=6CozAwWE61?3 z-!?JT-#vLR-Om}wI0tcJdvW*#TT_Q%Te}B+Iop=$`sdCY-Ozh+X=4)zqba@lx-)P) zM|eY(o^pC(P?qh&-2&6y%n| zu9VJ7?j^pWDpF2@I=k`;e_IN@tg>S?2UoTyq2$F5wBcOl=`L>;y)~2Hf%x}!Y4g#= zZ8iA~iXK%!Ss-aCmY3%>i0))vH{eBwbwuK1^Gwpi3 z9HE|U$H+@)dp|oS`1Nq`DM~!`(!Z zC4LU74U?u4+xDBTY_ca8Kg%=m#8GSs*QWblwOCe-!G_YR>V!jKGa^8O*O!uX!E^+? z2NM3c>ZyI-6LG2(U)H=n$p}if-7**rvvfS4SP|Z30QFnVo1Or%%RdWZ+gXKH_2rYk z*b09CXx*re%p33NioG&{nu^>u_UZX(Ns4h$u&sLc{j5Du?SDMWgXKJ6BQdP>4wOYnbIch zF-EC;qZe#6r?u-G4eJzaxb0FQF5qG#jWX2kwfbXSK{Oo&4CMy%~PlG_Q#bDSQ6zY?{vB*l16W_HqrP{6Xj{ z@h1MPOLC?4BvdGZp6hFx40=9rYl$&laFUUsJdwv1XXSz8n~9#>!iiFL&)E=7@ANTk z$H%u7ZIk!NKsiT-b;(bfHf&d5QYGWQ0a@ak=o;YEict@ zFm6ZP0Bm%9TYle$pzMJvOtoNf2v7%%rmysviK|prYxk4Gxl0vp% zlt{@lxn!Y0Ck!j_mM(n76tc0@Ri(npUGusR#!!{u^7ECskSE!P#5)~6-OA%KxqbjU zP4%;`-a6M#(8g7Lda7RgoSX}_??=vyv_Q#|8ruMCfda0FM0z9eLK38Am#?n(;qP`RC*m`u=|bi|akU(v3x^1cOs&0fxDVT$-D}`wzVf=k zdCa|HSdXrTaXiW6I>(%y?~u*sdaqovsiJ^*R3u0sEF?p-A#~=K6FTg zu?+E(@tM-1MxIC3SFh-8h;kA3>P>r1Tgrxky)d6wDm$Sz>5rD%BbWK#$Ngi9agPmQ0l`<)vtZb$PcqGM)j|AB4_q;*{B}W(TlD} zvs{@IIonJD&I+SnkRgx~kj%DC3jVf3;%#^Q8VEiVHEW#y=B%HUDf3<>>LoFzY5o|} zyH$Y?id6>gk1vI+EcX}b7zOJnc0If#uy3=k=`g=a^FM#9$d+ixVZQfs`K_3HWq{h@ zkC=4;tDFupEQTZydWoV7)}1juaX_J{51b}g|5tAG4=3$J8i4-n5=~zy`UirF8Z=F> zJ~5s^#&xFmJ6%>>BB%Xg4H9fmanKUqgtaKaH5^7uRt$3Zp)FOZAF3q2G}%iF!72NE z%3+ZZRI}Y_(&Cwc&L*t_qdLqSz_n=GT=Zniqv`|u9&5Yva<-Z(+^{ypb6{)*!Sl3$ zN1r33_}(B%?er1-So!FTN&P&(Epw_ZJhNheGZli&AFZ#@_rRxx%w?gq$-d6+$iS+} z_91El?=5$_NK76uiX{2BjVar!YwON~hM$RKK|_c&lm_Sw`KUF4kU;+WtZ$P8w3`Hi z)qEeR9{KZMqOw1lR>paOTO%brI=qSk3WNH$6w>$_|09NAl#T^4Q5;==PFL5##@wSx&mo@=;y4I4 zLy(iT++tctB{Gca<5FT+L}S?9hvH{;XWcRe$Je_;sz2dfR-cQ5Yd)CczaC%N!T`0N zk>-!v1QqMUukH+ss(mLIpt_vzAtOrQ1a{jn1Rt>Hn>*K}?c2!TTj6G(K>R{}QCJ`) z022^r{0bw?c}-o#Jsw%tB@BH>$^GxXoI{7NWu`_rh;GD|fx8sBZ9UV|?Cr4l>rfwi zbLk1dSFMjj5gI?a>Y$4`h+_Am-#}zh@Mf8;S1=E}f zMia}LzL~+JeF_U>9f3isDh8DTxgzC&GtoqSckJvvZNO6`oQbf;%EWjaNLEM@`w+%* zqt+MMxxmiIkhNR?OyW=WBQ(DRqu;&*bK!`o;Whr$JG;L}UvmuPhhi7i6Bcvn>AyJ+ zqz;4qHhmcz|95GZLY@<0B#aBu1TxzX#C)qtnm-0oQAcYr4(x5SuEucaRLL}Wr7xo) zLbP2iAI(}0O;$2T%N5F!kS-_vRCxdoZ`DR?A_ne-SI1!Z7jNg#cZbsJyj#;T(o}8z zS|U^)P5h~ai?n)dWPRn95r+!>5j)=O^$BM1$s7H7c5j_Tt{*c8IyK!>NVESM`pPM@ z$LK>)gUG+(3Uqne?VfD9O13E+RXqF(A%dk_+4=?_T|W+~WnF?E(V&U`H{&w}6l})* zRZWV%WU_BhQ_S~-G)G0feb<+Mu^JinCytq@y+H@(^6~AIV)|R#5)S0uHx=Sf7faW7 z9U7o|MuT=TfE0FMQw?4BMZ*mflCLw1>(!}BD(T2VU)tFOEo7N!LKvLu-|c^wEog~g zJCg=&^D(2+Eq~XqE#>O2ayBF?k;$Ydy)o&_SaAT^mhGdAgxOHH%ov6A6h6`C%j?T;i=))B{^_2kc zPMNT*ew)7VIVre0D>b>B)LHHB_ertONx!R_k>=_$@U^s=N5lPST7+w{Q{fU+W?b z)L`w&4t8{yrzvjsH>)MWcAyJ*-cAkWACK_8{9aVKeT!}R)d3X}(Q9Vs@#uqM8C_l! zJ>n*JBD~r~!f08y2PVt5jMXqqf|wyo%!-_x$19!_lgUnMZiEwVHR?GH-P<+TKKOXv zV$KUk1r17}Jo{72j9x#P&G7GNst8K?%y8%AYAJb*`s(Dky%lTLNqbK`q6IILKwSqj zi5#J<;f<+WEqhOr=xw+diWTW1-WL~}c+(4oD07zxw{Xm}AVcIxlKt|e%JEoFng?E9@aapN#ZfkXwBs*th8c) zhcvWwhqg|oyKcY}Z~9(4f|Z-O-VSf(6{T#}UKDj;8kcpWocX1h`RjSX^sbk*e68XN+^{eU6aK&-9)KKLA~0VUx)QS)${nJ z?q=ih@hlvLgWc)V1|PQl_#HFZw!ytHE$+%g!)Jo0s0{*{W(v+PgN+!ywECvUndow+ zP_)cjZ%e%(u0|4Vf>9wOk1y{(!sl9zDt|Sn;3L|L(a5HkqPgZZ0euEDw1ky)N{_ac&DWI!JZPoi5?u+ zNJh-+YPitU#I6L}ALbxS1VD2>+iwkPE^m5PVyg^y$NU5d{sHS1M5fzLvdW!bhI)mtZtNBC)4Ef^jqEtaY}uAipRk|Orj`n1hr$;P#2={n^MXDjE@1|E(pwQl4%THl;9@eyDWg}E6~FVRGyCc%Jg zO@L53yDb2srr&YJE%m!+e5i|>QS@f6yUwh0hMkDDgM^Ep6q}LYY#o_Nubbv6;SW-* z@ARn`=)O2oAwZ+jv7!KXd|JipspR}F?OLx>V+aC;cInlGtsY7)^H)vg`)2_T)Vv*7 zsJ-D~kvHaHyMN9r_z2b$|CitLE)oqcolbZXUMQ#F06gBVWaph4%O%xek1lax%=Wzx ze$@d~sq*b*a;h*$=)+ff3t4QC%^L}t|HSxeD?8J$LKaq1?ogFEi6BKF^}D|5{;}S; zZhEG&9EbqXZcg=-;7Z$f+cHYWMk(0w&cW-{b6`J{D_Z%m2D?*go`b4MT#OozLE?n1 zxbv);VfZQra6}#WoBB+opyeXLHFw|l%yyv`3>h65jz#%%io)*iV(9;vk5ZN(D6*&y zZM5tlVY0FX+8F(d0iI3bs0NXBk73*k0E;+cg$!qsXFrpI55ipeyMg9ejOwAhbv{}{ zFI098-rBCp-=}!F0n*f(wsg?lT#X13+H{dKsdPVxcY3m4$7ZmRfZbP75Y@ywRt7~r zHaHTP&K)O(CZ6ygjK^oEH4%=iFS>(aJSAq|JK5MkXRPA)`}PiN^~MqcV(i3eCa%?C}BQIf$7h(AlZ8pnIPzS->tP^t_mL zN_A<0)!$!u(@^y6C&WcCTQJYiMy36R0cYP+5CFVik!h<txG>9W|5*!Y6l`o+4z{xs)g;q=|NR$_6lwp%jDF#A<&#Q=Pv8}+=d z+PLlUH>*_>UkG`!p{u?H75|C3=*1*jHe`cj~k&Lf+$x?k#pfcExpu;?SRojvI4ZG{at0-{haD?l?<9QpIM z$3MwE!;2gP(-X6vu)L$LAFk3#6j2z^1&+SHQxFv){x;5(>KVIQp=9M;B|2T6b9EgP zXZ9mft8w_|(q{9E$zacpo7@WMQX02U{-}dCSaXDXkK@Yy`8XBiBg5QP%&y_b*C{#= zw=sjCd@!9mZ$r7B6;5jmuKC%tdN|zgt4}tTMHar6{n+-fzOm5YnR{WY+E}*ae_eOO zrGg51SZHvi^wW>u--ixFd`VpTL#;xEstT@vpRk6+6UT zBZe5R7)I`p;0^T}_VD$nskT&f1Wj&vM^zNRy7)0jRr@r}_b8AOvduoj_Wct8#@a%tK5o+KT1JQ<{9S5zq! zJ>RcLKb!ovw8s-3wN*&}pdo9u%9rus-CSc7h^|_;d`1Lbs&!sBdxnj4%T&`3lKwia z^9YmI4F$|JI+RE@s_<1*65i32C}3?mFw@Au1p-=UV?er(5!r32y)Xz2`dR4%G#-xh zrl%`K0LwTypl?^~+cI9RzOw0%XfB(H2oYa)QQ!HQXr_|z4#(a%#$UYQ8G66IB-_w+ z@~3Rg<+K=oo*m(2l97lKYw;iC=*WS{eG1nr7BA?Mxae!(BURH0mgPOa|E%8GLp&cl z9~%~JCM(N-M&U-@?68`T=`RuUd#1{s@xW*c%ja5u)2?!Cxv%MB^jm}--RzvB2-n%! zt82eC-&6f;{EK2b={>Lhf_7&CNrb!@i;$Ea2G@hLvDlkgc7VSXW z875TLfGkvCK-mTEzBi6`LENM}sLkoKu6k5a9S702xoY;^-$^DU*t{sm%%f#G`1Y{S zv+BgJultjEqPXUbVmL`zMqw9sFOS#hJF^`F%bIvV^q4X+p8zdt+%@I!%V9PWgpmnj zJ4=QA8b8$ImVu+H*}(9jl8V*6f((g6}7a=3XqEaIUP_pYR|RRWZ%+Uqy|7ub}gs9T$^dGKP}@9Z8_d_sdnyR2(@Z z*x&LR#tbs`lH`vWCqF?PO02KcRIZ{te$YX|fLN2#^Gm33ckt`-dm4xZe&vnJ-g705 zE?SXOq^wh^ufJw1w5xD1xxv<+M%VciaLA|PH;K?CS6pm4;8c~-+B%Gi+qga;Y2$yBMxZ7d_@bI2cgP0x!JJU)sxj zr`6>9<9#oibzj!AJJY{>S#Jzj=@t2=pGifzkhsB3s^a#Q)xfNg?#9u(J?2HAEBg+zeV z%6{MxB(sct4!#IsZ|J;pqLwoyihR(`$OkHK>sZZha|*1AD=N?68(6CZs*d26504%N ze(@$Xsp!BZnbM|&kx(fOY-#nR0BW@{9dEdYV#~QB%HO1N=@~ns+kkZLm<1-s44b=k zE#zG+Mr)(aMSc}1MG9o z0O#@PMiCWT$F~}aFOr2xlV8njrh0+l)lB{_#J^== z#^%h7D8_xVO{9rcyl{Rg7PLWbt>X>ceXt5-j=RoM?%a`ZIP&S5A2E z&Do?lZtP1v(oi9wc(t*RXv z=X#IU^B=XqwA3ML)YgF*7}E3aJ^S1gHaeiOk}Tn3bc|Nye@9sMgC|+*fwM+7`BXtg z2yw6DVp&5F()NDOUWQbG=#;4q)yBeh{(irvaE$yzCb%a}gE#lWupnK?^sBM3 zvWFQnXZs26VXHvA*XPQxs&`a$t!ke|GkT1YAL-}(7Z6xz{{(np@5=#oBKDK?9};os z>TI3CnvU$@Zq~NS{o2@(5b@QT-yNp$S_RpIPt>QJ7B1P+pl(4bMF}P^T9qA$pA4K_ zXI=HTku7w^1q?TEwnq&jBO(&mrNVjK@6|qewJ{W4jik)4{vp{>>y?$m*X5oMNwpRT zr#sOUV{QHIvV!`!iz7>}4UW6DjVy-;%&crraoAU+>CWEClmj^4+Sw9;|7YtSkfBC}9$B2RGE0 zyK6i*rot`psGiNF2On759(f+Dg~V`n$&PRvPJzyc2G^g2!N??$=JMZ@9hrZMvt?Ti zK8*Fr&L*xsN&VmiugZJ@&zAVoc`Xp{qtlQ^SRq)WWuyn0i%MCs^IDyEP6H1$ z*{%X4{4NvddEb@i=A$+11l9z(Iy+9aGvof8gN4>UcX*zbk${_$q0{tvc*&ijX}`Md za=%v-H7BAz z-;C{378apR6RIF$;w0y~$_T)Qwto8$PnDEV$}m~}6_*1+rhLtmMF{Eo{;7Y4F{{DT zj$^WRCTMg)a-#D>9oUCeLd5O^K=z5#k<*MB%oldEb?Q}#g zKsfq4{q>h#U_prQ!hZ?=6O}_=(m;dKL^sOpH@h)c&K}Z@qpUpXPI2W+B zGVZVdnd`~u(no7$q4&Zt*tDatN1Gpu8pNBE$-MW+lZMnKD=VoGjkI(uH2X7dj~Yhq z&;o! zUrHOoV}36fneQD8UP2HS!=EQ&lz*Cx6}eA~wY<}HyJ@KJCtgT<^tqe_QeHjvu8&X8 zC^Cjakm6vu>9vO%F3H2K2z7vY`P@ZfZs!cR`CwYF!3l?Bc=&jUb2Ysy%)ZBukykv_Vo;*|1Gr=dgGNP< zQ3u1wP=X{C^8SPBSWeoAe>Zvj%RiZ+I{^4Sy@m+#br#q2Lh0Z9iwp9y5qm-Vv5Z7X z88kTZ3WXu#L_n2-iehjy-#dQ&#@~T#|7!v?^e{?)7<05>tCgT$pinqm&_#Wudx6995viX3-JI^y}N2H_c<1PM|Hw0ZPN$O7mhto8L z^l!{qSt`$MUGb{Vf$NX{C*x_ZAQ`5>?Pc_JWUMOX|6}hhqoQozwQ)fd1r$L#r4gj0 zyF*av?rxB75CrK|dH|)n8;0(bZjcv9nZJ|BMt>%yTFl(NB~*|zLBmGsu` z1(|WhznjR2V9agGfnRD0VGR0=d(y_wwb3&}_F!c~L>SCcEvkWdfzwuH?5_aHp(HLs zpa|lT*sp5;x}W20lv$ZA^8E;0tL6+`aJ{VWcTu5E5dA>EsJ^iG0L|ck|F%YqsNF5` zfG07If3Pc}XLEj6izp+TKY;v?a>ZUtAvzT$4ryfg6AOb87hkspWrV;ROOruyuH8llZ zDU5UYQete_Lrp(O98cGcenBtZQ#QSaufdT>%Z}qOsTh_{y60pt5r7-K=Lj$?{7(cj zABi0X?jCjF+rRubLt;ZTsZiH4BkJkz3&F?OZ)Fi3jDTXmvs z(22y#OXgcI2@H!nHh5xa+TQ8FU^xg5g5<}3?fYZFl3Z#FEw-?(Y3!;+?nYzhC4cZ4 zK@Nx{HI(E^`-S8~o#_Bk{>1oP7||&Twpt7tHNyHBtNjzL{Q;uXa8%I*@k4NMOp22S zdyR&(!~8eH?@7e)gVDi_5IOg_q(7n!uQM@&85e?!6ex*UB@SCE73(>&<~Pp59G0OB z*Z(M=d_$gPQqt%{s;#k8RIIz}kW~q#Ip9~a>?aMj`E7ZS55F0ux`$sYQX1#`}DsAFoMnmKI#_>X!C>Me1%XY z;0VQKqRxOJq*K4zK}G}|1`|FZ9JtMuL^1%Q12n57E_x1JQ~Qb?@WT%-MF?>OGwAFw zLO`9FY8dSEz@LCm0q7F+zf<_%UHD%^0*>?l`?Cwwsy@XzsW$oQg zZn7S+cV0;f#5UjrlBjG!qeCCd-h3r+;Hr%t0W=kRV~<$27`T(c+zoznyc59=_wb%D zVn-VA54lb-hZJP0&v-U875&HSYc+LUq!z-IE~-pX|njsqs9QYzwK&SUydk&He5hzwByAE z+|w-S4eJnYkN$H&nJ`QG%+P{bFA6!wkEph~IM8s*YTD-l>1n*8?u6?CD)|Cu``$O5 z65PdfMAvd?OVvITm-ijc=Q=?QO8I!HZd~)g=-r(m_WmfB`vj?mzn3td`9C?dz9Ka~ z6o#W z{F2^9A5x$89-n1r*LBo3GwICL(8`j&A;~HkeMW_P zKEONws)x0>gM$#i`e4BU2q^Y4*tTsT_sw2UI|MX?-dCuh+;cZf9prk#iKRr%L*HBX z=uWr->iV=z`GD>Eb^aU(IuXErm``(2rg>CU(*jLSBz-*7t7w*$j;9u7nL+PB)-#E%ZQq^eCfpy{E|< zFUo9!gmFOIBV@RMa7bA&<8UER#;d{FY6d}td)Qver^U$6V|9u4<^rGclnZ4NL)Bt0 zHiU%+=SeV4xNzIo-^^83OpF2&wJtV(q8;z%pa<=L?RMhD>(HrUt-9~S-8ZXDu9p?D znw(1xR;8 za#;I)xIia}rOd?*YuE7S4J>NI7I3}GG-?{^YQ5k<+C&6gDVNrI9OnyMgu|28?WFHPcq8_y<3=VzDsrl zz}}3%iOHwueE_RvMss!^ug6_0i1z%sMuUzWv4UX4C9B-U`8RSA36AV?Z)7_6H_ug> zRszeObz2A+JsRD2{ZPp6iGxBCd}7F~?ub*&uoJ~=&h{p)0+#p)DL?GQ6u(-TOw*}1 z3PbZC({&y-FseY)}&a(>a~vy$^0PJ@wmW;nBZ8 z&}S||Nj^$PDMFEFJjBDK1LV*7!yyAT@~4X#vpax}_=Dzpk&N-iYiC>Z`W%J0=(mRZ zhlA!*CTsJ2Sgku4`?actXk*1*B26uPc>~KcCO$!JHPk!Z^cFv$kCiWXx_Bt%IALd& zaHm5)1}H&cxziI?9a5BZ%niTtw0uJ2?$HDN`y+>hIpRk<0WRB|U9BIe{77Ni$n}h z^}J`{ijTe70PEb3{9OZFcz&!ngc2eY4RDh;(V6B%}Sy24OV z?VKHqi&UdK!{5~C#hTR2t=CFo z_d0a<=S}50CC}9Q(l8lkA3WrvUihx2I3Ul#B~#~&_T!+2dG~Q@ll*LocAkKnpj?s9 z`83}14r~|}P(?(9_M8pSM|r=I`w3Y3uX=xO?4R7W$KqE{V)@Q(C{wk{qudkLmAw=5pL?)h&JL^$INCe9vJ+t+Lzu<>o!= z;tf%YnaDOaI{A^=^D;6j$@0{Cs_Q(u^>C)q>hy&v<=b~<{))QZd6)y5dzaj=CE|kU zHAjxZa!f-nCTBTK?Yx{yG=HOyj6%3F7mh*ai$_!BYyFEliLiw>^g*0qem>3vEOb>9 z5)tf70v-kH$kmHBmr(q>r<{$r({3srmD$`V_fahjLRHmgWGyri;jiA#icNq#a=@;%k*qFzV-+ z*K42Zf1TEbFl^+Hepcr^R5mXt)Q#vfu^sc{yss)9xXgRJjMSSSHbFo6w09*NM2i!7 z$Hm{eTEler^pa^o+2;E+&q?>!$3PXFiw#TtR-Mop(VMOeIz6QXDT71P#W9a_S9)jY zixWjDo04eK*U*(`P^EX@#!jzJTv$jaC|)aMsK#&FSydDhBg#(NWG(>L;Kh2BI;))c zL49p=DvxBKzA-m{h4xPRo;ma(3XWFORg|c5oS|?l=}U&u@W&V z%>Wsgg`l}ssDNOa>!MS49z-Takf~YJ$ksmbmE3&(Mx$+)z!f4gi3?}O!g`JX;{E~{P z0L$y_xVJ8li(eeLn)=u>c$I5CIu=&JH36?&dkNN6j;-)bQ)~ssNmhH)IGE(FY-rKlp%^L;1IF$ zkcgaq(BR;l+2BrbQ)dbl8V_-vs=%6|a&ST;_O0}Z_b+l0V3Utzfi;E0zGtZquJRAy zDuvuBFgi?H6F~Vz4SlCs^EC71-ib+-e)Wm0>^8;3igq&gHl*47uW}V)lh1z^kP5HJ z=a`=vP{wE)9{|WNK{#oi%Fe^Y0n#MTx#oSZ{XBG5Xo#o3#`yRkuR+ z{2cTG=**;deHCusjcv{wCm>3xc6`!Q2J2dZUZB@YQddw#Hd@_xl@$`ej60%6_43np z_^=sb-bqO(t*4~TS}1GR+xQK(vd_%aRPA>=R#W4O?!47>A~0_;g^irf)sRf4I6w{rlw%)s(}k>(nVAb-uMx<4B{Gk??99m|KoGE*UCsEdM zf@}O7;xtW_G3z2l0CY3ZAfF88tIb@vE+#ou=hf|C@j2(2s(xW${DyO_PJKO+zRfx8 zlcxE;=+ofA6{d(-nJ7VHP#gkd3`^|UH4dsi<7gRmpARZqrFof=INybixntI4U4 zbz}u-jr*VO+13OpK)gT%#(HogCnSaQv|~1@D25smbz;iosg071-!#SIkI(P+)9|8C;+|n(zyi+^0cFZFrK$$&dPNB)2oi zN%}bOrn^KWan)nDFK8}*ph+iDHyXq%*#>rV3TV?5Zv#!~32i%Jrix+eBQ5FTuQ~X< zjS|yxK6-Q*A2PdkD`cz^1p#1CN}y`BDJGQsgm@P6a0(h-y=moE6>Xk>pb7h42a#uH zw?#htRAq1OBtt|9Nki33W@Y%os^!V9w4SZ4%UMKJlz;t zh<5J4D1vE;WSRqS=W1kXm*PA!@P&Evcl=u^ zq9~ug{W%+8(2IK?E`h~%wLlS;!97(gz0c6~tCO^1_VrMDN z`&unElI_+^6f{2vp#dvy^-xkn`PI}*XkKt5$E8YIiu@o`77@s0`b~Kh32S3^r}5|- zw3Sp<+kBG-K6w5Mvyo+^>V>LVS& zbS~;%x6^%Nx1=Ig?TIH}L=qd!r*IunciPT7%f2;Zn#}-qTj)_-XVCw=Ad~eZ_$NbC ze&n{MjCgH<_LC{+;_iu=W(xhed?o6w=MJ-w$IZxLwb8(ix4?S)e__mMrF`XyRH*Zc z*3Y|{_L%@@g(Mu0_Lgqhc1v(5O?!!y^uRPx{)L@CPrnpSAkFwfsdwfF2)Dccz1xua zs??n%o4I@B-+NJS0kp}E4X6n(Kwl?N0dQKth5H2@oIa#LR2c^FwVR$xHuwV#S|Gr? zFXx}I0a$d)_7j8v?g;LGRMb*rdS`qe^&>L=?NhA))NZS0z&9OoBNX5w0YloiCxA2i zeo@lBfvNP zbwE^MdIlTNI&46&F-1O8;|JjM6AH)}7JOi70A3Gq!2R%<8& zFa?4CngY<-JpVvEUoRb@g9U04~xHzLWm>F2Ej}zMhCMd9p-uH+a=-Hl0dD zM06D7Ah1uQa@zn}4FP6F315JZJR$M$ks?vS2P(`RHvJYpoFBjjFFcyc{qVZd#wAiF zEW`T}Uz5|et)(^X4IA6LL2k*H#BHj&XzW{vIske4k986KLmB^%)+L{?dLo1=t`d~74r~g@G*n2Pd{{JuP z{0m$*t9c}s8d;|9dD$348&-F|1=QbUzs*6;+iTB15(q9rhB6T-U**Er9d$ffqybL5 zy!U$;YhBnO`5gR;&NC(8l-alrNgV|WIhCt7kRF`9D>v?s&=-B$V4bddfSW}tk-LQ3 z@(hc2@QOaFq{3YoxMdV2iE2&rKrS6}z}J59{LLJEd!HFSeB&@F#fC;@6X7S#d1F%D z-rn9?&&&5iAc1iH24{oyW1qGAwBFJqNqxrlKjr!~|CrvhfBDS+$@J!5;7E{fJbig5 zM&8~w8kR;8_|jOaGT~D~GK=y1p_EWjDXC}a781DEqI*T!&S0JyeKxkj3&!Nh`EDJ0+(& zC`2MCaV&df-+52IR1QN6?EYj&oEgM#%@Y%Yxd#PjNh{CK6yl>`)1f)Z?;fqH)tg~( z6zeAE`$$|J4xlovv;~B!HCRy1x-_CApC7buMmJ0Il9|oazp$7p`j(qp$mPA8JI(uo zVXjg<;aP#M7t8qLk`pC*z{yqky+08CM@LZn9PmG^1`!m|5B}&Y63h!Ww34gt&jG0@~Vw+a=?o8A>zv-AKCsjq&%2eqkLwjeX zW_O+#*V*O}y!MB)Ped71Ff_7h)`7I9xv zAWFe`ULZ;V!3FfqYsF;oC)|0<0x_Ur8P8|2Z=23wh$FRL@QAYSCw(M>*OG{V0V0p% zw!db+QhWDfh~@2qDps5IlE z8i;+X`clyIjOsl2!j$)_aRS}W&h+Ruo?^F6>nMimsC~+QG4D zo#0}>ZR6WEUGnc<`TosD9v;I@r|;71JB&XA|xP z{2g>z?A#j5IovzcKli|5R6rVTo=3*7+MAY5JNU}d56mC2U0k>Y4V?h4h>2>2#XxRk z(^AnHKDZV_2nh8q?b^OT%X^0GGXjo|?#GK`$A9X0lo;!U)6iP`u=`ouZn*pd0#;vO zlqg~S3Q^)MwN2~a`FW^ZDo5sdxIdTYeZN*Q92$ia&LjZVDN+_6Snp3m|F*cFw%v$R zq$zV05{Gv@f-Hq4ykF&gTjsiqIJ3yZKHEx*r)UD{AxAx7PV_odT{h~ZP4lm*T5{HMpCJJ~| zb7|U0f%}Y`NFY=_!rkBz_=8`w;LZEAX#ri8QCq~wh?0QQ+7~63-h57xqTEPW$}AVF z=vikzHa)ZXO`1leOdMS}<3c?}pp`Nh81MP+d~i77q~+X4Yf1M`((z%3wE^E@WFITs zjW&vMy^bhZ#qdM-7X%h{OG;}=m_zO#KG$yjpw^!m?aUjtoR+emcIudF7wBI8hWr95 zJoCFc&-;8N@cbMWLvuWu{~ikrH(dzs0qoQrl)N0~w1@7y9x=cb6Nkibr`>eIegGFD z{Ph6>=960HsRF1>k1Dg^)3cp|Gcjvx2IYFRjiIEs(O*35wnmLHI%5tkmhSTWxt)qb zK=hhTM06_o@9MVl-^hL>Vc=XySdz4`1`ug+F)@Sbs2vQ)>Wsw~tpM+#+tW2+l-uZB zk@c+IpjQ;)I!}h-vqyP6Og(_V_l^EqI_U33rPc2g4ma{RCiR$Yf#KT&?7V zqNVP_zg~Tj{~P$&ml_^7FZ^MF45F7-n+VGfVd&8VPsoDELL{v@ZVpo|bYbp;N8aJ2lYn<$C_6}Ro8ZnWkO>5Efk}6)SS?SYkO}Y1>04C-A!cKXt zV`7l;m^hmQpB41h^{~N+&LdQB=fpLutOI$IIe=TThtwfob5O|Usj(FyAJZZVj#T%~3q(+4`A&!=?oJ;& zTPF_?M$Ed8m5Fh2iRYX%~d?thEcDgT8F9L3Fpi9hNd% zTNaK8?2uoQiM@G?{tt|UUj zg)UA2&`t0-B zZ}bIp4QjrLzd865DcBK9ugZtHQ4Zxn5dlk#EO%;{chP}2+2Q_kR zRn3|PUNSo#O=C#C%tL5UVJduJhe+qsl=yGcQh)JnhTU)sHoAmR5D_Ze;<+MC;h z;O&VH=cEZ&Tg{BERV&t=XjEB;5=j3H3uy~p?Pjr@#bPrX$E!PD>k1nFuC^k$*ue$M zsQTVBqJ&)sn!=MeBu?1254E=Pr%wOVYhf739!|n=hXDar&m(xMXZ-c`3?)2Xv|v8e zB)Fxb0pH=4WAq5He*8zVpMY<4m4H`h!#C{}a2M>C3{PVJlF057!^;{|z)So@2pEL zdRBj&OvQ`E8|^{eEvpiYYkqKY;+=^h_Jmlk8e7A8O}zuQFOWR6oQgD0+oh)@8)Y%geMHg|tZv6B@_7sU4i{%~85p zYsRMpYad6WFa->=q@4=a;yxbq3*p z9@MB7Y47@U2qXk6KiAY56th3lr6rdwl(vs@%X?H)HE-9BydADy&5LK$ZZmgl3MW}K z*zy$gF^VU7ZTeIt1VQ2!>mx*+AN|_krOKUsY9Iv#xm>Q4{&>OCtC5+CRcM+|hp*Q) zpS`sNUkUz5_Q>Zg@V6pQ9NTlR{hLo;D)#Wbbn*3zx@VLLn}~2Fu71ixxS(@AH98VA zE9MQpMwaeg4*Q}e#DS?-i(@Bm2i&B?Ai$oxrof8r2?X7DDC2%_Tt1R`Zlyo^FgRPY z;v3ko(ty!!r`K#6ide!+*+a;7!eWK=p&OZ0#O&GoB4*R<`{LT|%N*^%2wKHrzVBW< z(^;DDEtc19&}u!Z!^4On4vn3ob=t5gl0Hn)#1m(83P_J(QxuRsP#?sMezHL7gL1hZ zX`1GBicl;~nKD8_kvbJ-HfH8?y4b2B5W47{=Fz}UsK|OZy1Lt^YqD=ResJfhW3pG% zeC2=FgEuUf(2rMa6$|X}W7zq)kx%Gn8sT69U-5L^2w(!`@YH62zrPfvw#;~a(M$Wa zf#BK-)6$!?EVU-1;1nA(GrWC^v8U40{RFYtIkG8jCO#XNiMR1v6*LxO_qsgC{X?w@ncW4KaR1rx&Mx3o)mn?g;74*CFPq?`_YfW*GS;im!Zjn=|THr-Hx{ zDV{(IFQ4y-e;sMkt1`)ZV72W`Uy!<&Ulx-kvs&CRmmZ~rhW_G3K)Kgqq55=#NBnP2 zAcTVw%Z&W97FiSIcR>heq^Af#0T({+W>5)LsBQcPJn1bs__$Cju1DBu6O5`Ao+IfY z5W!A=FK(a^({K7GD#KNw9(J&A0m-)>kiSR9>v%jKqyE%^l4uz|&~CEiwZHLR)%wom zRElnCi(hox2<#Hh(>>-=S}*b3!F@PA8d@AJu=(8F{lEsC>qz0eZO694L;*T;O}HKU z;=Os+lyTZbsO(X^k*s=sE^|T*T>m++IPsmOw&CS*bblotg3}2=7Zcu@oTjzgF2gzQ zSxM0F=|YI4DpPmO(!Jc2w`}(>3|{+W!@1WII@Rk;0%QF68qW)0VdR(9k(BI9CPV#b*^08dh zAdF|!Du*PnjtW-2lIJ*>FMnaFQu4F&<4ecA$;X78h3(_PuV3NdM9`#pkjObznEWfNFdFaOJMGzdy$Wn1DRUED6I&~^{gI@3KM zFmAx`AimDsA3I-sNlP`S+I)4xnoAUJ3ubL8V$Ly@#F^t_6_s-{*3W(MGn-emOwTnImBSL+U@nER0FrTqmP=H#T;wy4rS`! zI3T8$GHvKR5t0@2*{YfnPq;@n^d>YnBjLE-ci@cQo2jE8^jz8H1Dp2rG;|H{PEQsu zR+z1&7-ypI`*Twq*zoHQ1*MoQ&X{bN@ROJ{vx2Ngt|LaTZ9dvIxfS``vn~1FK7Bcg zU46QNrh4mqUVxE&cC)$tB#&kw5&xUSuG~ue)#_wghW8J_-0t5_$X8}SX^VI=!!@=cEf)PtyStG|RkkM=nz3VLmO$3e^&ZHvJU;_@g70=I6V8)j93%@r zdOEjW9{zE0&4GxEUDh&2d<=}}SrLz|wtxhtXpL%7FS*zPIpOMA&u7VBIjmR2f{`>+ zyCSzsEN!I;9ZZKhR-T;fHQP>96DxTKL6`QKF!a=qH11t0=hXO7 z`QLtFUSMonP^hD;cRYxQeA-06VqnqQlYHy6X7)4M@IGA2utP`nTd&)7WJ5qa1}^{+ zg)MsNbh_yFaoBs<fKp)r&VxrqP8n>|sXoo8>X)!;n1UbiGOcTdcpfBV_%r^oxa zu+!E})=g{YVxEEo_EoDZQ5m7Bf3x7QX2SgL_170Wk#Z*5GeEYz%_E}l_5hNx2l?M?Uru> zP6N1^2EoNQn>R$@z~%&DD7Y;+$o-wX$D_ zV6~nwL0i#vy@I_wpwnJTU=;?({VUoI@F8fV60>OMftw^Z*(9~q7Tze!i3`{5L@pj!le$(nZ^y>oL4V%yp15sB+r;EHN1fXl`d1YB zy$KBaGiMYqS#02A+uug*N;G>dTX?S%M@%AB37V5a))Ds<$J} zz+014&jO%{3+zd&5ifxfHSIMFYT(%o756P7m`_;psbDRc`t=*fob~iaq}{s29o1Ps zN-W*)>({bbJITZAHwleyBSnzc&c1_}Msw$CklqE3Eg$|}2Wt<@6nB?jRkK5M25Ei# z>DAJ7zSb#L;;aUN`Cs#?kDZR=!FA=G@4=$tPdQ?H63IJ5D0nQ{MA}7+QOy!?@&K$j zq^(uk=hWNwx~1Z|Lw?9lgJLyq6?0`bUg@}ZMPBo+K(J!BT`WvI->-`Ebc-!e8A-?0 z_Da|R(j*<#dq&mY$FF$G&rN)Y1>3^j+uwZQu>a)U z3(16#sv7pbw(AWdwy+X29sVxyDe1RG6~VDq=ih-X)&z>^5W=Yv_EYb1&0SuO6*{~6 zhBBi{bcxi~Fg*yGRCvmIf1Jf!yj7s}vXKV_&y53s3fzZ(k(nM*#y?a*EXV~BJNyN7 zG;x>^<;K(^>YuK`BxIn%M$3EIfCR*c;y| zNo@|Z=V)uc1e>i9NRn=QN#ftyII=I*UL~fM8ei{^B*Qm;cZ%L?LA zE|KT#?KeR0KGUk_hiU462J)SwmA**#HW1BHKFDtj_5kFJ|0Bb(5dMYo?&jc(v&_05 zr&pGJaz8XCOWHC3-#eyxmY2p$g(i=3n{K%W?DC52KkXVsIeF;Vo@c4#rg;k|*Ry?r_L0JqN}*UQ4(O|w(C)lb29b2N23 z*=7OnFkfRHIobv%yvFEYF<=DWP2Y_sKezx6{h{;UhwBhgyVEbyV!uOh2GW{;o!dFE z-a61^<83`0c?K$>LyKl_4a%wI$H-M?UFcb*5`Li!KNfdORwWbUB_c?NB#Pw`%P@%- zF1siC|Jmsq9uhhP&vxohcA5)wN9%vc&KYv|b$+^sdUac#3G}7lx=CFBf}-U+vnHhg zNB##QD=W2Zxyu|5OHR6@G6DhE#kU}!7{f*&Z2)ol5!~_j@$aW9v*!q$Y1uO1riT== zT{7!E%O1A8mNswohejAF zK;ho3ToLRUQ(Uv@P~xnR7kHPzra#rX9f&Q>a`svqj2}+j7rN|O0R47$u8mA!wXLWi zP3dj`DtF>TjJuUx^&1LA_yTr5@!{R}HXu5Msy{j&Y0HsWTs1vR4+FG!h*oUFI z!^1BgG0qgunKh5Tu=P~OwzIf@@=|KLQV}eY3c%b*cf87gdN>JoM+VNj9sgDC?OjeV z{H&~}$bH7B+o*H1Y;pzJZ=aX)N!fEcvpuVbbEy&LzLewjJp8IOGf3Xa+EweB**K#s z86kn6)yK`1VLkq@7QjI7hM;UpS&|)%*;CI`7U~Gn9Px;4 zV*IxQ_*>tiP32Nnt(~_RUK(UQ3o&G@r5@BYbK7|OA%eRKPepTJ0gS5D5SB1T=(KnX zh9`~U@4%+YgG`Zv*YC*Jh@^ z86yz)F?h#3YTU^O@RzNA2CmjJyML1KO4k{i=jG7~GJlu+tfeyZhuR58vS%r6Dfm=cgBChO~^z$+I%PK_6DT^uLJ} zIc|4 zeT0X_?Zlka5Org)GsNd^QdG=@P9qb{8)Di&Dvxv_y!q zZLx!mBKY1qaKuzf_L1CPq8l=yx#|Jf@?Qf3bE^!0t~jug^m(wa!~-;lYRKX=>+yn_ zQi4bAwc)WRcIWhxcWmF<(J_eq`|%t${xIEr2@g=CI7OVC93Jo3X61L;OqzhX#bB29 zr|0Bk{$6LKDZIO%v-3$W!h%ARFbb+<-V2CI!b#V>rC5T)nfLLU=7i)JXlW^~4Ybq{ z^fX53@FA}Vx&mrw#(arbVIPTn_o4VrPEBl;vv_eToAD+9)RB(OmWgLHfDWZ3@OveJ zrTnG&3aG89zUGRHgRm6TstlgQG3w;LAW}Z765p9rFh5f<8cx;DCrItw_EFV4x@lH? z@or9+Xw^70bG9o#{fSi|25(ppBEZ14rId>^^YA2B^SdM|8H5j|K1LUq$A+w|Fl&ju z`p3Tb00sx+n#WR}hpzX&4_g7OQq8DRqK+zx?33vKP}6*Ppq*eCYmUvSIkN zd1kZw-TStgXXva;_(LTx9%_)0T;`ng=JAGxgf+Y-@-6vsQmb)NBYNdLKc;o`k!|Mp zrd-g5llI6=%#DHBLYe{mvZXN=Gb6sY(FGY@MgE?oY3=FFkPqG)>9ft&ekKxwU> z>o=sE#IGf|$ae!>Y1S1m$rWTc!?!y6s}t;R8Q+=>(@;XKy=VG(2<*x;G7Z)>zsPo9 zvmAFHlqu#*H1K$KMlaZaAKupsqUh|3$EMp68j^7S^E7EB&-soY*$$wV_NTrbr%v8)RL!2Q|7oV zQmETNt(|ibLeZ=YhJpaDfkdVnpy%~s;2JDy;?90J3*!g;2GB~?{UVas#e!1@9{>R1 zqu;7Aupo;7+Y3-wAgE_|9Q^%=Y4G>Akh1O~z~2vraT)*n{r`8@CtgR!w&{d~`kwtI zpxT-QtHTJ?G^)_j!vnW^$n0lk`|z3}7OS7WuQdUQQH@ewNJ*eqgumq!npQMR4$PbO zspNjO^9k!qAjGp`=aa!{Jd`H&4>WE4EBv^!K%>f>zFN7%h2lFI8Ck2IOd^C0VrOjx zG9}^J%~OAvlgs1i+e+&HO`#H|df??=>diNF>nfF-p4 zcPycb_VDR0K(h#ytvt{y8V*DE=Ux0Z+2JAqp?~Y{Z_y8$Z#jy!>I&z6CW`wnxNzy1K~EFYL5=ZO{Gf$vK?73Xz+xJZTMNjc#tWW|B*U5VRV}eWb>)<^= z{yq_%>x4eO!?C=a`!+7<((w$TJ-M_UDcs+TW#a!X8Q+`Pcr{K{lnc?Cx*SD|2FfX= zL#(<1BGha|7LW-AYm{rVNDhI5cs-u>->WBCTz`U5D7HgH!AW$1_UrU38PLU6K#&vA z3>lJebmRy&u=ol{i%NYCbUwbiX4K&-Sx7h98m-;guclS1Wfq|-|FB^B4{fpVy*t$t zMe-$S*L)&t6ssxY{M;78pb0j1mE$s^m}&oaiwR4;&A*YAmY@KjRp4m46CpsTzveE7 zwA493%Ip>h29o&+KYR#2w^T|i4=MdgA~R7O?LbsBlFv}dx>ADREGkH-D-nm zAG7=9QczNgP00@JCDhe85XzJH@B<~?+Q1LgrI&grSN68|SUU&6gE%|D?{ts%HdgL?ktL3%c z*LZ?g=%OWT6sui9K7$vXQqAF&JKJ@Q?q?SHcRSX`gSi3(_K315YX6)`P#P&1vi>1> z5zwWCEtFIk(eIRZhB`uWPdC(Lm-14*U+3C>O_e>9jwNZ+Jm~sLJkJJ#iLwyC!c;q7 zFh5cH>cIq@LPw{a>AwysleH{@j>^#-jcLhs(+%dzwCNE17UA97_AkI28Aizt8mvTkyKoT?_&vD zqrD6&RgtJ>aNZrqXU+cH)wkYXdEIz4)WF5$H?=H^TxNOAVeUZ)$hcG+AVUmur6y<6 z7-#msENe)nYxRkfSl$$2Nyu0_*` zht4=?4#uu1XNP5yU7!UA2X7ttU zy_Xp3hc}xrwXU2Hj9n+~2NZ~10L@l)T?xa#bMpZFdj-JyWpttcf%pMMrh9X)IQNYG z0QVg)Il02?g*Zm7pi9hK6W;y01Mido*s1`DG22kJbmIZ=qH*<*R3R z2YMhez9QWU4PITUYo8)pA1yAQ)+``9-CD%D1~e|gov0ggdu9{WDRD9fw>8(6Q2BSO zLn)uA9L?XYH~ZQjSRPHGrLDdjs56XWRb>?QvUfH*P}PauZ0ApE$$OdMZEw}R3r?|i z+Z?e`JB2QBd2LgYc-?#myIJ=5#Oy3E?iv)%@0-?qD{&or{AmgL)Znc7-e9G+Y<3t0 z_iYG7*IS(4K zzKF-UirXn%vPAZb1F;zr`1$t-%BY!Vz}Egj3NYxj zTTZWf4w~pbuCFTClh^HgIfv7|oaXIk7z6E}0J?rN{VlXIC#IJ--3FvrfJ98pKStnU zxqzum*8k0%Je&l`6(c?C&O*gy*Z(a3_fz6w{4LR0#ULSPX1T2RP99x4u;;!wFQ70` zosT>e$F0Wl+L?&oo-($V;lSn_0QN4&A2g4Jpq_fx$FHr+yR|7?O=is*_M|m`mC+xf z?()2!cxFvlw3kb#soUVV6Tu{Ki$@bdJmnu1zC#sr@Lg@IXVh6R1H#2LI?uv9OJge7 zbhiKKoo4y8j@x8z8qpk!hi%2dYjzS2Ypuvc#q8;1*ZZ+yO36i}ce?dT*NL+xSwq*C z4Yp+-ke7o@?uLz;!!%#iL;R-c+Oh$?8I#;ACh$3r_szzRl4h3nS@&k`2;r*9P5SQ0 zj!O__0Nb?|4|M9Eeae`z>)1j3_78tJSFzp8tE;^VB>cz4cI@5mSD)EWKK;FjIPB1I zIS6mT>#Tfu{1#$7;E`L-h#6>ne*sr6{Dgc@I@5*v-Kwqf;!KB}rv;L%F(m19wG@M| z=*Zjj9VgBFzX$Z4PcU2eXJhCWi)2Y}-gPK$MZC~FjmD&%{D76*_t=zoe0ZE=&aJ{^ z)@M@VctN>Xqm#rOH-(>&fZd$B_sa4OwJjPTLI1|hnjI=tt!Z47h50;%Jfp8S?0e$&IVp!1a&^7CCI^$}o!kFiaD7SoJS$%@|u?32HjZGTTjyHxbiD#)XUj5%e* zUXYqQ3)yQG%wOYU5yi+u3bS}Lz+u3Qc1;~4ej$6G>a?#{Kr@g6O|vxGSA}iwrU=(% ziK8hj2RDM5Nrp}F^~B?TqQigu^s#m1JMmpEoCb(kA-V7fYPat@zIS+HczwUVWCwgA z7S&?=4DFq0u*C5jQq8RVB5s+9{MkOpD6EWNE$bm}xfxE>UYQ%Couou<64zQ$EQIDqL!#Zft$ z;Xgz+|6*O1fQZN{e28^Cf!6M$Wh0Q-M?5c^1TD@+-Pdj&*7s+bpW z++$D^baPfWjS8_;-?O+z=O7eZAfgQhu%+P=VC@feM1#%|kwg+}#aBF{a_;!HbAa7bwyADxYw97S_`TTExawCxTEGV)_YHfwpo^KJV2Jh zfko20D$ZfT{!(1*JMT-qdU#wgE{bYa(cq|o9P&3TAXG*~;x5J{eld9Od`m}*eiUg1 z9$TU2j?yaSH+*Dav`Ol&zVt)Ww$(o0C=#tNO|?}D2Ls%laWwd`?~OzJIzNgHUh17= z#wOKpAEe2C=_8L2cZ(uK*w_d6oYFTnS!h2prE-`^{S|C~H$r9Q$G)@^P9G1%q?tq% zj7C}S7NNi0MTKHkCA_sYnF;vzB3Y?#+F+T0TqZ@k)D8^H7VBWVMQ-bvT86HfpXZPGPpE1Jx3C zr06^oj%Wm*S%s`_*%~#2bqJhuBAgZ2x7R$`J2lx9IRWoV@kC5Uk7Ov9(h-P`-FD=5 z=!rNI3g|8^&FlL|1ky|?b86^zyCaXwi?g$H?cSS^@$Ru(Di+I|DwrPao+;sr#oKTN z1>tZ44pPHbn*K9+M9n%-oiP#NlE1sgqL)xn?wAv**AX^!(0+6s2z0S|GJ;jNvEBk> zV!ez+0*B#d+~V5Af(T7DxiWcKm*+e zZ>BVGge&Ienj zFSPH@@jxV+bz3LYN>0*0R-YFV`FMLcJ@9+9+gm+}B%h;=e#40v(BH$REUgc?&7=G+ zX{*GoA_P7cgv7hwU2CuP)ZaxKCFOk1FAU`?n=4!Snjn>H4_|Z_FZ(#*?Zr`m(OtP* zh7ATrb91wRmtin=Gnv!rHVdV)&gZ)t=)jFTQ?rV@WaRf@;%o16qFN~IaK0S4&j95nsqXP!2Ja!2pL9?FOru>U>;WQz+cx@w^!N2X5r~3HPNkz)0`F_Ub3tKrKihciOQ5LP?zJ-m zxQH@Wd!ge4mEx6_)=C`D<4@b<3z!h`6p~DK1}^#2qc?6s!bFa4{LH`KWH>x#~xIm_)-^L#oa}732Dw zdjubd_uWXqSEzIH)qH&O5upn>Y96G)DaM)e`bhkEe2=#Z*1W90@5)L>6mxzyPB z*dK`NU8PaLOy{2Nj+H$a~ey+Dk0?aJLlLw$q6yd)xBnYUJHTX#cTGht`EuVHjC7r~` zYh(@((0vJcNbNCi&`9LVw^2@uP?sS{r!ewV+AsWxY2T%vhc`uTLkDU#aN_O)(5=3@$_x`7aRa7^@i$i>G5x;`*L>x zN)Unst^j&!fi_6`@H2H#2)@CiCfAqaB;@i=t@6>t@`{a%^wv0=Ur^Au01LCN#GaR6 zhQkj)LtG)E`@G{L`2R~#B5RNjQo?Kg1jm#2DLc#Fh}A2r2WkU94GxyE2G7LitQ;UL zxS+V<9wGrjNeF>STn|x}`rps#O$lJc02sWIAe+;X(EI3z?0mwJ`}K?W!4H#`hD;#- zE0qn6*#pV!A_O~I^kRg%MF;Z9RSM}lM^0F$<@HPB7 zCgEQAo3qe zp~{L$E(dNOMMRoGQ8O*aq2q}wN=iz~`DS2>Pr;Hu@uJv6Il04#lL??UgQR>0AKrj? zjKX*IP%vH#dOoSJHLEBnV122nOB5Y{dbZcGo4`JJ^hY0juE)*%;V+48(=r1W=GgMe zp4+|ERUMUjXT_f<;@SiG2?|x$_!oEj(sRn_1(F+iN=37UVrc8nQkVT-@jqnHpIH*e zJ)lq^*NTt@hqjC!G`OF!$1_OFIy}vO`~dDrKs=OSx2uB7%gYO?-w(i`^e|#HGPp~8 z{{@#RSJ_IYRoNSvopLI*+Xy1U*#@`dUNR4%4iH(@S3k zp!FW0wEE*RkV<&SN@M+9>2|4Bt_N69G(>@U(`E#4pO47Pe@3xlDgkc8zo74Uv;C?d z#TWRrAAhdsO~NwSsCw|if)ZlIT;&pkiRFUyfM`lkc$oP6Bo~8(*=8ALhe>dTjvdYc z?|%!)3q{>qwr7sN$!Ovi`m{DYitqhjag&|q(?vLzxPYDXZ>mbMWe+@CGZuG8Ft5fH#_q?FXR9DY?+Yf=U z$+jv_9j-|hN$bkys=zvE9cqkRo?so-1O(KmU8mT0eP?+GODv02U0KQE%&?6}OhWR@ zQU3UUw7}Hv-c`*40m~Or>P@i`lx2C@z)1IhO@*MeW^-TFzdo(79cmF1PKo7B0N)E)t&s)1k{R?@cW* zRnXl!6W$^NglD*{USBYPXFYqXtvv!~#rQ>jUu9nis=uEDzWz5*HH>mBR);?%NmOYE_u1SJ%JOb3@JX zl_DV_?R5!(UqI0N(U6Rrl?!4G;H-pbKVa8D;jIwFQleP>2bl08Nn#rVfSrV1t`vYE z#$3Nh`-&-7p&CtJJV|`)@dmDyfM_^R$+}%i^tD+ynti4D636Mz)K^%mjpfm|6*ud0t)$+pqQRKE8PbNf?3A zqpzN%55Oh`fJ6ce4)MDAYrzjX`9IUjK;;#NlAZqjntNn0+B(Mp(!gKiU<-_|=UmG+ zK0M4lN(tBr4aq_N2g}&=00J!OEvrR&_?kx$x~fOwKmCbcY~ROEUuiM1u>({bjtG=b zx0PU53kwT1>=>>dxCIt@-p~=C0B^$LpqVwE(*^-x?zvX9A#4`?`uXd@fAOmjcYxa( zL5$F&7lN$vDDbZ0xHu&E{7DT!EndMNd=C5e&3!d3t#{q_Gzy|;=@~sgXD*TUvrztM=uqY z{*HtbLu-CgY_)9)$n4HJJ-&UDTQO z2>Uh^zrkOgqh|E}N&2@-QxAKw3Br$Reicg6#Mx|;4gSXJmDw*h=2f6{`rp*qelk67t=AZ zO%8uf1^()~g^m5!-+c_Wp!1`Iiho+#;zJyGqWxMbAOZyNUoTTr`sSz#O=qaLXWV%1 zbP^v(6hO)YsGia*g9lVR0I2~swRoXQd(ar2M-WUWifc@sDo%4MAfj^Rbf(bd>WfZr z0587|3~06&i;`cN#k6N4i!VpNHqIyz6M~QA(F52VY6hnymj?=tP80AZ zU8c~I2I56u@YnRcaFK}aRNK5w(92cO`I?cKxK;aLc#XyBG+y1ISjS%rbhShI`LkF$ z`iOF15M1KAo_aSsROVXUW5QYfjX2a#ktxa@v`BLPWwkC)JE`MY7OY zK2YMPNHmZr*<%z4*nb9^rqv_HS>{-Ml*f5 zJ0#k(WHL&V+FDn`w%E1Sa~&+_K3v`8$maV6pi^ipuNwM=&)R`+vVH#WP46M!B>CTe zlTKiWASe0t{+VYRnM&p(k#I5(x6k>flTpA|*sg?Uak+d~ZC#IFW4qVB$%s>W8i+>i z1^?sM6kv>&Ze8+Cauu~nQj@Uh2ymOwxbf+m9)qj0!3#n+ zG2Mk7PFw-c3A^*uN{|Q$QY!E2Z6`|&DQ&lB^AbS3x^mOW4(6+a1kNVCZ_1SjnLjb zFQDWI1c&{~#8XIsRLKxb=2NPujb;e$)Inzp^77zPOEi;XzUP0c$lJBp%ahGy>#XlsjC!?h zuLOU_@p zP6YuWA@9}PR3(eaY$ZvHsin==W^crl7EV)I$8Gy~PN)92OqDf;k^AP>JBN?Pa~Isj z;>v%qmi?awsd3LF;{#aAap2kNb6U;+L+IlS%xio>=TSZQH;7w0i|q4D3_Ha-YgwVx zzRFMB0uB+mt;~4BeEpM(Pw3BpwH^WvQ5MiWboWrL%t)Ru@|~h&wY4xvlc3A|>hCm< zgO-Y}*%^<`lr4h3#bS6ZEG&FV4XnYl9{Jo>JVNs?3-vgPsXt$!yz&qutUUw=svC>4hV5i6KM#;U2lGq{<<2CV69r#Wg+hDeCm9XKidma^`RKIARpL1u zl#C_dg*mJ3$`($K|1kXdqC56-Jphx^$JSI?YgYY7`i)FhwWWUQC7D_-oa>!-?Qv6y zroHhFcBcFZhW~hAqgzLa=0*so!F;VnY+f#jC>meFj1d7T=@WQ=coxf5vRlP+R7`4> zPd0pIVhVJq>@yqd^CXD-I_$YI>T=UUFf#os?|Bl z{melv0~SXG#cnj`YZc)p*@rBRrfUO-&o5Et$GaGD%B-}sEK`pj{1H^j*i_2zBjB3XCQJ0W5zyYbKd~DX=#OWWhPRqH>Mt9gUZ{1bF+mCD zA0d7Ijf5j`9DgQqn8N`r&Pn&`H`0`NHJ?|N&Me`Kc#dqA7yQeNDS--H*5XvrjVpo4 zD@>=;-3gdJ?6I7m_6I-z9Cn3qvcKN7WTP6?JRc5b-MPMEm2WNF($dP3CgE2x z_EdMnK_sDfw49x*_U3=0*LDssvlBI^cE)5XnyG#8R8EorWD~Kj^aFN89@R8xJN3rj zRQM%KAX1Ud9If_y1OLU=Sn!WD$xyYNjPqHG*~d?{^T>6niY0=b5e#oh#bb95N8$X> zozjfoeoElN8OxDxN*9ePx?YfT>^nRI%HRWF4pjNZ9zFNq)4zdw3KUel4`07Z)!^FD zE}2wzc=4F=}?ShozJ5}DWpKX%-<+@pUx|sb*9RNezkvKO|@%;d38Csz2UgG;Fjgsh9RcobT@AG*#k-@>w#?@gu)Kqa!v%9I+6VW((nVjazV+);TA zq`VGnt<`|IM08*{RjkdI9CBrfKmz6RT(~H^AKM-grg{3qa8{{;p(CxtB)#Mo!lop3 z)V=5!n$#rFeR^TcUaVvCh+TIWU=V365`KbiZPWFS2kYaLRVB$}_Sj);7)a$XR zF1ODQ6sS=16lEqrCJS{v0FBzuX?h_ztk|YZCu=!Vx(c=ZjQI;xv~RWCS>tnK_GXWk3}O8E8HPO^ksI?6d#ItlD6vQ5Ff z-)HjW^Nh%p(%=Md=#Zk)e*5eIm;4RetP}GsE_0iyCY;P8NC3n$2+2epQ|mny=8595 zJcV0K?1sxyh3TZKa-(S{a#(R|JQsuW*XB}Eb?5Maf%XHo6Q@6WVPCv-XAlb9eFjf4 zNN+$>yg|$bWnX1WR3r;>1zq7^*eJyduTXl%Of6#bl zPEAdnEF=IbPK~;j8!ojBc+S4IKYb0(3^RZLH&N2jL0N53@haFy%Nr2nz1YB-_cE5o zeM=x_Gh`%Z_Tj`xPFK_zBk0;Cw=O$3gQ#4q?a*L6Eex$ifrNDnDY=k;Wh__fd3JR+ zXm-SG_Uv`#T_TR0Vg*4CT9CnXWr}?8iQ^I+`727_Y^@pKWhlvw=gpLN?fsA{;$_Y2 z>yptokn-EilrN*FkfR8NMT|1|8AtIHwV|PSz14J!fug)A6{A04(4QxROX+B|} z>0|qH&)(2wQsm`(RZUlnHQgZFG=;;vEvaXXZsx7bU$Lj`;+@#UDHmCj{}LDRe==0p z*ar{PjL++Wx>pcqd1Pd!TPai0b#|)IgWqMXnU(xgi8LVqRQ0E*&dA43=9eq#4TOnN z-fHki%bdx0BdI_lO@UF78dy1h<-WN2EY%GDy05+=B3xChS+SC=Q`L4`K~&0iT2qHx z7jwP1T|YC%YHs9Z>(dFF1^hUy&$&(Ji_v#x%Ez-i61iO3=S|?dYCczdF|CC3OZtFL6axa1NTmH4@A<}JFy z&I)9EIM>W2NWx!7G=C6{%%>gUR0Aa;JYa_O8qX$S-jcLah2zn0O0p`Np&aD#GI#*C41w!YQNCX4$LIy+_J6~Vh=mzH))^Lh}*jH&(&h6Um2U>K2|o8vhI3I15J}b zHLZL2r54=rH+Fy!!T)i$NUO4hzjGX$1+@Hi$@^eYz$@TzwAKMi_x){hKKH;}`%cU% z*76IlMmgJ+r$%32onD@#cvTYlB2T%w@>!T>cxnhd*0k_~Mb zMSa$FI!zvH-U(3Wkf@XqO0d_#O(*TGHTpYQESisrf50XB3Sj4)GRsAvth?xcgi;nl z2z01yzBGDLE%zWbQ~HG3iBj2M)mG{>zB^aMQ9|l|(6lChG~!FTeL!qU2)yiQQnyTX z>MgG=AvjQj%%#Zw{zcL5qxx63-uxZ9OaenUmZsegaubC(62XrGz7gx5TZ{@rn`x)kN6bK5RLdY%|R zTKG^7=Um{zxVcCRzS+!wMyeXXuX#?;*KLIM-BCg>zv>h1>&dp>4?yjlPeoFS%W0~D z>uKzP8sL1AR@CnyePU>Ga5|UGQGAKaIs6=usm1<6Fd5rq989**MmaxLc0AV#+r~ecAgX(kkX71(3$vUg2>mRx5jt+}bkUlrZBiNYD<#XO*vp+HZ zoaYs0TRUf0j(H6U{whLKe-e^>r}pJPnM*QM1X)UB?uH8O>27qUQK&-|C63mv3pU_l2@{U%o=|pIC7CJS@a-v>yXU;{YNQ1240@ z`LNOfy2~LIg{`!1T=EdNtK+JMZ&kM=8}5&Sz?JH-lNCzw#&O@mH>$r$Fjk8Xn(#}m zw`*L~h}>kzpb|#Ok}14NV!<_7r_8r|Ns<*0)KoxyeTwwW8R@$p!`F~wKs^yb31Lz) z#(!x<`6c>Oh*&JMkW`T|;O?E~&kNC4vxiq)qftK6>uXe;vW#Gt2s+M*ShW|qC-2>0 zL9{Zu%12mAVz(m2=!=3$eKOPa2F8TR4+6!}+7OvgdT;zLLP1ocV0BKhSSRMstYwp! ze;vfv2gKljB9j|iWzDu^PWLQ70qbU~0Cg==T2&d{UdF8!|MI}Ml8kj`-r4R^h;XbY zgbuT&H^KauSN#(^rbur0fkHRFnO)s`(N8luE__9?syEnXGREPIOneXau_R!0cX zvdzCfh5{6eL3^db9p@>8-CBohEvpABLFzioy+G1P32aLk@SJxFULPU`c=0X{H#z{5 z^2jaS3zC_R%O3U8cy1)wFLl!CJz8_Ia^Ev=lt3GkOkyt=-dpI5pR1!7>NZ%W9sFnZ z!lb}`qW*#W$o8Ry>l;Yxt9kqvOev!9;)v^N10LDqk0=^c#<1ABlK!a$z-Bb(2|&;M z`DF8KDlM}K@SO%LbP*W^QkNjwpvL^V-QN*sF$P@KqsEgj7&640h6NC1Y}zvc-=Lxj zhNihmFKMsoe5I7_*!A}((?{CQhd%MtUBp7@&E)iylUu**cT(AlVz$1X#4x|JO{II4tJO0(4fUb z2Vt*i3hf4~hS~?{TaYiDeV)W|Y``p=BlS`p`HDlVzdXA*xYXU`WdgU5*fO~rxirD7 z1lJL+>%|g#OewW)rrn&Wu1&oKUrHGRWQ)sVJ6#II29*q+rMZ-`}UZ>-9c@TF}M#j@1Ya z)bD&{=a)5pyBwR-LMmBhyk|HimYN-XOS(LInx`zys685jH&eceUA5j~)&JHPAtk$2^N4~J>;LrPm?k4GGqg168GZ8>ji9-YmDk#kO zSAJ1RrdX1gIvIKSc@s#}3CoEomGNfxhBT<@%8Sh!DI0~vvzD1(b4v5NtoWQvrx~(` z(`Ja|zU@}8lKlyAPFxY+Zc?*)>4!s-LTqB!Aolg5$jSiwKKJUr28Is!RqP)=xe(>V z_iZ9i8q4R8+J>RgC`waS+g`Mvj?-S0e;F-}F_}O^*-k|s4vx-|s$qKVe2${>jpEPO z1^hR1;stvKMS!Mrve@EBK5a(*g}TEE6$F@;`)Z_6=hpekWqN)D>SV9>B|C}H&IEq_ z#Lvf9nY<`fRy~&*@#S-)wwZ(|HhY<&fcRJAEF{5jH;1CZ*6kV|p1<;4gtG5qZf=xp z_>yYg%t!Gp)#&R9dne`c**PcMo#Ej}2Vkcb%T^#?EV<^L^9^V7!M#fS{+P3B!xYZc zGWER0>LrRL*ZdLAJ_3kV8z3c~O(YNi2%xE5)G^6jjX4(xAXA~C$}e};>xrCG^Zsc1 zr#4Sq)nu+zn3Ca3TUa9P#Et*kvciL^5>QGmlVj?s@Y6(2mF3QC2d%7!*zFcNwlgg|Gn-q45=vZ-jnifGy^r&`+v)CO zj%u|31lE$-neQn@P+$ZKm$DTKqsq<#>dxkSls>?sNq#^>hx$`@rZ()9 zbhCg-8bkbJRgC^T5Nta`M=uO+SQasrFe)=s>0aV9pb%9VV^|YbG!n(P zA&bwhC@g#t%5Co^P^KS*<^6%r*TAOs?i9x_a;=_u!8XITJBJNTYhk_)E=qm>YGxzk!6|Th z?a1$1!>Ej8lX)Ge*cVW<7v|6CS+%*tp}nez_1@mR?NAlHSD@QJ&#d;iHlBD4HcG5g zi7EF+_4HSq+6Iw4O$QwE_>wyGvvs4r0guO*Mm>_F5d?0Sc}j9N!a+2_FehglU2l*kCznc#h>+i3<}O)E5Z5PgwEZEv{1HfVLNFr&g@8rWsL_AZ zUxrtmtXIAh_7!2h_Y(c;bUX6Si~~(S2=~viB#X^t)0Fl=8@Jm{mZ?Q5^t%p9nzxwj zc3(PXSsTWxe+rthZ?X~dj$JH|NW4)+vX=RrGcL?x`diZao6CH2b4!`I7?pPdr<1X+)oP1*Ec@j{s1f|Qs++3{j)Z7_Ip&ges%;u0n z!FBny>vPO?cJf74Ag%agp*`);w$74)p-2}twX8#&%%~)n_VCx%7`-Ijhcn8%)i?~l z#M-VK?y?Og_NDZfWMhmP_B)z01eo-=yk5dn3O&a=%3N+E>TJu88v~eC&!^>VEicv4#rj>dr$B z(VY7E*GVR4z0bIAN@WI9TDQP~hA z5jhW32INy-VG*Pd{2o3rFzwR!+@49!&&~bx>2_08#^-y92KC2NJV{acK%MLh37KD= zCe7Y?;u_1lg-;-ka&q!Id;>*`bAupKKfd9Sz|UiI8ypbM-bL(b1w}3 zvx?`QYxH`##+O-GZBPo~+I!XEBC6~>*Y>jiB$Rai0~CUN&7-fZW_twXq0ot#h2F4_ zEeF4*yWzZ{R;drdcqDoXEu#~k-l3u#)6Kn;OXy5n)0t%T1?@6* z;_&cDjlFr7bNySwi;_g;^!@U#wX?RjtzEZaOt@UuSVx%eK4gR11ofLMJl~bjEtym) z$}w5Lz7iWB^LR6v^;#wRmO$d^!s<( zGx``4pN>w>~rK5BIFPxu&1n{o>-mOeNcsx&5@^~(>sO( zhzh||&o0f;k>D==EpA?Ti+W{3M)kuVdhCOp|Jo6cRcINZBB#cP~xxXrS+ty>%8X0v|^OSWhR7U?=q=z`;Zo;+Z7xR242 z-7yhqqjMUpHWAhZ6Io?>E3ll|vksHJFsNczYK!z&Hq$bkJme{je7T0rp#A0d;s=AFpRejK z*RKLDl`2G9SyP3UuE@EUzV%{QpA2seS6Mxc=lYHIDV77B(-AlLbmu$WpBlsIT+R+r zGl%^0A7?V|(DhV6Ay-_5=4F8O;ekS^By44ID%6$X`>Qu-Skdq6y{T$-M9 zDoVA-aXZOnFq8kBmyb6rHkQI;9vYO*WOh4oqF}wk>&@Eu>`Tc~Gio{QhADTF-GKS# zL)>kQ*QwJPK8s)0h#m{oe8k~#Y3La^>9+(xKHQgK5udnu1#IVc)6 z@?GbvJ*z~i+3;)D3VpK~*56ewRrlzY&x*WLRN~U^KaghV81;bZcs+wC49F{b3P_10 zkiHeEKS+nV>KuA|t^^qob4-OTCo-IE*YvX+a`-~Zguq22`}#XH4D z+BT!+50A@3&!ql0zly;pkvgNOeI-tqTNZ6p1j!7`s-Nsr5*=dA*>+Z$=f0o0io;Y} z@#x`OTo%cy4W*G^Vrz?DR@k+eaU}@BNb5dGue?YtEQ%%OLr)%W)$$dHHq>{dC|6LQ zug{SG9?jOz?kiuJt9~; zMabG+B{KacCaw@}?oHB9%}m2;6CfcYBO9Ct1v=2wEM~`HGKv#Kg!H^fuUQn?gHLMk zUB9!NOuN)M+Jbg%c1`$JcjKp#h+!k2oz6BxQmd_-qSPe>i&~msG&NHy4-W%%$+zWm z0o_7V(+9tRfOe4i-ZC?xvKz(h73lnvC(l|ZrwY_!LErByi_3xOhN$imwACo?f)%+a z(GorQX(+6miQJCOvaQwdX^m3j8F}`gB`1q6yJ&*UZds@OET-%?GO)4z)ST2*%1lu* zmO|bB4xi94uMY$AfJ~Ze#>Rx@{(wm~>Vh%#kAvqx zKh(ft^^VcRMo;4MiF3;#hRWKP8J}^%yHd2ImUo#BHURxg!LSh!7+9n|@dYq9Rub0A zFv7sXYA(9hPyfjcL!HmMLh9~HyXz*;$};@Jh&@zyB~^?+M>k#P?d{EC%_890w6OVi z_E||e8&k<|%(&N&0=Hd~Qcg9QceK8SrYA0T~7o7U-pMOkRKcZ)st8-9H>Zqrg~ zX~7#aD2yk6b9ni8CRq>;GX}VZ&MPXNoa=wS`{sUf*kCehBj_e@egKdENk%iI_IOULt)zOa__}Kx`T}GQh1gZS;|+xOob^(fV9wSj(16 z$9$cWj_q`|<#?y z-0u%sL*qNp8b1~lslWrs8#O?+=3g`PuY(sX;1SRnfQcM!UkNgq8AcPV`xiyO0Y@Lk zT3-0!={?>+qd-v)5F;1M1p6VB2I_Icp#1v}VGLHBR{^g@GH zADS&E?Lp5*6N85n+slhWA;==of)0U@X@V#I+W;m6I5UlZjJe2RYvsY)Cv2bN2;RSy z6v&JLDnagEn2%sTp@N5_a^$2xf~5dk%HlmlRe>k|+W=Y!L=lU}j7j0pYLwvZ#x*|A zQ}5sU5(qTLy`KVja1c3?LcAOJ#4+&j2p}95Y{-X!pa0vy11Lgj^UGKX5vT%m4cd(| z)fOM1nZTxo2fy=)M?d1PDf|I>ILv?%Igf`35DxCcivGu-5k-R*lf|X)ZMype5XaGU zzGln)TN`1(?~o>!i2PM1!jOl1>X(5Xl@8<^^5o&?|2|j*(m{-`U;iQ9Xbi;RU^-E# zdH*#Up5S+04l0uT-L1rshc}fdAxI`mLw4BXhoAr3;QzhbZNv4r(#!q~vm5n(VH;^+ z=|_g2yHG!|^06$T2L?U{B0?CtRbCpN|))j`)2)mq&mphp3!gH!jZmqX0A$)?dv8 z1AMTmC#SUtYosb}M8LD!Z_`hLptGL8^EU%}1gM>7|D|?VwEs)n-YZz_!HJNRS$%vL zzq~kR#$>dC+O>9NGa*IASMx3_jCr2P$r>u=2W`I{t(n88y7zlqg&xJFw;QLEq$e7_ z5KaFV9|EW%m>}>a?thH9$R3XCqi3Kj8s=1znuP`H?&_Q<)W?!fDBgd>7b(XerB9E~ z)s<^_WVqB3lj>aP*3L2F?Qgecf5|f{wMrhRI;Vle%GCh)^NqcRLW>G@?@!6T3s4yK3%<_Kf7Ov17(1q~a&<`VmLM;5fIO|LeFY%g z_*xaiEzTz|Px=l6v6+bQ+vqPUM?9;b(>2f?Ml&@@SBh_0`4U-j;kp zGY!M9)U?XVpZQ zX$AF--MT##uB%wxE|*JAlSQU+1bi9!8sdy^@`X9RG@Nl64#+!SHeD&j;eKU3Ia;|o z>G-zPQl?u$PVOtEBCE2(h<<4k#`&8%j`jm@<%t5zo|&npv0IGkgpA(03yH6CuCk2l z<~Aeq+_RjvY}jaHl20=Yb_EzZn=W@_%(KKLx6Qiv95@(#NujcaBSV~yi>n_pH2ZVa z4{EN3RE^+w+oII{87V(&wH2rP`31EWG6)fJ(;)BFo(5nLZ{{8OD1YJOmql~E(j}$W z`D6Cu9Hx&y;-FoW25UGfH|-0UJTAe5as79T+K93k#Ohm*gp52Pt|TWa-*9v2rckFP z&~_-7GZrAR;D%gdyGv_g4Lsp29~IXVMtaJ8#Mf^7P~nl0vcTmVpp44nq7hX@HZZk2 zop#%+Rlb^vqiM+8k^1baXnure*ZE!1Sin79Zz=1Qox00umX}Qq1jB$}`L#kG`Vzm~RQ? zCNEjh>)viypy)OlqDR?bw{AX64=gME9#sWay!S+Z=fQ5*yI(~B1+$V6AO5BAi%IIXg*p72Tx56a0wl-Tf3{ih)jgTW6NUnh{yJ-ZQV4 zRC`8!x;t-r&NB3}H@Hp%_Yw)q{q1W9IN0Le5`w09gz3?%&1y*F!R>{L&xq^Gv8_vM z`bk-pb7N;YF7s+pk3gWh*52B_IJS{A;>kUh_(~>2>$bKbo~b8-ZKiC`{Z7TU3gdij zeN|)YmzYACCG2t|5P4-Vow+$3L>&cz+KW|&x^{sNRac@C>flhR+e zQV)1#IRdKQRx1V7*drOAhM>tAs5zVBr!fl@wX8TU2EQu3#6j&Xi(G?Yp0lmlrea3! ziK4Q&%=AUV<(HC5!RQqb5H38G)-4>LJj+2yfVFDqjSp#XyPGp~Qpu7*e}RS;B(BP~ zl9^hwLKahnmh_^4O73<&aG>wE(zqf>MdA8BL=Z4P-4WIhETxB1T-Y12NqqzJ+N9<# zlat^1F|0#d@a)IjfAE_(5ZBS7Vgj?b%qW4_sd3I9^jcEL@% zy_DQ0fCX_K`|5VHDc&V!6Pnda>r!@O$0A)^AKALSvxL@QU!(TuGRKET>U5bvUuguI zAbQJOmN_jQ*DDu_xi1F&K16aqgNQHR(#Y8&27QLPKmhPR7Fi8wdI`2_%(S2QFpmEo z&`hoPLHq1G`n{+92o@WJDEUwZf_3Tn8u`M`wYb;jdG9DqJuB2*UXlAEGqXg?nAKkN z*ObPX0}3!05m6D!*9Xm_)B+z|pTrOgyOqn^T;gDi`w&?NE`mG1_lybqqflJxKtm|3d1n6~E zB(HATq@ul`&KbQmU-Fi^{#s<`cuW8hgN5&xuZgiDiwM)ViEdxV>fH_#{A|@ozs8+AJPU0@ORm zTu;I!sTqZmd&$YK ztR18n=oo|y43Oqg6Q^FH5~4YWFwdU@)+tcg)b@wZ*RUz68gMbXH{8Vs0!t!4Dy2+2 zF?seGd0p0F&hfa_5H*>k+{C-N8G6c27g4W=JkQWD3w>v3WIe6il+M1BwlvJmM~MH; z+qXEN^;H{wi9Qiyy7Mmr8Y|eKTi)cv@!t#MPkp_TO*{HOigL=*A&#opjEmnZCqYE8 zOSw9Z1#MlEP6?|2sRf`b|DqE30ku0%u|W=TO)$ZQY20is@FZuV6Tt_yC074jcB{i#Gp=?a|F=r995?NG2K)p*SpP;RWm!+}!+~yI8STy8mGd9IOi3{2*R5~Astn{*u2))LEEO;Y}hiClz zgvaQIK3Ddjom(v;TUv9(c7p!^UzPqkxoD*gL~cJ_`#v zKDH4df`<<%f$l?H)-711-JY_0WI9tS_(ct>c&*1FX@0KINgd&IZ^}Ew^hcrA7+XtJ z^{X3J6G7Sxy?5>1DTYg7&(=8DhZU>UJUltzH|TrLP&R-W`j%td9y~H!kKymqXgxFrmTQv9LC3Neu)z*j;t%i9j~JNx)u-I~ z)O<0Bjw>q)u@nDdw8a;!_~zPk-6JqX36KmrDy8iKvC1YoM1?TJSe^Xb{~O!8e}D#R zAr7Tipsm%Q;n|7+lo@JgPgj^Z*Gyb&YdO#?|B?-ngDe!t^$>l#_ntxG2O{cMz{&^` zvJgkli9;2jO3uXSq;;lf)Pf|HJ0wmToEz}XaJPfQy730iwcRnh@~1Q@+B0Wr9`#>d77X5f>M1?FWdIzzI&7n0ol~eGI5nZr?t* z_1FrdHL6*Yr?3<-qbbDXPmv_OpwZyWAzm!kqw{k#P=F7%H;{pknm*2bkk+US6LgEK z_kXbWmQhu1-5;nRNT-CfA_&qUvFT7jk?wAgMv(4q5TqNF?gnY;?rsr~?ykEwdj7BH ze7WE6xL+JN_TKB6Yp%Iw{^op`*64W$Z0)_8maZ@B(+EsKenKl9+=++#%4{I1#h`VB z4-33OhyU{i!Se`uKO9N_Uj_rPLKoZ+CiUOMz1y|AyD<0Q>qMJ?IRW{u(R0(lbs%i- zc45Isncyf`>rp1}0inLz4(I9}LD1|EI0e?&?|$*2_m3f?0mnvs;-^(8GN92Z zDhW*h8lz^!PAVNmrZC3dhKcx1HF;3!Tz><%xcj3@*chQVsD_cJ8L`5_tA zYU*Rn+J*h=Toz#48~^CAqu>`?GiCTxiT30Qg=!v&iHTf> zHSk?q)vheM<{c;7oR)j;BUo}1q}GlzdEJx6uDtQB9D+hZvTz6p0GdI>tGQPisL)s>~}K9JzTQzsnwXK9MQT@|Ge}wZb@KRr;FE#;q96uB)q?PhqR2 zg23Bo-Dr|FnO#-?{rc8*Ujkc#Z5qkoS!*h)(a86dUO_ zpRa?cl)v|=Fc~N3ra}P|k&2b_Xn9%Q-_7s-S7B1((*kahLs!VVsFLDRpsmT z4|Z#9w_gUr8PFtJpQzZ|!#M^RN`y|5ak>kwfR{h$l_;joZj9w+BwBsm*u_9cZ!hT} z$?{2XsHyoiTakCP;F^Wt`eHSV9Nd*(`}H_`7(lDt423x(BcGK+xrGxA#L@ZN=SlnD zVxoGd6VFgjT4fXrsr;r9-oz2hY4JzN!;8aXmz&My!d7>S^%=`*%fB^7KG~WtxK53k zRh5(T4oP5FAhN(a`ZaW4JpRQHDC5D7YGcr=P^2rfLgLsubNlpUFT1C_s4sI0L!Ttk zZp-h^R9S?<>DA_zSIK7ev&=B!Y>pS?+1Hn3m1g!luipHLqvAAk+GQ$?+dEZsP$}mk z?gM}y@RN1=vQa0>l+<#p=fkYSCAuB9S^Dha?|ngVp*z%wQjyZ}vO~1#y`X|^wCXJb z$bBnF;Jt=P0Y!ne&vWgsWt$p-Pza?S^`6NrYSy=BLCv`Uj2m!{p*K-W63)7UL<;jE zQBX2=agG*)9J=aDWmbtbC)Q)48Pnig$hC>ydZJdnYH!o%C4$2X;{q6*b*l+7*yLawO)`*Q+}uOu^DWt9@ko%hXX$S zykGR$mzZ5Hv>NR5^h^7bDTSiH=Ps7VZL!7Bv#zjP%zy2B|8cENt3N58E(o>(lzjR* zE<*}3-8GSZn|Vz%GCtJ1c>0A5FojD3$g89I1l=_`rHY3b}q;er1fXx2tqu zzJu7y?IzApg$bYLRYh#dG$@}N}yq1zR8=4i{rGE zl6XK*7a^b z$aN5Kw@7ENn6g|VyGW5M7o|G0 z(CHL{ZjW(N{DDuMz0liTWThRxP@0}C_3YYdl?9yiRI}Pvz*^dRHW4NY2o(XR)_~bp`3Hl4jIuAMvay7-L{ee@?qidAn z&Ik$(sG6CjhdNMR5WCaIJ%`YWdc&-fDL4G=)5VeIM0#?Wgy$U~f@G2sh{jUVTX<-v z@!IVP)6>|`N)H2;Nng%34efl@RfeJXRI?{Sd~wos&ryeu26(cOzx~$W4dwA=6sX-# zifJ&6v6wF41!r2C)fZ~m zo<>n|^^x;8q0m?lO6W0h&prawI1UCmKR|vV(M071NoYe>HKn7&liao+)*$Y4p`m`h@Mm)A??|2|BAW>e5gHxRW^P2}^4Vx(5R5mt2_$Wwf9-iu( zC6~Al>O8n%&wk?U1^;FM&qx^E*#8ufWtO|-18aR|=HkxqWe_&O9Kwy3a+%mxsuDug zKdWaAy5xYM<;!5zIwjFXW^k&kM%$gMI5N+MWLFeI@FZd5O*w4|*vDHSdDcMB+(AXGaj4 zZ2t)f*~Cn{b}`J!Aaungup76MS;RbplR9Uv;42;Q&MdKIYyqbqY}r#_8yHhh;>rwI zVn=2^qplvk-EX*nV_%qWY*0P3hB_t;NN_?-_zU?EPvPnx?HL};3A_waYHGp3kvL%! zEdb5{vkM}{wYlq-ap|T!cshc0bE6dC-pG9kxiRDQf>fb`gv~!8yB!Kp(xyj-#Rq{A z1(xJrzRZbt98eEZd(4*S*h;N z0R=~8tg#~&ZQLLZgx2HQk-^5YUbZ}aiuDlRkdDFR3s6l!9aDGqe8GU4KM<8X1{aEu z4gj0@lWM(c?EJiSZyIEr8yc!#Kh@x*B<3#d-W%^GzeXGVu=YJD-Ez+2Tq*9yw1w@O z`Xe9J)m7c8Clm8o@h{9iQp~GKdr#HA{a7xwK;OM{h9}5o?&|sm>zM_EudWl(h^3|p;`z(A*6xULYIG#zSej2UpJ~OE%HEmXrv=%7IsjQnJUxO} z6#`Q>w3xCQd!S(tQ`Ot=ZCweuzVTD9*l{8~n-g!e`?vuo_^}YbYDw5A+rOkp*U?Rl zt~y9}4~I3LGB#IWM?Qea_KVt$gX{r_LbJa3nOcQW(%>CbWrx-}puj`H5s5bqAmUbU zRx>L@lMkDBai(qvA2heCEO;xL)mX*rL}l3PFdma3`xp}*mOfV2#k52T6A#Oyc+V0J z!LNz1^%DbTM+4S?nu3aNM1&3w9!@F~KN)+%g>4r!nFWoSYq(x}v8CaDe-JA0%bis_ z>@;ZBmHlm3RgTHhrbz0@g24Ohd)mtG zfwgV=X2a5$xvLNIr?EjuFol~WfeisGr#pSmTO?=R?ydOdioMM9Q+1p_ZSzMY#?`br z`QGZ|6I)X6Tm<3OA06km*&fK6mxYFMnmT>XXhTjDqx^^V(S0dtDl4R$4-D z8_<$g=4qY0wbWGzlCP?Yf9$^NNEO??{6RU09IdwV&}blQGjMM$Sw`;-5wbo8XTAO? zZf^mPny*FPHgnAL*BJ-+E@sV%^NuqwRrltU!|nBz9rn&Ak+fqeY#`j(!ncUIb)TEn zgh$Uv0V0I~7z<*u->Ds-Z~+@iFo<~2rPt=^Zf*6#bFaP>uH=S3QJ?BR?sQ&KIdlwX zlWl?`S}vCQ&{rEiDVy#V<~qLJ6uxd5Bp)WH%EWt*aj?3+q;huL#P1_dN+){5BF8Vw zx?Gs7?n;vvZ&N99qUB^IJ?8XOzdZ^0)L@scS;Pdq#|H91y|7NQeqt&ozc5<5KE{|k zYV5|e0v>vviNxL_54@MlcdaUNonBNJKly@uf9?ZwthFC`54hpPP*uir7b@R_?*&)b zu9eUESDQbf(--!ZmZYC4r=Oj=SjI?bhdY1N4cU zH-h#8-)pdB4^j=X`?xr;*REpyTx!@jD0hZi1B?2D2R&*IQPu59%vqKWC+L`(vU zbEd7dufMdPC!wwq(sn}Ov13sB-~B~@hgN^xP)EEA=*URCVfbjrblRP2Y5Ixs%Wgp- z7m7s1FZ#H-$|I@ge73PAwt2mQvPBS$`UK_u=0QZ%vuBD4Xs6RgOPuR72g({_jCoh> z-y1sA{NJTH8Cu#WVQ4;cm_w3@zR2PQl520 z6jpofvbLioK`$(?J+)jKqk6pQG_~+RTspd3f}aXo z*R^}(Bs$NPQf%BcZm!z}I$YW}7*E(GGI1wT1@yUgJO<~=DGE>&{x-r2H;ws^= zt-OU=_R$d15;fK^_sTtVJGDRA6ag3!s90nCCDslfnD9T0v-$HJ9uR(M0d{`4{64it zI3K0kWau{x~Q`1>kQcJJ8Pfuyz0+#Cn0u4_JF=rI=y$_@{1F^O_SE>*0oWIDRF zl$h*T>BPpwVV3vu5qp$VuM5R#A*Wg(hk{&E2|hhlMFTel>@8{bRh;hiZ;~~vD^Ts= ztb5R-)(h=CiQUuC4{!9;9gHC==u_3-3|EFV{$C_w?S8Xb|EY!OS+oq~t}o9lrRpA>>0juf7X7Ptv*9Kqnj`BN$7(Q7i_yo;FMG@}0>=m03es zgCKStZFMx~3(e6qy}nCL8X|XD_a_|PsOuj>B*osmk?JhJ#0(*mAQ{FsbhxZrd#K9j#)pmIJP>Du* z_Pjq&gsP z#fwuu<;N+y$$Crhq+a56Ynv*b*M6p`NNF9G~<);36eN35xgqVcEvZj#RnzQLo-U$!T9X9;#Kp#g-?`lJpw6W&Zp+ zu<7XYqjg+RG_X{sjF^SV#fdr7j9&A*apMt)=WnPX@;08{CihhyJW&>^QJ>ORs&2#~ z>wfaUO#@RN)T5kqDRAl(Hg>5_E2A&Q>RBse7H7oUrsu6H#)?i|Hm>_6^ldWk6b|p| zXfQ-^qy8-z^t??>-kkFaeU7@>ItV4aKzFJr8LRCdT)7&+Laqhk?E)|-^dPDM;Aa+V z;FAW`laq@zHRM&f*A&W8-lF_ZPu(PIstmuDUwA^qUcSKAxPtcyGJLW&(ou0C{0-w} zFptPk{5f^(Wm27v@MM=RrtR!{=gp!ZPSI7~RfDd?t6nzAwD;#^)M`hxbm1lb#4aSJ zHOifGRK3wS&7@bj1@V5Kjjrwm<#5_mA+PNh(mHQ`DC5w_hVBWjy>YkYX3_XYnlUpj z_Xy5rE8v-3Lr`Lorod92(YKilPd=sm;#Rg-`v*1DQ)SA-ep0P!j%20t)g*01c#7jg znJDqIw@6kEE(AWqd>ZXg=htE#2v-5tco3iZ0D+QkSIftxlafFOS_iZ})i% zE~*juCT`;PdvRH6^PPSD#D|4(wO|zV_*|6FT`*i=RHb1` zxK*+fNm|tEn7iD6qJAOjPi>}jZs_2!6fV>80;eEWmGYiEA65&4;Pm}3Fi1EK1dPDr zZiE26pio!#531)55?-Skx$>tlas+r|T^!i3^~4+PQJUFwfx-7Nhb~^4SlXU}*X`G9 z?_r{Ai&VU72ASZhHhr@{*geTsHqqm8$f?wm>thkKcT|Z=?Vry?j6=hRIP=Kt@}l4& zkv&XK-ZIYc# zU!K+`B(JQ4ylB?Lx8}M`Sqp)7at2%8I+{oSuuq7Cbw3RWd{) zkkm};LzX*TdFM*vV@(CA=g;=)ZLi(r%{rB%({x$liri5O8hqG4937uqI_7Fi^CI|j z{f|<9=afY} zPvKm9)Q!t!~WCOP)o>=bEckFf>+*SiI@;gY}+s-dFEs0n(suetIY=)!X zxAI>;JTP!cBN4)4UVZJI!jh?Dn=o&i#?;6Y8)WX;o7JwEBU{4}?nT=Db1z`aZg&j5 z0Fm2;c$kcnC^{mSXwE5LSjiF%x<3T?JL&xVr_PrzkP2sAHD}ETAdPz))&uFOsj09v zHVJxaP9v}Pu@e8m0`$e&-`1P^U|@tbwMg>$OlUfj#u3Ef-d-+x+&3@iNI~A@*19J_ z`jJq>og;V6$LoBflSN}PG~;vs96VJ?~wn?>P%e8~w;%F(1R`IQ;@ zf?euZb`zH@)~4uIdT!j887EF+pWNwg!*)NN&gE6Gw>A7^bK5!XOt=ahxug@1e<~;; zZ=;~l8cT$kb7JdcNoPvnS8>{*cAB4QDE}vbUSE=!cdt3AlgSjFYP)6F-q#%!%V+b}$14l0M|;y69U%G!5{wDy?Ij(q!L}b|SL@JVLf;%OY;U*O zyfS`SOK4s*l2)Q$Gi~eCk#w69garmp7K)IB7?P#? zt9f*m6}^s5Y*(SnDxEF@s?>|}ElIB>jFgJnzT+rv*!SoZRV=-n7BV_*EYTR3B|7~T zxAg}-X(-Gbb^fzOKjkJU%PM$hM@#3AL>RMqM1^)t$ZZ~T!o`L41lK=R%uXC7v|f3s zS8s!_W8sLUY|)LByGbi4H8xZD%@blGL_RuibI!^y_%j=+(_T7y*jzIYcva0e-MC!75E+2C zj+z@Cj1#S}ISQ$o4~3Mup`C#u0eT319`LXU@lW{@m)T=Dt>mJMW!EM#s@%D%=_zx`(uVF zKaR9pJ`I)=unZ6HxBRpyHk@Ekb6kNVo~uVVus$rd?R)#~dZ(6fJ2&r&$!P7VB(GPO zrkhW=VOV>ja-&Y$FeRJDrQHpGcF%WZ$OdnP182*oNizT+218`h}v4%ckk1%*elwdf?4tIA)7%9X7N%2<*sP20=6K1(af`J0&6 z5!C9T-f~@M1wKO~VTL8)vTaAOXjIOK8@ta`?_z|}0Y%|UaGv9s^=4*ebj4odIqCQ2 z=J5@DOKvVvZ=q1KBfcHUk{F8~8ds>I9Vp5gu*ZPs0nLdLez_{sx#+&sYMk}m$>v=1 z)7h$^-&C%79Iwm2cK6|wof)tV4KUHe2XPipL{5cU{d=$?og=Rj#3dN!o?o`Q6p*wo z+WUw$WzJ1}d;0S;$*Y8zCvMYD)ME4)=jEl2DZ&1%?N6z5%5W(4x2GtwYFtAjDo{*# zR7br#FkP=Om2bF|qlcs2Qsr_aMQS%tR)sE-JSJ&L1?P`2!fy|=LJn3Ei0)h+ZOhLu z%j-{x;7HR;F|J6ac8?2K=8zKYLO##+vyVN>u1<@dg$ zcYfs71_wrdQFV5AT7BzKGd9juxZQ}NrND`Qf+FqtVX19dn&L?}zz=%!{+uM=PCOb@ z>>TK6sTN}#JL$OmS#MX-;PxvZi$dvgcs;mAOBqku@ciJgBiR9+NRMD^x6D;A7mk_| zTSnfkp!{pK1d6=m@#zbb@qC3aVFYvqf+`x*n#(l5{T@kv?fpiSK?*(%ry}I&QBvz; zUJ)C=iycM&#_RdZVyW*f=WaJXlhu#Z9Ogn|FK0~YQ>|YV6y;w`7oKAL60ceah!Ts@ znb)+&!X@!?B6Eeas6SvqC!H+fZA^Bh>FntsIn80N#dN#g2X7F5TES#~J@AfnWgVO;Gw~^J%IQV+EESb=M>V{ zZ}`=U&>AdB01v2!ok>TM6F&fder-Czo&!Du1T| zcycjjzkIXncon1ZZ2Yum_qHc&lE}H;@+kW88+dSve#m>oBpYCa?OK1eoX|)IX~c!z zGri-UsM2r5E^=X; z{~(L>zHjA91=W|$egI$lF<+??XPeu$l`=*>z%V5-yKnqs9dSoKa-a#(%-Cjm)#eBW zf72@3rb+PB#l`Dm{o|f}f+GMc7~AeX++63F7lx4pCh5?drspVFKs0;Hf~xHJ#Ozfl zUB-$&w7fZSnL0Jejp;@cqg~5@Ke;P+A?<`wlo*=2+R-m^X+KPkLly z7*v1)yC|}y$wO}He*{4u=z4Z_LJN8+cEaP-i|Wsaa|du_PP5%tygy3_W)-SeG#T!H z_rV_Ri`HV8T@Qv-d_1Z9fG-ar7}uBp{RIArTU&%wYNXb)A0DymP-r+`yxATHw*DB^ zvD@wPSdliGKw)cSWlzNg&**uM3O7klPS0{@;T&#Z$MI%Z+SC5lLrETmeU;mXlC1%y zI5NY-l1L75~E zjdf@D{ppK~H@Kv?H_IGN zYBUxCm5tEZry$JPlB!Asjj85?dSv@J(1BT~eN#e}?3ek)T)21tUrh ze|-`xbswS8vC#wguQK4FWTts=6zCrdXEpSC1=4~8ygJhvn2F=Xitpqvu&ZT zS_<$Z9X)Z+bA^Y8SL`h`Ns9E|S5)^>W;N8hj%Snbs(G(mYM;~F?X=}_nUQ@ErxU8^ z^2G03RX>3>HeroQLmAg*8FhF@Aq}S$>Pxv9<3pu}uLoM3HYw9orn4E#dA+f+2-Y8W z$MT%p)p!S_=h7N3X$|gm2SW_0LKWhe6(#46E9x8g+l=F~xsH}DiyGQ}(W0m}AHc&e z%_ERCm**_#dIhI!H1uD*>4U5L5x==t=$(6cvNM*ekftg3(G=97+Y^yv7Q&sN{blnG z+wxyCGDqJV9N&9qp*hZBu(_FVk(^cn(&uYMMGK&6Xa5%XfLVIVg)?wM2+0AzZfCt@ zAdBP{2YJ-Qr zS6iT1DO`Ibu9QhfYc|yR;6w8+l1OmIOj$gBsAL|?`l||ha*=qwMwg%FtW&leDy2?H zFU8Sy5ZmGLH3KoHIyP99GZn98h)(lvuXdL)!jqyhqP|2^^(P&w7Bs8n(#hAY>^PM; z@9XqlUvroli~r?;V62HTjb9J#mGyff;|Wom zJ*S~-&Bg7hAh6cf?vE)Y<*`it;oYr(9jQdG0H!Dq@!#xuCF;ciZ=2it=soHq`v}`l zJ}x!sy0u$WS{w8W%EdA%K4qt)E7}Vp{Uu4fj>qHCG41W`ItvZ;0ANURf$>PGBt}Dh zAgw!RM{41kUbSLeLf?#%>M$BFrgI6QXRj<#AvgMQt%`z+S>x4)$xn)fcMvu^nUF?d zIeQcS?WzlmF_|?Yi+Z%8E)VjmH=lkz8XPxpZEnLip+dv&YH-_#8#S%nfB393r{0A5 zmBd?l#Tnb}4|8r7Lnle9wT@9EjT6N8iz8c}SA=eFxF~BfWzpp2S&UZaY!bLe%Z6|J z$z=2Mhq@dWcuxV9V>qCxNOpd$dF3on1p2?%;fX9fy*9J4bscZdFJ}Yp16-$H!~BOlzCGohPzQFG1A*>_?gLpQKCz zSgZyqqD`tv41Sc<1oRowN7JhWpC8^F3@bPmDtp{qC4biM+JQcv;Z3x#$32kj!FNyU z7Xj66aETg0#b?bzpQip)DE3H#dLHz_k3!qUYwa!NRRQ_jhLJSlEy=qv@7=~AwbcdpvrC&^FR(pp^C)m7G zsRc0J?kKR8!`Mn?W$N}K+f{^jV0G1RAwGA6xTgU4I;2;tU-AJu8Nh&m-OZ9Oeg zLl(mv1r473%dB=23t*-q{DGDBa~i8-^@@3mJM5tOCKukzyOf#hK8zvC(Cep=ee(sx3DxqD0^Rvb#GqE1;ZWGIhcWu(p@e6lM4E+*z z_j}Mjuy_bvAm>&FM%|yz0u5P5v;#{5h65>^2|XjD7^kOnEM3UnSW)CRGe+)dGv8gj zMf^Y94AO4#`^`-bDAsE2848{-sIE}_hD|=Rc>x{T0Jc>G1!@E0718gr2i`sWUqc;! zcQyP&mexEJQWVPf`dXgV@Cy#HIq#h_SbAc8R;c@lo#Dh=rL8`^IkA*ljd0Mi1xBh<9QIR5m8%Yjx6 zKryk%V<`Q9jZpZ1=?A!@c zw^7@())r$l!JMmColpb^I48_(*yiTu17#)e{PK@2h-aWxjqOjX8YAcnp%r`s7>9y_ zX7t<(A{?uX1n(@_6s*NSM+dtRBq->?>;`k8QB>Uado4uRr6p|@YDJ~@y%rl$&-uOX zYwPV3+>tC0=3Y=OYS6Pnz^?7xoS3Y!#EXL{0CoteaIc^|jYDY~YX75SYu#1a39(2) zr}jyc&SMm?wN?Z9-!fPad*Gp@k_d3SCo!^^pq66CS*(x4Bo9cE;I)+dh)SORML${~ zJZE5_`|h#sum*?#vrf*)t=fS3^N|KGSdGfi=l5!6uo;vfKz{Y+O@KDNE|Vd2=k69r zvADg@Ggj$U)3cS>XCp@}?f>X)*jJCKsS%$Xq_iNMCY*F$p|Xc0|7mpWg2juYSCpYB zTR8}ZgpA!(gYJ_Zdj&}t3tT4FSQKPr!I4(H(!$0jRfoxca3HGiqu2@+Rcaf}UZq(f z9~v`?ZZNMXA3f?<p72P9t>!i4M4uQSuYXswkiDfZ;Ft!m92~= zYgpo*#6(BHCg7VbH4SKKlE|BK++CPoxKb%C&4PG1ox@{1anB9M0m*a@<6mh?#Yp+OvrSpPocQ7>DiA{6MF<6Z@4ZL3ky z&Cf#zt1Z2Bp#MzHwG0b2Z)_v$!kO-Fg*_3N z87KekyZJF-($8rAk&J5234vOoCWY#=m9Ai$<(L946Dlx^&oPWYOTZo3UX=+yb*`!7 zw`1`8mftBpekiW4BdJH^i-0b0H`rc>{Zsk;V_>1mWt0(^ve^Q=g&@3u09?t_b}%%d z$>aK%pB{=M`v@%{inl?*aDOcf{Sys)uSQG4Z1nWZdZ1@sMi3X{Y8ziuYb;P74R$dB zth@#SHBP8m`p*xOarZ8?paUiDOL8fDR;_gQcYjBsO7WCl3(iR|b=@X>cWKUYaCkUW zugD0-EO@&(ojNLnX2>=TKph1Kgv0&+t_hTL5yt8R45H8{Eq*3aMma{J@8cJ7=ovXM z1e*mBQBYda?j!77h%pL~?Dqq8^F9{f#e8e_)$eZKzX+^{)gb9@V+-imKAraiNa6Yc z*$)fBIkL=d^O_8eVHSWT-GGb_6n}B>&!0TBi(}2Ru_z2LL3gnUB6xv3rd!`Ni30@k zYivy^kFE#a^B;VCz!#)SwtKyIUJEFT2`-@dYn0p&q5`D3?@2~93%_cz2 zu(__0*<~Y=#y+W*)Q7gHzVJuIRh^piX&=XAv3Y^w|s-v@9uIy05;$*QFx*dBvkuq6p7}jG`Wi*5Lu&@>eIHN)a@bD|?f$KduceoBWRWH#->W^?W|{gqDo z$$_6mqYrqw!neY-WfG*m_@(w4a}lEtNML*@8N$i#h(R%%#gGs;FFOkhHd*~?=*V7i z;SWhJn@_}6%;|5L*0$J4#DCJ`SO$UAOchfp=3fl{{ii?y^u(151RwDk>eyx(E&DKdki(^s4JO2RN-M9-t8fp3d8ofVmIZGOng- z#5>ieF!`EggbS|6ui6H{mJYHQ})9uL&iDk2X zP+C?xyVC_*51nsvdV;3LZ6x$zt<9!d5mTPiZUnSNKS4^N!oNIJkJmf-1)or7Wx_aMp?o zmJh!_{jNWrj25K#K-0Ken|SVvAD%&f+%c_d%x$( zx+y|m{YGr_qOf{ZC9B(*T`k$$0ve$TxT9P+5Ms|(6d01&N zm+qrbp?+I`Xud6C(QuXCf>eSx>)b&yY;N*u(q_IoXzz@62BarFaU0uE>zn#QCQ4&yRu~1Evm|nA* znLvrN@hc(%IZVU##7IwH|JxB?Jx7(<0!)iujp1b|iL{DJ;PvH+agSk@>3lFf5r-U{ zrE$QvOBkOozgvQra$|3{%oV}Y*V==FPwb6apt z+3|r!+kYuv^@=L`BCE7hP*9+rt#PO zxc>|?B-R?Fr>rO{<&8z_+B&aV|UngHOU9QE&a%WlXa#ozq3QO_?lt)I=G^>Re5<1{L zKqC#d({RHDgV+zMS!wssLAqdm2*VWqUz`F=J1c^=J`{Y8z{Dff7^1DU+sQw?_rT63 zrOmi)4ugl{vO8)ii9=)P#Min`&eEr_%SVz0L+ zd}7oBJ+EM|&RXoI#nv?Ju^dk!cn`^{tA3Cg7D2eL1fw)3f+2Zqq9}{DU2iH=T=!gG zozFR)v{EX*%jUdFliwWw#jW+&pfA=#$nUeh{G%KRx9h8AjFJy?Ty`Hyi5UU1eQkxL zb@h)6{(pz=K7ewj$7Go4Shd5;Y<^|G?e2{$7Hv$G6dfJ?n2!&pK9m=)K>vIL6t%|C zRiqRr%;%UiqN{cyTb``;T??aZUJx(fUsK$>+({@ZaqiOD=DXC!G_J{sZ?3fIF~}-n zqllGV3FA9;M&;apdBtnTFkYbHW6+lX&G$6ZAPC^#(_x3e$ju|}Dt`t#JokZ48O?vB0tZnPe1P`Lw!%)$4XK99cFX%c zgaXV7egwfD-JUB$5xcprYR@l~Q2+MhD6M5s1-(>iV#y0(?=;1_#9*a6a9W<)c0KCh zASlk7)nuzAZ*EoiKClL(svkidQ5}zW(DHh>WXslE<5}SGuhw+7KPptblUILZHlwrm zN!#kvD^>3vtEI$5Q`3cSxNg14A)}EkXoEjgoxy0z#G(`88S($RkPYM@cvf`m7T&Hq zyg~R$G4;{;YMz@k*Q4zMI?h&e8&a9@JF5KO-2|^y1*;v&J)M~<5Ro)H-&iP39CvM_ zqF4;Q-08S-a9ds@b2HULbFOWKrd6v*R}TMjQttkAuY!J3NxCoPB*C*H7tCdddXsdE zp-`mc;om8W%D0UA!fYDVqV6D~vWSEcnG-sF(*8dh0uW>m9XM&|QlER|0o>l3`w{}q zBXE&XQC%9g+{~M6ansrub<|QI7e?IiXD;XeRJ&AD8MOYf*)#ln5&D;N<>sX2f6sFd z3!Eq4u(atj_+StM7?yKx{+>qpzb|?Sfczo;d*1%F40j0_3zSvU;hnu=MDJHVPbnzi zngyQ}s}yjh_*VT_+yzpRC-u0CWK;=28GrBYwF801yUS;8BM)Jb>ht8Vq+pzc<+jkU zu-bOyhbBVNu)x~}UJ6Rf6;3!Es|=Y4e&xV|5fm(udLd9X_3?Qn^Hn01l9DS|SNI+b9Hzkk{%MML?^q81_3M2=KtS~OE1s@i(HNj7Oe704 z>k(ITk)m73G1p-w5Ldy4`6~FOo#qp5cwL?I_i9lxxlyuzt!3%&j=ugwN0&mgFS)0; z^95d4en5y;;j_`_4?Peuv)8p4N+e20#ok2KT{-Le5);89K6bzN*FQ^mgH@sjIQVZt zK`q4jlp+?zF3gGt&Nx6o`~i4BHS=(`5o=d}R}N+Ti~Ik2ut3ugtPgxdT%7i0lnQ8G zA;pzL_lSR(ouehO04aP^W)Pt%C8sMJU?Pzef%Vtk0T+ygnx0Zd6g~6%xjM})=nbfK zOklzCzvmH;yt+X#5#`NgL(%AK(L?~F{u1{;zy1DPN{$*brEEOZ{N0k2?Pm$%s_B=^ z$8h9gsn0wiysCvphtbCC8?&9?(<}e8RV+rSbUb%znoijzwMsLyC$VKA@t&CebRO}D ztJv5PUnSo18uYvxmrDEh4+RRasGoPn08KE1=lM7`k4@Om_c5jh^j9*3?3iIx?UfI; z?AtgA|KcimvcOjqoIG3=l+pTC5H^|_A%o0pFOH|cPo&Y8Oj(LLearJ!;T%fY%>VkC zlo(uK(5R62g_Qzs|5OQ9?^N150>qc80^)GiVA^%$7V!=vzDJ7>&C`FKVues@b+*!5 ztP5U@0lv$bHViIqHkC z0$yroV#1M2x@$2UTm%#T`yq&O>ZxBJ$7mI91QWx+z~zz)Fe&2lCI|gz$sAZX>+oso zQ6di&3h<2}uFskO7CA&EyvMO+@7h8UA4{o&FOO07eE82PC(;Qpt^J%&Ge@j`>8{mJ zNg~erpKo*{V)imW#uP|xheupBu0zTGHx=#zXy6ND_qbk>y9+48ctT#o{fp1;?nK~s zvy+?U1TcO`n7xpE;cWE(e1jg)R>>rb2#e^A{WwGQCNL|Fi-;$+7bTqfd8Kaa8Ld}cM$HXo;6<+e8s*iUwduDL`I6fF|Wk2 zxE4NWOrfe_oyU`IESq{Ng-!BwKTDnbLq`hjkRLIFbXN{JX?R5bi|4Zk2|pQA=p7FE z@g%i9cyZHl{x%(!K0wrHzs0>KUo?gBtns?cdVgu~hRh);a%*ONt3MB|A}A>4oA3=~ z2}!M=sd#fdZp41CIJviVMcRbX{lDZd6!USc^-B&ZBsfrZYS&`0TUwJT-Z0VZaMJlf z@$Hpr0RJH}n<{PFnbZ7)EX8KUlO0lG_Hw?Z9|@F3P1mpA__!6uBuYMeJG9UkMD^^o zj+|1AeH$-!RHP|S^6|n@M3y0I>63ryC~fdWl>6j<0{1*}k*b+vdmJy7yAsY9ycTsr z`NTJPkK*@Fe+0jn;`sFwym2W`eSb}Z_5)Qi<4_;Ebd1XDH$&_;>v_oMR)+Po$v@Ir zI!0m)pB**4{UKQ+m9A1LTiYQz6v|KOwjUG0y}dvVf3AP3*w~ij9Nv2R?VS!fM2IKg z&4x@r>hr5>{H_EJW#m!H%6a5qC)INTW+?u9&rRv7Pz{?hTyMfuI`69#gyo%>JQvF3V-_7)w zh}+|}74%`Q(+2AOj$?)@`Vy)nMw>z+nl|oA(VM{Yh|BZM_J%Gms<&!kBOxgxzG@7w z5+=^NMeBZ;zuB@**mr7g^~+dH$Y~$&Fbgyul*29}q#Np+5$#Iej$qY~*ccdixsgez z-%e^1DEclR=c-((bbx)!Ij z3tzf#yQv$M=CUjnNO*CjBx<(bUUZ1Q;as*_-cKaheS5+^;4d^|#R!b9=Gzf_CBir(0o~(X*18Y_6gFw~jg1eZmb^teT3ft(EyPzbe%! z&rg`K=c*ly2$pxFU@I^^DaOM`74Zn0L(o5*%uV&+8?+IBNE~(A;%~ok5Hk=R@A0A? z^KGTw{oE>cqs^m;5Z+dMtDrv+9`RjBw^F-)NR}c~p8MFzW2^SMe0WdNY{>8QQ)Gvj zaP4dnU)0u{FarLVsy1SWz)>f?h}|V2HrB$uj-m|97MkZ*W>F=NMT!e#fJh|-vYzBL zZSu?fKkU7CRFhlxHL3_=M^r?*iim)80qHh+Z=p94kS@K3h=_>v5<*Amz1Pr0G)R}; ziBct$&_W=g+|7B*;hgt3ZX5TX@4K&mI2iCGPuqL#wdR~_?wlumUk~tkmvJ@wc9UEz z@m5j$+xG=|1?_hb$j+uQoyWKhw%Ox@9dl%#ota1H6p1p#m++Xatvvp>+c8iPa6n#x#A9 zy(Vqe3Z0MNHHUFc5k*XfET&^q>v=4PRHCm|Fip&9W40N~{I$Y>b?33Qlj;?}SkWaP zRvfbi7{r=)#9@O%QNo0wzNfh~ZtJYc+Jq#^Q<*RKDNsFf!xZqh&P9U0$}szgYX_=c z+zlV9nk7Bh_niGRE;bm5Nd+`|Ep~V<8Q|Zqd(SV0=PEps6!2Bnd~BX}?tbV-D$?kj zHf+IL*;Ddss;Fv!8D38F$@Js8YuPJY4R2k?^wsz9(&!nji}M?e8v6o86-{YlE|Hp4 zZ#=6jKJ91x4j)7nyRIhQTyIUOMQ^&z)s|Ew``$9v3a9GdeHLW>Lx-h8F6waQ0`rZS zoR@Nqb}?U5y-L-L#=hHRzFhg>-(IxZ$h#uub}W$Gd;_wo+cldxA|#bkpMkGKX9y{}MtDyN>QznGZ0hR8&v+F=tT7+U?0 zl_JlIPBa_LZZinTd>jH{m*KZO!$HOpjZNaE`*$u6riErmXd^vdH(Kid8ah>8)qa7* zm8mj>wJ0)YK2Q!b!W|mu@(`Z&C08}^@PNSAy+v%FvQ*~2-MhBJq|l*_2wiPx+?ui^ zU~$F}d{n-+G3S*M-M-WLQfwl59kO^dv5RhK5y~-kdY}GqExVqK9y7r^R`XyuXP6z6vHZ<$&P7*e@l3cC-* zS=U*OP4*0oc&Klj8ygeS!WxDhOPn5so&#(1J;?y(*RMg{q|ppN*Q$3Q~`-;8_udV6lg3mryp$p$dw<;epPOjdQquFg- z*V*i%u<*c>F zNGnAOr}ze~D|f92_00Mor)+E$#Vu`_a4And<=Wl0R3N&qKWOvHbm66hdfMb!2Qs>Q zDQM%F@9%jAt(P-E&4%2?!u~7;AK8JVGyh_PEZybzuRy-scPT`C(Ff!sIy06HeO3tx zj`R9tn|b7S*3;-hTQ{_QGA#lxs&$lS$t|xh$R>}cK!ldite)lQ=!sm1*wd`q6P!U% zdydJ&Ve=>)hFN+ogZiPYn8U|){KPJk!Zuw?XzISUIj1V3*FwqXdySX?r0|vA!geo8 zd}b@Q=u6QPDz9A!HnZ$plO?6@vmjag?eI3j~A|#+#t7EHuA7G@#HA*4B}Q(~)Wgk> zClNpJm*kLphnK`u(Abr3qej(U{3Eh)6M;QSfsT>`g-z&5^-`nHPmEXdS8FZJ`w>n< z4Tn_55s)e85B=M+sNedRCJt2$1rzy{yE5`MiaRwvY%fRD(>N&f4N}|yY*+KUya{S$ zCLvpVen0;5v{br7W_EP@q_PV)TEroIv zoD1^m2gFZM=MpfMKEOZeFkH)hakyFfp+O|Z{R_=L%XW@N=jAa?r$kJb;O<4ROd=snc)vPZ~%_Y4SL097D6>j zQ(ib6i}ttW0RokV3~s-z3Ov59bPje;IZNk9F{Rvblu3TBd3PnqX7I@cYb`ZFnKM6x z!hWA-_xtw?_^Ar8mO!@)gHJvyf#lmBv$9sH)w2=xmNW=Eh;~PdH{*hn8q>1Q4CsL=p*LPRI97s8KVaqM9Ltm9DI0{YL1e@9lF~dnz;^0)$*b=^ zLhCp`=l=IMoFqLnf8!K@!)Cw*3rvw|{s|TT@zclC-~j6r$+syVeJnW9OwUa6XRdqn z)928m8(nrC3whlFj-(&DrAhv`Bd&voq94abdXn@BfV+4lj>FO591};&E6OOl>&!z% z0Be~tJaPTo5w_qa%LC${Tz+&j23*3--_hXzUc FQVoa*zFPH*H_redyD*wB@^sU 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 literal 0 HcmV?d00001 diff --git a/beta/script.js b/beta/script.js new file mode 100644 index 00000000..acc6669a --- /dev/null +++ b/beta/script.js @@ -0,0 +1,268 @@ +document.addEventListener('DOMContentLoaded', () => { + // Generate TOC for FAQ page + const faqTocList = document.getElementById('faq-toc-list'); + const faqContent = document.getElementById('faq-content'); + + if (faqTocList && faqContent) { + const sections = faqContent.querySelectorAll('.faq-section'); + sections.forEach(section => { + const h2 = section.querySelector('h2'); + if (h2) { + // Create H2 Link + const li = document.createElement('li'); + const a = document.createElement('a'); + a.href = '#' + h2.id; + a.textContent = h2.textContent; + li.appendChild(a); + faqTocList.appendChild(li); + + // Create H3 Links (Questions) + const questions = section.querySelectorAll('.faq-question'); + if (questions.length > 0) { + const subUl = document.createElement('ul'); + questions.forEach(q => { + const subLi = document.createElement('li'); + const subA = document.createElement('a'); + subA.href = '#' + q.id; + subA.textContent = q.textContent; + subLi.appendChild(subA); + subUl.appendChild(subLi); + }); + li.appendChild(subUl); + } + } + }); + } + + // Generate TOC for Manual page + const manualTocList = document.getElementById('manual-toc-list'); + const manualContainer = document.getElementById('manual-container'); + + if (manualTocList && manualContainer) { + // Query specific manual title classes + const headers = manualContainer.querySelectorAll('.manual-title-level-1, .manual-title-level-2, .manual-title-level-3'); + + let currentLevel1 = null; + let currentLevel2Ul = null; + + headers.forEach(header => { + // Determine level based on class name + let level = 1; + if (header.classList.contains('manual-title-level-2')) level = 2; + if (header.classList.contains('manual-title-level-3')) level = 3; + + if (level === 1) { + const li = document.createElement('li'); + const a = document.createElement('a'); + a.href = '#' + header.id; + a.textContent = header.textContent; + li.appendChild(a); + manualTocList.appendChild(li); + + currentLevel1 = li; + currentLevel2Ul = null; + } + else if (level === 2 && currentLevel1) { + if (!currentLevel2Ul) { + currentLevel2Ul = document.createElement('ul'); + currentLevel1.appendChild(currentLevel2Ul); + } + const li = document.createElement('li'); + const a = document.createElement('a'); + a.href = '#' + header.id; + a.textContent = header.textContent; + li.appendChild(a); + currentLevel2Ul.appendChild(li); + } + // Add level 3 handling if needed later + }); + } + + // Mobile menu closes when a link is clicked + const links = document.querySelectorAll('nav a'); + const checkbox = document.getElementById('menu-toggle'); + + links.forEach(link => { + link.addEventListener('click', () => { + if (checkbox) checkbox.checked = false; + }); + }); + + // Simple smooth scroll for anchor links + document.querySelectorAll('a[href^="#"]').forEach(anchor => { + anchor.addEventListener('click', function (e) { + e.preventDefault(); + const target = document.querySelector(this.getAttribute('href')); + if (target) { + target.scrollIntoView({ + behavior: 'smooth' + }); + } + }); + }); + + // FAQ Search functionality for .faq-item structure + const faqSearch = document.getElementById('faq-search'); + if (faqSearch) { + faqSearch.addEventListener('input', (e) => { + const term = e.target.value.toLowerCase(); + const container = document.getElementById('faq-content'); + const tocList = document.getElementById('faq-toc-list'); + + if (!container) return; + + const items = container.querySelectorAll('.faq-item'); + + items.forEach(item => { + const questionHeader = item.querySelector('.faq-question'); + const question = questionHeader.textContent.toLowerCase(); + const answer = item.querySelector('.faq-answer').textContent.toLowerCase(); + + const isMatch = question.includes(term) || answer.includes(term); + + // Toggle display of the entire item in main content + item.style.display = isMatch ? '' : 'none'; + + // Toggle display of TOC item corresponding to this question + if (tocList && questionHeader.id) { + const tocLink = tocList.querySelector(`a[href="#${CSS.escape(questionHeader.id)}"]`); + if (tocLink) { + const tocItem = tocLink.parentElement; + tocItem.style.display = isMatch ? '' : 'none'; + } + } + }); + + // Auto-hide sections if all their items are hidden + const sections = container.querySelectorAll('.faq-section'); + sections.forEach(section => { + const visibleItems = section.querySelectorAll('.faq-item:not([style*="display: none"])'); + const isSectionVisible = visibleItems.length > 0; + + section.style.display = isSectionVisible ? '' : 'none'; + + // Toggle display of TOC section + const sectionHeader = section.querySelector('h2'); + if (tocList && sectionHeader && sectionHeader.id) { + const tocLink = tocList.querySelector(`a[href="#${CSS.escape(sectionHeader.id)}"]`); + if (tocLink) { + // The section link is directly inside the top-level li of the TOC + const tocSectionItem = tocLink.parentElement; + tocSectionItem.style.display = isSectionVisible ? '' : 'none'; + } + } + }); + }); + } + + // Language Selector functionality + const languageSelector = document.getElementById('language-selector'); + if (languageSelector) { + // Automatically select the option matching the current file name + const currentFile = window.location.pathname.split('/').pop() || 'manual.html'; + const options = Array.from(languageSelector.options); + const matchingOption = options.find(opt => opt.value === currentFile); + if (matchingOption) { + languageSelector.value = currentFile; + } + + // Redirect on change + languageSelector.addEventListener('change', (e) => { + const selectedPage = e.target.value; + if (selectedPage) { + window.location.href = selectedPage; + } + }); + } + + // UI Gallery Preview on Hover + const shots = document.querySelectorAll('.ui-shot'); + const overlay = document.getElementById('ui-preview-overlay'); + const previewImg = document.getElementById('ui-preview-img'); + + if (overlay && previewImg) { + shots.forEach(shot => { + shot.addEventListener('mouseenter', () => { + const largeSrc = shot.getAttribute('data-large'); + if (largeSrc) { + previewImg.src = largeSrc; + overlay.classList.add('active'); + } + }); + + shot.addEventListener('mouseleave', () => { + overlay.classList.remove('active'); + }); + }); + } + + // Global Popover Logic for Compare Table + const infoBtns = document.querySelectorAll('.info-btn'); + const globalPopover = document.getElementById('global-popover'); + const globalPopoverContent = document.getElementById('global-popover-content'); + const popoverOverlay = document.getElementById('popover-overlay'); + + if (infoBtns.length > 0 && globalPopover && popoverOverlay) { + + function closePopover() { + globalPopover.classList.remove('active'); + popoverOverlay.classList.remove('active'); + globalPopover.style.opacity = ''; // reset just in case + } + + popoverOverlay.addEventListener('click', closePopover); + + infoBtns.forEach(btn => { + btn.addEventListener('click', (e) => { + e.stopPropagation(); + e.preventDefault(); + + // Get content from the hidden sibling div + const contentDiv = btn.parentElement.querySelector('.info-content'); + if (!contentDiv) return; + + globalPopoverContent.innerHTML = contentDiv.innerHTML; + + // Measure the popover by making it transparent but blocked + globalPopover.style.opacity = '0'; + globalPopover.classList.add('active'); + + const popWidth = globalPopover.offsetWidth; + const popHeight = globalPopover.offsetHeight; + + globalPopover.classList.remove('active'); + globalPopover.style.opacity = ''; + + // Position the popover + const rect = btn.getBoundingClientRect(); + const scrollX = window.pageXOffset || document.documentElement.scrollLeft; + const scrollY = window.pageYOffset || document.documentElement.scrollTop; + + // Calculate position (centered above the button by default) + let top = rect.top + scrollY - popHeight - 15; + let left = rect.left + scrollX - (popWidth / 2) + (rect.width / 2); + + // Simple collision detection + if (rect.top - popHeight - 20 < 0) { + // flip to bottom + top = rect.bottom + scrollY + 15; + } + + // ensure left is on screen + if (left < 10) left = 10; + if (left + popWidth > window.innerWidth) { + left = window.innerWidth - popWidth - 10; + } + + globalPopover.style.top = `${top}px`; + globalPopover.style.left = `${left}px`; + + globalPopover.classList.add('active'); + popoverOverlay.classList.add('active'); + }); + }); + + // Close on resize to prevent weird positioning + window.addEventListener('resize', closePopover); + } +}); diff --git a/beta/style.css b/beta/style.css new file mode 100644 index 00000000..abf1af34 --- /dev/null +++ b/beta/style.css @@ -0,0 +1,830 @@ +:root { + /* Color Palette - Systems Dark */ + --c-slate-950: #020617; + --c-slate-900: #0f172a; + + --bg-body: var(--c-slate-950); /* Deep Slate */ + --bg-surface: var(--c-slate-900); /* Lighter Slate */ + --bg-surface-hover: #1e293b; /* Slate 800 */ + --border-color: #1e293b; /* Slate 800 */ + + --text-primary: #f8fafc; + --text-secondary: #94a3b8; + --text-accent: #38bdf8; /* Cyan/Blue mix */ + + --primary: #3b82f6; /* Electric Blue */ + --primary-hover: #2563eb; + --primary-glow: rgba(59, 130, 246, 0.5); + + --success: #10b981; + --warning: #f59e0b; + --danger: #ef4444; + + /* Spacing & Layout */ + --container-width: 1200px; + --header-height: 70px; + --radius: 8px; + --font-main: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + --font-mono: "SF Mono", "Segoe UI Mono", "Roboto Mono", monospace; +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + background-color: var(--bg-body); + color: var(--text-primary); + font-family: var(--font-main); + line-height: 1.6; + -webkit-font-smoothing: antialiased; +} + +/* --- Layout Utilities --- */ +.container { + max-width: var(--container-width); + margin: 0 auto; + padding: 0 20px; +} + +.grid { + display: grid; + gap: 2rem; +} + +.grid-2-cols { grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); } +.grid-3-cols { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } +.grid-4-cols { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); } + +/* --- Typography --- */ +h1, h2, h3, h4 { + font-weight: 700; + line-height: 1.2; + margin-bottom: 1rem; + color: var(--text-primary); +} + +h1 { font-size: 3.5rem; letter-spacing: -0.05em; } +h2 { font-size: 2.25rem; border-bottom: 1px solid var(--border-color); padding-bottom: 0.5rem; } +h3 { font-size: 1.5rem; color: var(--text-primary); } +p { margin-bottom: 1.5rem; color: var(--text-secondary); } +a { color: var(--primary); text-decoration: none; transition: 0.2s; } +a:hover { color: var(--text-accent); } +.accent-text { color: var(--primary); text-transform: uppercase; letter-spacing: 0.05em; font-size: 0.875rem; } + +code, pre { + font-family: var(--font-mono); +} + +/* --- Header & Navigation --- */ +header { + height: var(--header-height); + background: rgba(2, 6, 23, 0.9); /* Matches --c-slate-950 */ + backdrop-filter: blur(10px); + border-bottom: 1px solid var(--border-color); + position: sticky; + top: 0; + z-index: 1000; +} + +.nav-container { + display: flex; + justify-content: space-between; + align-items: center; + height: 100%; +} + +.logo { + font-size: 1.5rem; + font-weight: 800; + color: var(--text-primary); + display: flex; + align-items: center; + gap: 10px; +} + +.logo svg { height: 32px; width: 32px; fill: var(--text-primary); } +.logo-accent { fill: var(--primary); } + +nav ul { + display: flex; + list-style: none; + gap: 20px; + align-items: center; +} + +nav a { + font-size: 0.95rem; + color: var(--text-secondary); + font-weight: 500; +} + +nav a:hover, nav a.active { + color: var(--primary); +} + +.nav-cta { + background: var(--primary); + color: white !important; + padding: 0.5rem 1rem; + border-radius: var(--radius); +} + +.nav-cta:hover { + background: var(--primary-hover); +} + +/* --- Buttons --- */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0.75rem 1.5rem; + border-radius: var(--radius); + font-weight: 600; + cursor: pointer; + border: none; + transition: all 0.2s ease; + text-decoration: none; +} + +.btn-primary { + background: var(--primary); + color: white; + box-shadow: 0 0 15px var(--primary-glow); +} + +.btn-primary:hover { + background: var(--primary-hover); + transform: translateY(-1px); + color: white; +} + +.btn-secondary { + background: transparent; + border: 1px solid var(--border-color); + color: var(--text-primary); +} + +.btn-secondary:hover { + background: var(--bg-surface); + border-color: var(--text-accent); + color: var(--text-accent); +} + +.btn-block { width: 100%; } + +/* --- Sections --- */ +.hero-section { + padding: 6rem 0; + text-align: center; +} + +.hero-subtext { + font-size: 1.25rem; + max-width: 700px; + margin: 1.5rem auto; +} + +.hero-actions { + display: flex; + justify-content: center; + gap: 1rem; + margin-top: 2.5rem; +} + +.daemon-section { + background: linear-gradient(180deg, var(--bg-body) 0%, var(--bg-surface) 100%); + padding: 5rem 0; + border-top: 1px solid var(--border-color); + border-bottom: 1px solid var(--border-color); +} + +.daemon-layout { + align-items: center; +} + +.feature-list { + list-style: none; + margin-bottom: 2rem; +} + +.feature-list li { + margin-bottom: 10px; + display: flex; + align-items: center; + gap: 10px; + color: var(--text-secondary); +} + +.icon-check { + width: 20px; + height: 20px; + fill: var(--success); +} + +.link-arrow { + font-weight: 600; + display: inline-flex; + align-items: center; +} + +/* --- Terminal Mockup --- */ +.terminal-mockup { + background: #000; + border: 1px solid var(--border-color); + border-radius: var(--radius); + padding: 0; + box-shadow: 0 0 30px rgba(59, 130, 246, 0.1); + font-family: var(--font-mono); + overflow: hidden; +} + +.terminal-header { + background: var(--bg-surface); + padding: 10px 15px; + display: flex; + gap: 8px; + border-bottom: 1px solid var(--border-color); +} + +.dot { width: 10px; height: 10px; border-radius: 50%; } +.red { background: #ef4444; } +.yellow { background: #f59e0b; } +.green { background: #10b981; } + +.terminal-body { + padding: 20px; + color: #e2e8f0; + font-size: 0.85rem; +} + +.term-line { margin-bottom: 4px; } +.term-line.success { color: var(--success); } +.term-line.warning { color: var(--warning); } +.term-line.info { color: var(--text-accent); } +.term-line.separator { color: var(--border-color); margin: 8px 0; } + +/* --- Cards --- */ +.features-section { padding: 5rem 0; } +.section-title { text-align: center; margin-bottom: 3rem; } + +.card { + background: var(--bg-surface); + border: 1px solid var(--border-color); + padding: 2rem; + border-radius: var(--radius); + transition: transform 0.2s, border-color 0.2s; +} + +.card:hover { + border-color: var(--primary); + transform: translateY(-2px); +} + +.card-subtitle { + color: var(--text-accent); + margin-bottom: 0.5rem; + font-style: italic; + font-weight: 500; +} + +.card-icon-wrapper { + width: 48px; + height: 48px; + background: rgba(59, 130, 246, 0.1); + border-radius: 12px; + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 1rem; +} + +.card-icon { width: 24px; height: 24px; fill: var(--primary); } + +/* --- Tables --- */ +.data-table { + width: 100%; + border-collapse: collapse; + margin: 2rem 0; + background: var(--bg-surface); + border-radius: var(--radius); + overflow: hidden; +} + +.data-table th, .data-table td { + text-align: left; + padding: 1rem; + border-bottom: 1px solid var(--border-color); +} + +.data-table th { + color: var(--text-accent); + font-weight: 600; + background: rgba(255, 255, 255, 0.02); +} + +.data-table tr:last-child td { border-bottom: none; } +.data-table tr:hover td { background: var(--bg-surface-hover); } + +/* --- Search Input --- */ +.search-input { + width: 100%; + padding: 1rem 1.5rem; + font-size: 1rem; + background: var(--bg-surface); + border: 1px solid var(--border-color); + border-radius: var(--radius); + color: var(--text-primary); + transition: border-color 0.2s, box-shadow 0.2s; + outline: none; + margin-bottom: 2rem; +} + +.search-input:focus { + border-color: var(--primary); + box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.2); +} + +.search-input::placeholder { + color: var(--text-secondary); +} + +/* --- FAQ Specific Styling --- */ +#faq-content { + max-width: 100%; /* Changed from 900px since it's now in a grid cell */ +} + +.faq-section { + margin-bottom: 4rem; +} + +.faq-section h2 { + margin-top: 1rem; + margin-bottom: 2rem; + color: var(--primary); + border-bottom: 1px solid var(--border-color); + padding-bottom: 0.5rem; + font-size: 2rem; + letter-spacing: -0.02em; + scroll-margin-top: 100px; +} + +.faq-item { + border-bottom: 1px solid var(--border-color); + margin-bottom: 2rem; + padding-bottom: 2rem; +} + +.faq-item:last-child { + border-bottom: none; + margin-bottom: 0; + padding-bottom: 0; +} + +.faq-question { + margin-top: 0; + margin-bottom: 1rem; + font-size: 1.4rem; + color: var(--text-primary); + font-weight: 700; + scroll-margin-top: 100px; /* Offset for sticky header */ +} + +/* The wrapper for the answer content */ +.faq-answer { + padding-left: 1.5rem; + border-left: 3px solid var(--bg-surface-hover); + margin-top: 1rem; +} + +.faq-answer:hover { + border-left-color: var(--primary); +} + +/* Styles for content INSIDE .faq-answer */ +.faq-answer p { + margin-bottom: 1rem; + color: var(--text-secondary); + line-height: 1.7; + background: transparent; + padding: 0; + border: none; +} + +.faq-answer ul, .faq-answer ol { + margin-bottom: 1.5rem; + padding-left: 1.5rem; + color: var(--text-secondary); + list-style-position: outside; +} + +.faq-answer li { + margin-bottom: 0.5rem; + padding-left: 0.5rem; +} + +.faq-answer table { + width: 100%; + border-collapse: collapse; + margin: 1.5rem 0; + font-size: 0.95rem; + background: var(--bg-surface); + border: 1px solid var(--border-color); + border-radius: var(--radius); + display: block; + overflow-x: auto; + white-space: nowrap; +} + +@media (min-width: 768px) { + .faq-answer table { + display: table; + white-space: normal; + } +} + +.faq-answer th, .faq-answer td { + padding: 0.75rem 1rem; + border: 1px solid var(--border-color); + text-align: left; + vertical-align: top; +} + +.faq-answer th { + background: rgba(59, 130, 246, 0.1); + color: var(--text-primary); + font-weight: 600; +} + +.faq-answer td { + background: transparent; +} + +.faq-answer tr:nth-child(even) td { + background: rgba(255, 255, 255, 0.02); +} + +.faq-answer a { + text-decoration: underline; + text-underline-offset: 2px; +} + +/* --- Footer --- */ +footer { + border-top: 1px solid var(--border-color); + padding: 4rem 0; + margin-top: 4rem; + background: var(--bg-surface); +} + +.footer-content { + display: flex; + justify-content: space-between; + flex-wrap: wrap; + gap: 2rem; +} + +.footer-col h3 { color: var(--text-primary); margin-bottom: 0.5rem; } +.footer-col h4 { color: var(--text-accent); font-size: 0.9rem; text-transform: uppercase; margin-bottom: 1rem; border: none; } +.footer-col ul { list-style: none; } +.footer-col ul li { margin-bottom: 0.5rem; } +.license { font-size: 0.8rem; color: var(--text-secondary); margin-top: 1rem; } + +/* --- Mobile Menu --- */ +#menu-toggle { display: none; } +.menu-icon { display: none; cursor: pointer; color: var(--text-primary); } + +@media (max-width: 768px) { + h1 { font-size: 2.5rem; } + .hero-actions { flex-direction: column; } + .menu-icon { display: block; } + + nav ul { + display: none; + flex-direction: column; + position: absolute; + top: var(--header-height); + left: 0; + width: 100%; + background: var(--bg-surface); + padding: 1rem; + border-bottom: 1px solid var(--border-color); + align-items: flex-start; + } + nav ul li { width: 100%; } + nav a { display: block; padding: 0.5rem 0; } + nav .nav-cta { text-align: center; } + + #menu-toggle:checked ~ ul { display: flex; } + + .manual-layout, .faq-layout { grid-template-columns: 1fr; } + .manual-sidebar { position: static; margin-bottom: 2rem; border-bottom: 1px solid var(--border-color); padding-bottom: 1rem; } +} + +/* --- Specific Page: Manual --- */ +.manual-layout, .faq-layout { + display: grid; + grid-template-columns: 250px 1fr; + gap: 3rem; + padding-top: 2rem; + padding-bottom: 4rem; +} + +.manual-sidebar { + position: sticky; + top: 90px; + height: fit-content; + max-height: calc(100vh - 100px); + overflow-y: auto; + padding-right: 5px; + + /* Hide scrollbar for IE, Edge and Firefox */ + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} + +/* Hide scrollbar for Chrome, Safari and Opera */ +.manual-sidebar::-webkit-scrollbar { + display: none; +} + +.manual-sidebar h4 { color: var(--text-primary); margin-bottom: 1rem; } +.manual-sidebar ul { list-style: none; } +.manual-sidebar a { display: block; padding: 0.5rem 0; color: var(--text-secondary); border-left: 2px solid transparent; padding-left: 10px; } +.manual-sidebar a:hover, .manual-sidebar a.current { color: var(--primary); border-left-color: var(--primary); } + +/* Nested TOC for FAQ */ +.manual-sidebar ul ul { + margin-left: 10px; + margin-bottom: 10px; + border-left: 1px solid var(--border-color); +} +.manual-sidebar ul ul a { + font-size: 0.85rem; + padding: 0.25rem 0 0.25rem 10px; + border-left: none; +} +.manual-sidebar ul ul a:hover { + color: var(--text-accent); +} + +/* --- Manual Content Styling (NEW) --- */ +.manual-doc { + font-family: var(--font-main); + color: var(--text-secondary); + line-height: 1.7; + max-width: 900px; +} + +/* Level 1 Sections */ +.manual-section-level-1 { + margin-bottom: 4rem; + padding-bottom: 2rem; + border-bottom: 1px solid var(--border-color); +} +.manual-section-level-1:last-child { + border-bottom: none; +} + +.manual-title-level-1 { + font-size: 2rem; + color: var(--text-primary); + margin-bottom: 1.5rem; + border-bottom: none; + scroll-margin-top: 100px; +} + +/* Level 2 Sections */ +.manual-section-level-2 { + margin-top: 3rem; + margin-left: 1.5rem; + padding-left: 1.5rem; + border-left: 2px solid var(--border-color); +} + +.manual-title-level-2 { + font-size: 1.4rem; + color: var(--text-accent); + margin-bottom: 1rem; + border-bottom: none; + scroll-margin-top: 100px; +} + +/* Level 3 Sections */ +.manual-section-level-3 { + margin-top: 2rem; + margin-left: 1.5rem; + padding-left: 1rem; + border-left: 1px dashed var(--border-color); +} + +.manual-title-level-3 { + font-size: 1.1rem; + color: var(--text-primary); + text-transform: uppercase; + letter-spacing: 0.05em; + margin-bottom: 0.75rem; + scroll-margin-top: 100px; +} + +/* Common Text Elements */ +.manual-doc p { margin-bottom: 1rem; } +.manual-doc ul { margin-bottom: 1.5rem; padding-left: 2rem; list-style-type: disc; } +.manual-doc li { margin-bottom: 0.5rem; } + +/* The Pre Tag */ +.manual-doc pre { + background: #000000; + color: #e2e8f0; + padding: 1.25rem; + border: 1px solid var(--border-color); + border-radius: var(--radius); + font-family: var(--font-mono); + font-size: 0.9rem; + overflow-x: auto; + margin: 1.5rem 0; + white-space: pre; +} + +.manual-indent { + margin-left: 2rem; + border-left: 3px solid var(--primary); +} + +/* Option and Tag Lists (Grid Layout) */ +.manual-option-list, .manual-tag-list { + display: grid; + grid-template-columns: auto 1fr; + gap: 1rem 2rem; + margin: 1.5rem 0; + align-items: baseline; +} + +.manual-option-entry, .manual-tag-entry { + display: contents; /* Allows children to participate in the parent grid */ +} + +.manual-option-name, .manual-tag-name { + font-family: var(--font-mono); + color: var(--warning); + font-weight: 700; + white-space: nowrap; +} + +.manual-option-description, .manual-tag-description { + color: var(--text-secondary); +} + +@media (max-width: 600px) { + .manual-option-list, .manual-tag-list { + grid-template-columns: 1fr; + gap: 0.5rem; + } + .manual-option-description, .manual-tag-description { + margin-bottom: 1rem; + margin-left: 1rem; + } +} + +/* Compare Grid */ +.compare-container { overflow-x: auto; position: relative; } +.compare-table { min-width: 900px; } +.compare-table th { text-align: center; } +.compare-table td { text-align: center; vertical-align: middle; } +.feature-cell { text-align: left !important; font-weight: 600; color: var(--text-primary); } +.cell-subtext { font-size: 0.8rem; color: var(--text-secondary); font-weight: 400; margin-top: 2px; } +.check { color: var(--success); } +.cross { color: var(--danger); } +.partial { color: var(--warning); } +.snapraid-col { background: rgba(59, 130, 246, 0.1); border-left: 1px solid var(--primary); border-right: 1px solid var(--primary); } +.snapraid-header { color: var(--primary) !important; font-size: 1.2rem; } + +/* Info Button and Popover */ +.info-wrapper { + display: inline-block; + vertical-align: middle; + margin-left: 5px; +} + +.info-btn { + background: none; + border: none; + cursor: pointer; + padding: 0; + color: var(--primary); + display: flex; + align-items: center; + transition: color 0.2s; +} + +.info-btn:hover { + color: var(--text-accent); +} + +.global-popover { + display: none; + position: absolute; + width: 300px; + max-width: 90vw; + background: var(--bg-surface); + border: 1px solid var(--border-color); + padding: 1.25rem; + border-radius: var(--radius); + box-shadow: 0 10px 40px rgba(0,0,0,0.6); + z-index: 2000; + font-size: 0.9rem; + line-height: 1.6; + color: var(--text-secondary); + text-align: left; +} + +.global-popover.active { + display: block; + animation: popIn 0.2s ease-out; +} + +@keyframes popIn { + from { opacity: 0; transform: translateY(10px); } + to { opacity: 1; transform: translateY(0); } +} + +.popover-overlay { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + z-index: 1999; +} + +.popover-overlay.active { + display: block; +} + +/* Support Cards */ +.support-card { display: flex; gap: 1rem; align-items: start; } +.support-icon { min-width: 40px; height: 40px; fill: var(--text-secondary); } +.donation-card { border-color: var(--warning); background: rgba(245, 158, 11, 0.05); } + +/* UI Gallery */ +.ui-gallery { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1rem; margin-top: 2rem; } +.ui-shot { + border: 1px solid var(--border-color); + border-radius: var(--radius); + overflow: hidden; + height: 200px; + background: #000; + position: relative; + cursor: pointer; +} +.ui-shot img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; + transition: transform 0.3s ease; +} +.ui-shot:hover img { + transform: scale(1.05); +} +.ui-shot-caption { position: absolute; bottom: 0; left: 0; right: 0; background: rgba(0,0,0,0.8); color: white; padding: 0.5rem; font-size: 0.8rem; text-align: center; } + +/* Preview Overlay */ +#ui-preview-overlay { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background: rgba(2, 6, 23, 0.85); /* Slate 950 with opacity */ + backdrop-filter: blur(8px); + z-index: 2000; + display: flex; + align-items: center; + justify-content: center; + opacity: 0; + pointer-events: none; /* Allows hover events to pass through to underlying elements */ + transition: opacity 0.3s ease; +} + +#ui-preview-overlay.active { + opacity: 1; +} + +#ui-preview-img { + max-width: 90%; + max-height: 90%; + border-radius: var(--radius); + box-shadow: 0 0 50px rgba(0,0,0,0.5); + transform: scale(0.95); + transition: transform 0.3s ease; +} + +#ui-preview-overlay.active #ui-preview-img { + transform: scale(1); +} diff --git a/beta/support.html b/beta/support.html new file mode 100644 index 00000000..e950ca30 --- /dev/null +++ b/beta/support.html @@ -0,0 +1,416 @@ + + + + + + + + SnapRAID Support + + + + + + + + + + + + + + + + +
+ +
+ + +
+

Community Support

+ + + +
+

Community Guides & Tutorials

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PlatformTitlePublishedDescription
LinuxHow to install and setup SnapraidJun 26, 2023Step-by-step guide to compiling, installing, and automating SnapRAID parity protection.
LinuxHow to recover a failed drive using SnapraidJul 31, 2023Demonstrates recovering data from a failed drive in a MergerFS + SnapRAID setup.
LinuxHow to install and setup MergerFSJun 26, 2023How to install and setup MergerFS for SnapRAID.
LinuxMergerFS + SnapRAID : Forget about RAID 5 in your Home Server !Feb 21, 2023Explains setting up MergerFS and SnapRAID for home server safety equivalent to RAID 5, with Slack notifications.
LinuxDIY Unraid-like functionalityJun 12, 2025Builds Unraid-style setup with SnapRAID overview, install, and use starting at 11:26.
LinuxHow to build the Perfect Media Server | Part 1 - The Tech StackApr 22, 2025Overview of building a media server stack, including SnapRAID integration at 19:28.
LinuxHow to setup a Linux Fileserver with Snapraid and Mergerfs Re-ExportApr 23, 2018Guides through setting up SnapRAID with MergerFS on Linux for a simple fileserver, including add/remove drives.
Linux (Italian)Il RAID è OBSOLETO: la migliore ALTERNATIVA in ambito domesticoJun 18, 2023Review di SnapRAID da parte di Morro Linux
OpenMediaVaultSetting up SnapRAID + mergerfs on OpenMediaVaultNov 19, 2023Tutorial for configuring SnapRAID and MergerFS on OpenMediaVault, including drive additions.
OpenMediaVaultSetting up MergerFS SnapRaid and file server on OpenMediaVaultSep 10, 2023Guides through creating a protected storage pool and file server with MergerFS and SnapRAID.
WindowsSetting up SnapRAID for Windows (and DrivePool) PART 1Apr 28, 2023A detailed guide on installing and configuring SnapRAID on Windows, including integration with DrivePool for disk pooling.
WindowsSnapRAID for Windows (and DrivePool) Part 2 - RecoveryMay 12, 2023The second part of the series, focusing on array modification, data recovery from deletions or corruption, and disk replacement.
WindowsHow to setup Snapraid and DrivePool in WindowsSep 29, 2017Shows how to set up SnapRAID and DrivePool to create a large volume with parity backup for files.
+
+ + + + + +
+

Video Tutorials

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PlatformTitlePublishedDescription
LinuxHow to install and setup SnapraidJun 26, 2023Step-by-step guide to compiling, installing, and automating SnapRAID parity protection.
LinuxHow to recover a failed drive using SnapraidJul 31, 2023Demonstrates recovering data from a failed drive in a MergerFS + SnapRAID setup.
LinuxHow to install and setup MergerFSJun 26, 2023How to install and setup MergerFS for SnapRAID.
LinuxMergerFS + SnapRAID : Forget about RAID 5 in your Home Server !Feb 21, 2023Explains setting up MergerFS and SnapRAID for home server safety equivalent to RAID 5, with Slack notifications.
LinuxDIY Unraid-like functionalityJun 12, 2025Builds Unraid-style setup with SnapRAID overview, install, and use starting at 11:26.
LinuxHow to build the Perfect Media Server | Part 1 - The Tech StackApr 22, 2025Overview of building a media server stack, including SnapRAID integration at 19:28.
LinuxHow to setup a Linux Fileserver with Snapraid and Mergerfs Re-ExportApr 23, 2018Guides through setting up SnapRAID with MergerFS on Linux for a simple fileserver, including add/remove drives.
Linux (Italian)Il RAID è OBSOLETO: la migliore ALTERNATIVA in ambito domesticoJun 18, 2023Review di SnapRAID da parte di Morro Linux
OpenMediaVaultSetting up SnapRAID + mergerfs on OpenMediaVaultNov 19, 2023Tutorial for configuring SnapRAID and MergerFS on OpenMediaVault, including drive additions.
OpenMediaVaultSetting up MergerFS SnapRaid and file server on OpenMediaVaultSep 10, 2023Guides through creating a protected storage pool and file server with MergerFS and SnapRAID.
WindowsSetting up SnapRAID for Windows (and DrivePool) PART 1Apr 28, 2023A detailed guide on installing and configuring SnapRAID on Windows, including integration with DrivePool for disk pooling.
WindowsSnapRAID for Windows (and DrivePool) Part 2 - RecoveryMay 12, 2023The second part of the series, focusing on array modification, data recovery from deletions or corruption, and disk replacement.
WindowsHow to setup Snapraid and DrivePool in WindowsSep 29, 2017Shows how to set up SnapRAID and DrivePool to create a large volume with parity backup for files.
+
+ + + + +
+ + + + + + + diff --git a/beta/tasks.png b/beta/tasks.png new file mode 100644 index 0000000000000000000000000000000000000000..7a5b583948862b09b3b30811504350398e9be482 GIT binary patch literal 110448 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 literal 0 HcmV?d00001 diff --git a/beta/ui.html b/beta/ui.html new file mode 100644 index 00000000..85552f2f --- /dev/null +++ b/beta/ui.html @@ -0,0 +1,181 @@ + + + + + + + + SnapRAID UI & Daemon + + + + + + + + + + + + + + + + + + + +
+
+

NEXT GENERATION

+

Classic Reliability
Modern Control

+

+ The SnapRAID Daemon is the modern companion service designed to move your storage from a manual, + terminal-based workflow to an "always-on" background intelligence. +

+
+ +
+
+

Why the Daemon?

+
+

The "Set-and-Forget" Philosophy

+

The daemon handles the heavy lifting so you don't have to. It proactively monitors array health and manages the parity lifecycle in the background. If it detects a massive accidental deletion or a hardware error, it triggers a Safety Freeze, protecting your parity until you intervene. It is the intelligence that knows when to work and the restraint to stay silent when your disks are idle.

+

The Modern Visual Experience

+

Move your management from the terminal to the browser. The integrated Web UI provides a high-fidelity command center that is served natively by the daemon, no complex web server setup required.

+
+
+
+ Daemon Dashboard +
Daemon Dashboard
+
+
+ +

Feature Spotlight

+
+
+

Autonomous Maintenance

+

SnapRAID on Autopilot

+

Stop managing cron jobs. The daemon handles the full lifecycle of up, diff, sync, and scrub based on your custom schedule, ensuring your parity is never stale.

+
+ +
+

Active Health Guard

+

Listen to Your Disks

+

Beyond parity, the daemon watches the hardware. With integrated SMART monitoring, it detects pre-failure symptoms and rising temperatures before a drive goes dark.

+
+
+

Intelligent Power Management

+

Spin-down Aware Intelligence

+

Intelligent logic ensures disks not accessed by applications are automatically spun down. Routine health probes respect standby states to save energy and hardware life.

+
+
+

Safety Interlocks

+

Defend Against the Accidental

+

Massive accidental deletion? The daemon's safety thresholds will freeze a sync task instantly, protecting your parity from reflecting a disaster

+
+
+

Multi-Channel Alerts

+

In the Loop, Everywhere

+

Whether it's a successful scrub or a critical disk error, get notified via ntfy.sh webhooks, email, or system logs the moment it happens.

+
+
+

Open for Integration

+

The Terminal, Reimagined for Developers

+

Full REST API backend designed for third-party integration. Connect your array to Home Assistant, custom scripts, or mobile apps.

+
+
+ +

UI Gallery

+ +
+ + +
+ Large Preview +
+ + + + + + +
+ +
+ +
+ +