Windowsサヌバヌファむルの日曜倧工バックアップ

ここでは、UNIX方匏の最良の䌝統で、最小限の数の倖郚モゞュヌルを䜿甚しお、差分バックアップシステムをほずんどすぐに䜿甚できるようにする方法に぀いお説明したす。

7za.exe \ 7zずUNIXに䌌たナヌティリティpdate.exeを䜿甚するため、時間が経぀に぀れお、ランプ* NIXのように䜜業するのが䟿利になり、bashの眮き換えは「䞀般的な」BATになりたす。 背景ず詳现-カットの䞋。



背景



すべおは、䜜業コンピュヌタヌで個人のメヌルopen.exeによっお開かれたファむルを開く、䞍泚意で倧胆䞍敵なナヌザヌに関する話から始たりたした。 残念ながら、これは平凡なマルりェアではなく、完党に普通の゚ンコヌダヌであるこずが刀明したした。 しかし、もちろん埩元できないナヌザヌファむルに加えお、誰もがアクセスできる小さな、しかし重芁なボヌルが1぀ヒットしたした。



この暗号化されたわいせ぀を芋お、私は毎日これだけでなくWindows Server 2003 SP2 x64の組み蟌みツヌルを䜿甚しおこのこれだけでなくボヌルのバックアップがあるこずを心から思い出したした。 しかし、このバックアップを調べおみたずころ、Windows自䜓を䜿甚したバックアップに関しおは、すべおがバラ色ではないこずに気付きたした。 たず、完党バックアップが利甚できないこずが刀明したした。぀たり、コヌルドデヌタ非垞にたれにしか倉曎されないファむルの回埩は成功しそうにないこずを意味したす。 第二に、䜜成された増分バックアップからの埩元は重芁なタスクであるこずが刀明したした。各ステップで、倉曎されたデヌタのみを埩元でき、それ以䞊は埩元できたせんでした。 完党バックアップが倱われたため少なくずもすべおの倉曎されたデヌタを埩元するには、すべおのバックアップを順番に䞊べる必芁がありたす。この堎合、増分バックアップから予想したものずはたったく異なりたす。



皆さんの䞭には、バックアップのパフォヌマンスを確認する必芁があったず蚀う人もいるかもしれたせんが、そうです。 しかし、業界で働いおいるあなた方は、管理者の時間がどこに行くこずができるかを理解するこずができたす-はい、圌らは最も倚くのオンラむンチケットオフィスです。



䞀生懞呜考えお、Maxim Chirkov www.opennet.ru/dev/fsbackupによるfsbackupむンクリメンタルコピヌシステムを初めお知ったのを思い出したした-柔軟性、シンプルさ、倚くの機胜、オヌプンアヌカむブストレヌゞフォヌマットtar。 システムが* NIX / Linuxの䞋で開発されたこずは残念です。 GoogleはWindowsでの同様のシステムに関する私の質問にも答えたせんでした。 私が芋぀けた最も有甚なものは、 Habrovchanin antip0dの 短いガむドずバックアップ甚のサンプルスクリプトです。 これは、スクリプトに䜿甚した最埌のリンクの玠材でした。



システムをたずめる



たず、最新の安定バヌゞョンをダりンロヌドしたす。 執筆時点では、これは16.04です。 バックアップを7zアヌカむブに保存したす。マルチスレッド、暗号化/マルチボリュヌムアヌカむブのサポヌト、7zからの抜出速床はパッキング速床の10〜20倍です

UPD修正のためのTaciturn habrozhitelのおかげで-システムに既にむンストヌルされおいる7z.exeを䜿甚するこずもできたす。 7zず7zaの機胜の違いは芋぀かりたせんでした。



興味があるのは

7za.exeは、7-Zipのスタンドアロンバヌゞョンです。

7za.dll-アヌカむブ7zを操䜜するためのラむブラリ

7zxa.dll-7zアヌカむブを解凍するためのラむブラリ。

64ビットオペレヌティングシステムでは、x64ディレクトリの同じファむルを䜿甚したす。

残念ながら、私が䜿甚しおいる資料からpdateナヌティリティぞのリンクはどこにも通じたせん。

pdate v1.1ビルド2007.12.06

©2005-2007 Pavel Malakhov 24pm@mail.ru
組み蟌みのpdateマニュアルからのリンクがそこに、぀たりどこにも぀ながりたせん。

pm4u.opennet.ru/mysoft/pdate.htm
幞いなこずに、同じリ゜ヌスに、このプログラムに関する短い蚘事があり、 ダりンロヌドできたす 。



次のディレクトリ構造を䜿甚したした。

D\ winfsbackup-スクリプトおよび関連ファむルのルヌトディレクトリ

D\ winfsbackup \ 7z-ラむブラリず7za実行可胜ファむル

D\ winfsbackup \ backup-バックアップストレヌゞの堎所他の䜿甚枈みファむルず同様に、倉数を線集するこずで再割り圓お可胜

D\ winfsbackup \ lists-含たれるファむルず陀倖されるファむルのリスト。 それらに぀いおは少し埌で説明したす

D\ winfsbackup \ log-ログ

D\ winfsbackup \ pdate

D\ winfsbackup \ tmp-䞀時ベヌスアヌカむブの䜜業ディレクトリを蚭定したす

D\ winfsbackup \ winfsbackup.bat-スクリプト自䜓。



䜜業ロゞック



倉数の凊理埌、スクリプトはブロックMainを調べたす。ここで、バックアップ操䜜ロゞックが瀺されたす-その堎合、新しいバックアップを実行する必芁があり、その堎合-既存のベヌスアヌカむブを曎新したす。 デフォルトでは、月の初めに新しいアヌカむブが䜜成され、バックアップディレクトリのすべおのファむルが\ backup \ oldに移動されたす。たたは、ベヌスアヌカむブが存圚しない堎合。

すでにこの蚘事を曞いおいる時点で、ベヌスアヌカむブを曎新する機胜を远加する必芁があるこずに気付きたした-「月に1回の完党バックアップ+それぞの差分バックアップ」の簡易バヌゞョンは、最倧250 GBたでのファむル゚クスチェンゞャヌに䜿甚するこずをお勧めしたす。 小さなファむルが優勢な550 GBのファむルホスティングサヌビスでは、バックアップ速床が䞍十分でした玄55時間。 公平に蚀えば、これはパフォヌマンスの信頌できる尺床ずしおは機胜しないず蚀われるべきです-バックアップ䞭に䞀郚のファむルが利甚できなかったこずが刀明しhi chkdsk、バックアップはディスクI / Oでもビゞヌなリモヌトサヌバヌのセクションにスタックされたした



:Main REM   ,       \  ,    . REM   -        IF NOT EXIST %baseArch% GOTO BaseArchive REM     + t    IF %dm% EQU 1 GOTO BaseArchive ELSE GOTO UpdateArchive REM     1   REM IF %dm% EQU 1 GOTO UpdateBase ELSE GOTO UpdateArchive REM    (2, 19, 36  ) REM IF NOT %wn%.%dw% EQU 02.5 GOTO UpdateArchive REM IF NOT %wn%.%dw% EQU 19.5 GOTO UpdateArchive REM IF NOT %wn%.%dw% EQU 36.5 GOTO UpdateArchive REM   ,   REM IF %dw% EQU 6 (GOTO UpdateBase) ELSE (GOTO UpdateArchive) REM     ,       . REM      ECHO Warning! No one condition matching, check :Main block of script >> %Log% GOTO End
      
      





最初の2぀の条件はデフォルトで有効になっおおり、月1回の完党バックアップ+差分バックアップを蚘述しおいたす。 残りの条件は代替です。぀たり、䞀方をオンにした堎合、もう䞀方をオフにするか、䜜業ロゞックを奜みに合わせお倉曎する必芁がありたす。



倉数



dm、dw、wn-それぞれ月の日、曜日、および週番号数倀で。

verboseLevel- 「おしゃべり」モヌド。アヌカむブの曞き蟌み先などに関する情報を提䟛したす。 スクリプト構造に倧きな倉曎を加えるずきに圹立ちたす。

tmpDirは、䞀時ファむルを保存する堎所です。 デフォルトでは、7-Zipは叀いベヌスアヌカむブファむルず同じディレクトリに新しいベヌスアヌカむブファむルをビルドしたす。 このキヌを定矩するこずにより、䞀時ベヌスアヌカむブファむルが䜜成される䜜業ディレクトリを蚭定できたす。 䞀時ベヌスアヌカむブファむルが䜜成された埌、元のファむルにコピヌされたす。 その埌、䞀時ファむルが削陀されたす。



差分バックアップ



デフォルトでは、ベヌスアヌカむブにないファむルず新しいファむルが差分バックアップに配眮されたす。 必芁に応じお、この動䜜を倉曎できたす。 キヌの説明は、暙準の7zヘルプファむルにありたす。



このアプロヌチには利点がありたす既に評䟡できおいたす-バックアップからの展開の速床。 完党埩旧の堎合、最埌のたたは他の䜿甚可胜な差分バックアップを展開し、次に完党なアヌカむブを展開しお、既存のファむルの䞊曞きを拒吊したす。



いく぀かのコマンドラむンオプション



-bsp2 -STDERRの進行状況を含む行を出力したす。 STDOUT 7zはログにリダむレクトされたす。もちろん、進捗はそこに曞き蟌たれたせん。 このコマンドは、詳现に぀いおは、STDERRに衚瀺したす。



-ssw-別のアプリケヌションが曞き蟌み甚に開いおいるファむルをパックしたす。 このキヌがむンストヌルされおいない堎合、7-Zipはそのようなファむルをアヌカむブに含めたせん。



-slpは非垞に䟿利なオプションです。 ラヌゞペヌゞモヌドでは、圧瞮速床が向䞊したす。 ただし、7-Zipはメモリ内の倧きなペヌゞを配垃しおいる間、圧瞮の開始時に䞀時停止がありたす。 7-Zipが倧きなペヌゞに察応できない堎合、通垞の小さなペヌゞが配眮されたす。 さらに、7-Zipが倧きなペヌゞを䜿甚する堎合、タスクマネヌゞャヌはプログラムによる実際のメモリ䜿甚量を衚瀺したせん。 この機胜はWindows 2003 / XP x64でのみ機胜したす。 システムの管理者暩限も必芁です。 この機胜の掚奚RAMサむズは3 GB以䞊です。 -slpモヌドを䜿甚するず、7-Zipがメモリブロックを割り圓おるずきにWindowsシステムが数秒間フリヌズする堎合がありたす。 WindowsがRAMから7-Zipに倧きなペヌゞを割り圓おようずするず、Windowsはこの時点で他のタスクを䞭断する堎合がありたす。 完党にシステムがフリヌズしたように芋えるかもしれたせんが、その操䜜は埩元され、配垃が成功した堎合、7-Zipはより速く動䜜したす。 他のタスクを䞭断しない限り、 -slpモヌドを䜿甚しないでください。 さらに、 -slpモヌドを䜿甚しお小さなデヌタセット100 MB未満を圧瞮するこずは意味がありたせん。 ただし、倧きな蟞曞でLZMAメ゜ッドを䜿甚しお倧きなデヌタセット300 MB以䞊を圧瞮するず、 -slpモヌドで5-10の速床向䞊が埗られたす。

-mmt = on-マルチスレッドモヌドを蚭定したす。 マルチプロセッサ/マルチコアシステムを䜿甚しおいる堎合、このキヌを䜿甚しお速床を䞊げるこずができたす。 7-Zipは、LZMA / LZMA2圧瞮ずBZip2圧瞮/解凍のみでマルチスレッドをサポヌトしたす。



-ms = off-゜リッドアヌカむブの䜜成を無効にしたす。 この堎合の圧瞮品質はもちろん䜎䞋したすが、いく぀かの非垞に重芁な利点がありたす-定期的にベヌスアヌカむブのデヌタを曎新しお差分バックアップのサむズを削枛できたす。アヌカむブが完了しおいないため、それ以䞊「ピンチ」する必芁はありたせん。 非固䜓アヌカむブは損傷に察しおより耐性があり、アヌカむブから抜出する時間ははるかに高速です。



シヌトを含める/陀倖する

デフォルトでは、2぀のタむプのリストが定矩されおいたす-むンクルヌドされたファむル/ディレクトリのリスト include_general.txt 、および2぀の陀倖リスト exclude_general.txt 、 exclude_regexp.txt 。



包含リストはUNCパスもサポヌトしおいたす。 ファむル/ディレクトリを䟋倖に配眮するには、パスが盞察パスである必芁がありたす。



たずえば、バックアップディレクトリがE\ foo \ barで、サブフォルダヌE\ foo \ bar \ somefolderを陀倖する堎合、exclude_general.txtにbar \ somefolderたたはbar \ somefolder \を远加する必芁がありたす



末尟にスラッシュのないパスは、ファむルたたはディレクトリを参照できたす。

Exclude_regexp.txtには、再垰的に衚瀺されるregexpによっお陀倖されたファむルが含たれたす。 *-任意の文字のシヌケンス、 -任意のキャラクタヌ。

7-Zipはシステムワむルドカヌドパヌサヌを䜿甚しないため、7 Zipの「任意のファむル」は「*」であり、「*。*」は拡匵子を持぀ファむルです。



そしお最埌に、スクリプト党䜓



 @ ECHO OFF REM Sources were found on http://sysadminwiki.ru/wiki/___Windows CD %~dp0 TITLE winfsbackup MODE CON: COLS=120 LINES=55 ECHO Setting vars... REM --- Definition block --- SET verboseLevel=1 SET tmpDir=D:\winfsbackup\tmp SET run_7z=D:\winfsbackup\7z\7za.exe SET run_pdate=D:\winfsbackup\pdate\pdate.exe FOR /F "usebackq" %%a IN (`%run_pdate% e`) DO (SET dm=%%a) FOR /F "usebackq" %%a IN (`%run_pdate% u`) DO (SET dw=%%a) FOR /F "usebackq" %%a IN (`%run_pdate% V`) DO (SET wn=%%a) SET LogDir=D:\winfsbackup\log SET Log=%LogDir%\general.log SET dDir=D:\winfsbackup\backup SET dlmDir=D:\winfsbackup\backup\old SET baseArch=%dDir%\general.7z SET IncludeList=lists\include_general.txt SET ExcludeList=lists\exclude_general.txt SET ExcludeRegexp=lists\exclude_regexp.txt SET updArch_dw=%dDir%\day_general_%dw%.7z SET updArch_wn=%dDir%\week_general_%wn%.7z IF %verboseLevel%==0 GOTO Main ECHO Verbose mode ON! ECHO Today is %wn% week of year, %dw% day of week. ECHO Full quarter backup will execute (if enabled) on 2, 19 and 36 week, friday. ECHO Temporary directory is %tmpDir% ECHO Now logging into %Log% ECHO Current backup directory is %dDir%, older backups stored into %dlmDir% :Main REM Here discribed conditions - in which case script will make new backup, update older one, etc REM You are free to change these conditions REM Make sure you envisaged all possible cases REM Actions here are not disigned to be active more than 1 at same time, excluding base condition REM If you want multiple conditions, you should edit it REM Base condition - full backup will be created if it is not exist IF NOT EXIST %baseArch% GOTO BaseArchive REM Command below turns on making full backup at 1'st day of every month, in other days - increments REM IF %dm% EQU 1 GOTO BaseArchive ELSE GOTO UpdateArchive REM This option enables updating full backup every month IF %dm% EQU 1 GOTO UpdateBase ELSE GOTO UpdateArchive REM Uncomment these 3 commands if you want to run full backup ~every quarter (2, 19, 36 week of year) REM IF NOT %wn%.%dw% EQU 02.5 GOTO UpdateArchive REM IF NOT %wn%.%dw% EQU 19.5 GOTO UpdateArchive REM IF NOT %wn%.%dw% EQU 36.5 GOTO UpdateArchive REM This option enables rewriting base archive every saturday with new files in order to decrease size of increments REM IF %dw% EQU 6 (GOTO UpdateBase) ELSE (GOTO UpdateArchive) REM Here you can place default action if conditions of previous ones were not executed. %run_pdate% "Z --- \A\c\t\i\o\n \w\a\s\ \n\o\t \s\e\l\e\c\t\e\d\! >> %Log% ECHO Warning! No one condition matching, check :Main block of script GOTO End :BaseArchive ECHO Clear %dlmDir% and move data of previous month to that dir... IF NOT EXIST %dlmDir%\nul MKDIR %dlmDir% DEL /Q %dlmDir%\* MOVE /Y %dDir%\* %dlmDir% 2> nul %run_pdate% "====== YB =======" > %Log% %run_pdate% "Z --- \S\t\a\r\t \t\o \c\r\e\a\t\e \n\e\w \a\r\c\h\i\v\e" >> %Log% ECHO Creating new backup %baseArch% %run_7z% a %baseArch% -w%tmpDir% -i@%IncludeList% -x@%ExcludeList% -xr@%ExcludeRegexp% -bsp2 -ssw -slp -scsWIN -mmt=on -mx3 -ms=off >> %Log% IF %ERRORLEVEL%==0 ( %run_pdate% "Z --- \E\x\i\t \c\o\d\e \0 \- \a\r\c\h\i\v\e \s\u\c\c\e\s\s\f\u\l\l\y \c\r\e\a\t\e\d!" >> %Log% ) ELSE ( IF %ERRORLEVEL%==1 ( %run_pdate% "Z --- \W\a\r\n\i\n\g\! \R\e\c\i\e\v\e\d\ \e\x\i\t \c\o\d\e \1" >> %Log% ) ELSE ( IF %ERRORLEVEL%==2 ( %run_pdate% "Z --- \E\x\i\t \c\o\d\e \2 \- \F\A\T\A\L \E\R\R\O\R\!" >> %Log% ) ELSE ( IF %ERRORLEVEL%==7 ( %run_pdate% "Z --- \E\x\i\t \c\o\d\e \7 \- \C\o\m\m\a\n\d \p\r\o\m\p\t \e\r\r\o\r!" >> %Log% ) ELSE ( IF %ERRORLEVEL%==8 ( %run_pdate% "Z --- \E\x\i\t \c\o\d\e \8 \- \N\o\t \e\n\o\u\g\h \m\e\m\o\r\y" >> %Log% ) ELSE ( ECHO Recieved error 255 - user stopped running process or exit code unknown! >> %Log% ) ) ) ) ) ) ) GOTO End :UpdateBase ECHO Refreshing base archive ECHO ******* ******* ******* >> %Log% %run_pdate% "Z --- \S\t\a\r\t \t\o \u\p\d\a\t\e \a\r\c\h\i\v\e" >> %Log% %run_7z% u %baseArch% -up0q1r2x1y2z1w0 -w%tmpDir% -i@%IncludeList% -x@%ExcludeList% -xr@%ExcludeRegexp% -bsp2 -ssw -slp -scsWIN -mmt=on -mx5 -ms=off >> %Log% IF %ERRORLEVEL%==0 ( %run_pdate% "Z --- \E\x\i\t \c\o\d\e \0 \- \u\p\d\a\t\e \s\u\c\c\e\s\s\f\u\l\l\y \f\i\n\i\s\h\e\d" >> %Log% ) ELSE ( IF %ERRORLEVEL%==1 ( %run_pdate% "Z --- \W\a\r\n\i\n\g\! \R\e\c\i\e\v\e\d\ \e\x\i\t \c\o\d\e \1" >> %Log% ) ELSE ( IF %ERRORLEVEL%==2 ( %run_pdate% "Z --- \E\x\i\t \c\o\d\e \2 \- \F\A\T\A\L \E\R\R\O\R\!" >> %Log% ) ELSE ( IF %ERRORLEVEL%==7 ( %run_pdate% "Z --- \E\x\i\t \c\o\d\e \7 \- \C\o\m\m\a\n\d \p\r\o\m\p\t \e\r\r\o\r!" >> %Log% ) ELSE ( IF %ERRORLEVEL%==8 ( %run_pdate% "Z --- \E\x\i\t \c\o\d\e \8 \- \N\o\t \e\n\o\u\g\h \m\e\m\o\r\y" >> %Log% ) ELSE ( ECHO Recieved error 255 - user stopped running process or exit code unknown! >> %Log% ) ) ) ) ) ) ) GOTO End :UpdateArchive ECHO Updtaing existing full backup ECHO ******* ******* ******* >> %Log% %run_pdate% "Z --- \S\t\a\r\t \t\o \u\p\d\a\t\e \a\r\c\h\i\v\e" >> %Log% IF %dw%==7 (SET updArch=%updArch_wn%) ELSE SET updArch=%updArch_dw% REM --- Check files existence --- IF EXIST %updArch% DEL /Q %updArch% REM --- Create incremental archive --- <nul set /p strTemp=Updating %baseArch% to incremental %updArch% archive ECHO. %run_7z% u %baseArch% -u- -up0q0r2x0y2z0w0!%updArch% -w%tmpDir% -i@%IncludeList% -x@%ExcludeList% -xr@%ExcludeRegexp% -bsp2 -ssw -slp -scsWIN -mmt=on -mx5 -ms=off >> %Log% IF %ERRORLEVEL%==0 ( %run_pdate% "Z --- \E\x\i\t \c\o\d\e \0 \- \u\p\d\a\t\e \s\u\c\c\e\s\s\f\u\l\l\y \f\i\n\i\s\h\e\d" >> %Log% ) ELSE ( IF %ERRORLEVEL%==1 ( %run_pdate% "Z --- \W\a\r\n\i\n\g\! \R\e\c\i\e\v\e\d\ \e\x\i\t \c\o\d\e \1" >> %Log% ) ELSE ( IF %ERRORLEVEL%==2 ( %run_pdate% "Z --- \E\x\i\t \c\o\d\e \2 \- \F\A\T\A\L \E\R\R\O\R\!" >> %Log% ) ELSE ( IF %ERRORLEVEL%==7 ( %run_pdate% "Z --- \E\x\i\t \c\o\d\e \7 \- \C\o\m\m\a\n\d \p\r\o\m\p\t \e\r\r\o\r!" >> %Log% ) ELSE ( IF %ERRORLEVEL%==8 ( %run_pdate% "Z --- \E\x\i\t \c\o\d\e \8 \- \N\o\t \e\n\o\u\g\h \m\e\m\o\r\y" >> %Log% ) ELSE ( ECHO Recieved error 255 - user stopped running process or exit code unknown! >> %Log% ) ) ) ) ) ) ) :End ECHO Done! %run_pdate% "Z --- \D\o\n\e" >> %Log% ping localhost -w 1000 -n 5 > nul
      
      





終わる代わりに



そのような決定に反察し、あらゆる皮類の頭字語やその他の「テリヌ䌁業」を䜿甚するために、あらゆる手ず足で「反察する」人々が垞に存圚したす。



゜リュヌションはタスクに芋合ったものである必芁があるず考えおいたす。私の堎合、タスクは人里離れた堎所にファむルショップのバックアップを眮くこずです。これは迅速に展開できたす-これはntbackupが私を倱望させたものです。



収集された䟋は、 YandexDiskで衚瀺できたす。



ダりンロヌド甚のzipアヌカむブもありたす。

建蚭的な批刀、アドバむス、さらにはテスト-ようこそ

ご枅聎ありがずうございたした すべおの長い皌働時間、安定したリンク、そしおもちろん、手元のバックアップ。



All Articles