زمانی که در حال توسعه سایت خود هستیم، روی سیستم شخصی خودمان کار می کنیم اما نیاز است پس از تایید کدها آن ها را روی سرور شخصی خودمان قرار بدهیم. راه های مختلفی برای انجام این کار وجود دارد؛ به طور مثال FileZilla از نرم افزارهای مشهوری است که به شما اجازه می دهد انتقال فایل ها به سرور را به صورت دستی انجام بدهید اما استفاده از برنامه Rsync بسیار راحت تر و هوشمندانه تر است.
Rsync مخفف remote sync یا همگام سازی از راه دور است. این برنامه از الگوریتمی استفاده می کند که میزان داده های منتقل شده بین سیستم شما و سرور را تا حد ممکن کاهش می دهد. چطور؟ این برنامه فقط فایل هایی را که تغییر کرده اند منتقل می کند و با فایل هایی که دست نخورده اند کاری ندارد.
این برنامه به صورت پیش فرض برای اکثر کاربران لینوکس نصب شده است بنابراین اگر از کاربران لینوکس هستید مستقیما به بخش «ساختار دستورات Rsync» مراجعه کنید.
اما اگر از کاربران ویندوز هستید باید آن را جداگانه نصب کنید. برای این کار باید Windows Subsystem for Linux یا به اختصار WSL را روی ویندوز ۱۰ نصب کنید. اگر از کاربران ویندوز های قدیمی تر مانند ویندوز ۷ هستید بهتر است از همان FileZilla استفاده نمایید.
برای نصب WSL دو راه وجود دارد:
روش خودکار ساده است اما باید در Windows Insiders Program عضو شوید بنابراین ممکن است بسیاری از شما آن را نپسندید. در عین حال اگر این روش را دوست دارید، پس از عضویت در برنامه Windows Insiders Program ترمینال PowerShell را به صورت ادمین باز کرده و دستور wsl --install را در آن اجرا کنید.
روش دستی قابلیت های بیشتری به شما می دهد و نیازی به عضویت ندارد بنابراین من شخصا آن را ترحیج می دهم. برای نصب دستی WSL ابتدا PowerShell را به صورت admin باز کرده و دستور زیر را در آن اجرا کنید:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
با انجام این کار نسخه ۱ از WSL نصب می شود. حالا می توانید سیستم خود را ریستارت کنید و به Microsoft Store (فروشگاه ماکروسافت) بروید.
در مرحله بعدی از فروشگاه ماکروسافت یک distro از لینوکس را انتخاب کنید. من نسخه ۲۰ از Ubuntu را پیشنهاد می کنم.
پس از کلیک روی دکمه get و شروع نصب، یک ترمینال برایتان باز می شود و از شما چند سوال ساده می پرسد. مثلا از شما می خواهد یک username و password انتخاب کنید.
حالا شما به عنوان کاربر ویندوز نسخه ۱ از WSL را نصب دارید. به روز رسانی آن به نسخه ۲ کمی دردسر دارد و سیستم شما باید از فناوری مجازی سازی پشتیبانی کند بنابراین از نظر من نسخه ۱ کافی است. در عین حال من توضیح مختصری در این باره می دهم. اگر دوست دارید درباره به روز رسانی به نسخه ۲ به صورت مفصل مطالعه کنید، به این مقاله از وب سایت ماکروسافت مراجعه نمایید.
برای به روز رسانی به نسخه دوم WSL باید بدانید که نسخه های 18362 و قدیمی تر (یا 19041 و قدیمی تر برای سیستم های ARM64) ویندوز ۱۰ از WSL 2 پشتیبانی نمی کنند بنابراین باید ابتدا ویندوز خود را به روز رسانی کنید. در مرحله بعدی باید قابلیت Virtual Machine Platform از ویندوز را فعال کنید که یعنی سیستم شما باید از قابلیت مجازی سازی پشتیبانی کند. بار دیگر PowerShell را به صورت admin باز کرده و دستور زیر را در آن اجرا کنید:
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
مطمئن باشید که سیستم شما به اینترنت متصل است. حالا سیستم خود را ریستارت کرده و منتظر اتمام فرآیند به روز رسانی باشید.
در مرحله بعدی بهتر است کرنل لینوکس خود را به روز رسانی کنید. برای انجام این کار ابتدا به این لینک رفته و فایل مورد نظر را دانلود کنید. با کلیک روی فایل دانلود شده فرآیند به روز رسانی شروع می شود. آخرین مرحله نیز انتخاب WSL 2 به عنوان WSL پیش فرض است. برای انجام این کار باز هم PowerShell را به صورت admin باز کرده و دستور زیر را اجرا کنید:
wsl --set-default-version 2
از این به بعد WSL 2 برای شما در نظر گرفته می شود اما توجه داشته باشید که نسخه ۱ برای کار ما مناسب و کافی است و الزامی در به روز رسانی آن وجود ندارد.
چه از WSL 1 و چه از WSL 2 استفاده می کنید باید این بخش را مطالعه نمایید.
ابتدا ترمینال Git for Windows را نصب می کنیم تا بتوانیم دستورات مناسب لینوکس را در آن اجرا کنیم. در مرحله آخر برنامه Rsync را از این لینک دانلود نمایید و از برنامه هایی مانند 7-zip یا winrar برای استخراج آن از حالت فشرده استفاده کنید. درون آن یک فایل rsync.exe را خواهید دید که باید آن را به مسیر C:\Program Files\Git\usr\bin منتقل کنید. حالا اگر ترمینال git for windows را باز کنید می توانید از Rsync استفاده نمایید.
ساختار دستورات Rsync بسیار ساده است به صورتی که مانند دستورات ssh عمل می کند. ما می خواهیم برای تست این برنامه دو پوشه به نام های dir1 و dir2 بسازیم و سپس درون پوشه اول (dir1) صد فایل تستی ایجاد کنیم. برای این کار دستورات زیر را به ترتیب در ترمینال خود اجرا کنید:
mkdir dir1 mkdir dir2 touch dir1/file{1..100}
دستور mkdir مسئول ساخت پوشه در لینوکس است و دستور touch مسئول ساخت فایل است. من گفته ام که فایل هایی با نام file1 تا file100 را در پوشه dir1 ایجاد کند. حالا اگر بخواهیم محتویات پوشه dir1 را چک کنیم می توانیم از دستور ls استفاده کنیم:
ls dir1
نتیجه به شکل زیر خواهد بود:
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90 file10 file19 file28 file37 file46 file55 file64 file73 file82 file91 file100 file2 file29 file38 file47 file56 file65 file74 file83 file92 file11 file20 file3 file39 file48 file57 file66 file75 file84 file93 file12 file21 file30 file4 file49 file58 file67 file76 file85 file94 file13 file22 file31 file40 file5 file59 file68 file77 file86 file95 file14 file23 file32 file41 file50 file6 file69 file78 file87 file96 file15 file24 file33 file42 file51 file60 file7 file79 file88 file97 file16 file25 file34 file43 file52 file61 file70 file8 file89 file98 file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
اما می دانیم که پوشه dir2 خالی است. اگر بخواهیم محتویات این دو پوشه با هم همگام سازی شوند باید دستور زیر را در ترمینال اجرا کنیم:
rsync -r dir1/ dir2
فلگ r- به معنی recursive (بازگشتی) است که برای همگام سازی پوشه ها ضروری است. من در دستور بالا گفته ام تمام محتویات dir1 را با پوشه dir2 یکسان کن! دقت کنید که من در انتهای dir1 از علامت / استفاده کرده ام. اضافه شدن علامت / به انتهای dir1 به معنی «محتویات dir1» است. اگر علامت / را از کد بالا حذف کند، خود پوشه dir1 درون پوشه dir2 کپی می شود و آدرسی به شکل زیر به وجود می آورد:
/dir2/dir1/[files]
طبیعتا چنین چیزی مد نظر ما نیست.
در ضمن فلگی وجود دارد که بیشتر از r- استفاده می شود و آن فلگ a- است:
rsync -a dir1/ dir2
این فلگ مخفف archive (آرشیو) است و به سیستم می گوید که symbolic links، فایل های خاص، زمان تغییر فایل ها، صاحب فایل ها، سطوح دسترسی و دیگر جزئیات مربوط به فایل ها را در هنگام فرآیند همگام سازی کاملا حفظ کند. انتخاب هر کدام از این فلگ ها به خود شما و موقعیت شما بستگی دارد اما معمولا از a- استفاده می شود.
اگر می خواهید قبل از اجرای دستور Rsync نتیجه شبیه سازی شده آن را مشاهده کنید باید از فلگ n- استفاده کنید. همچنین اضافه کردن فلگ v- باعث نمایش نتیجه به صورت verbose (مفصل) می شود که مورد نیاز ما است:
rsync -anv dir1/ dir2
با اجرای این دستور نتیجه ای به شکل زیر دریافت می کنید:
sending incremental file list ./ file1 file10 file100 file11 file12 file13 file14 file15 file16 file17 file18 file19 file2 file20 file21 file22 file23 file24 file25 file26 file27 file28 file29 file3 file30 file31 file32 file33 file34 file35 file36 file37 file38 file39 file4 file40 file41 file42 file43 file44 file45 file46 file47 file48 file49 file5 file50 file51 file52 file53 file54 file55 file56 file57 file58 file59 file6 file60 file61 file62 file63 file64 file65 file66 file67 file68 file69 file7 file70 file71 file72 file73 file74 file75 file76 file77 file78 file79 file8 file80 file81 file82 file83 file84 file85 file86 file87 file88 file89 file9 file90 file91 file92 file93 file94 file95 file96 file97 file98 file99 sent 1,674 bytes received 319 bytes 3,986.00 bytes/sec total size is 0 speedup is 0.00 (DRY RUN)
در حال حاضر هیچ فایلی به dir2 اضافه نمی شود چرا که کد بالا یک DRY RUN یا کد شبیه سازی شده است. ما از نتیجه بالا می بینیم که به جای پوشه dir1 تمام فایل ها به dir2 کپی خواهند شد بنابراین مشکلی نخواهیم داشت.
حالا بیایید دستور را بدون / شبیه سازی کنیم:
rsync -anv dir1 dir2
با اجرای این دستور نتیجه زیر را می گیرید:
sending incremental file list dir1/ dir1/file1 dir1/file10 dir1/file100 dir1/file11 // بقیه گزارش
همانطور که مشاهده می کنید این بار خود پوشه dir1 نیز در حال کپی شدن است بنابراین این دستور اشتباه است. کاربرد شبیه سازی دستورات Rsync همین است که از قبل نتیجه آن را مشاهده کنید.
همگام سازی ریموت یعنی همگام سازی سیستم شخصی خودتان با یک سرور یا سیستم دیگر! کاری که در بخش قبلی انجام دادیم همگام سازی محلی بود چرا که مبدا و مقصد، دو پوشه از سیستم خودمان بودند اما استفاده اصلی از Rsync برای همگام سازی ریموت است.
برای اجرای همگام سازی ریموت به دو چیز نیاز داریم:
پس از آنکه دسترسی به هر دو را به دست آوردید باید به فکر همگام سازی باشیم. اگر بخواهیم پوشه dir1 از سیستم خودمان را به سرور مقصد منتقل کنیم باید چنین دستوری را اجرا نماییم:
rsync -a ~/dir1 username@remote_host:destination_directory
دقت کنید که در این دستور می خواهیم خود پوشه dir1 را به سرور منتقل کنیم بنابراین دیگر علامت / را در انتهایش قرار نداده ام. به جای username باید نام کاربری خود در سیستم مقصد را وارد کنید. همچنین به جای remote_host باید آدرس IP سرور مقصد را قرار داده و به جای destination_directory آدرس مورد نظرتان در آن سرور را تایپ کنید.
دستور بالا یک دستور push است چرا که فایل ها را از سیستم محلی به یک سرور ریموت ارسال کرده ایم. خلاف این دستور pull است که در آن فایل ها را از سرور ریموت به سیستم محلی خودمان منتقل می کنیم:
rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine
به جای place_to_sync_on_local_machine باید آدرسی را قرار بدهید که می خواهید فایل ها در آنجا قرار بگیرند. با این حساب حتما متوجه شده اید که در هنگام استفاده از Rsync، سیستم مبدا همیشه ابتدا می آید و سیستم مقصد به عنوان آرگومان دوم پاس داده می شود.
در بخش های قبلی مشاهده کردید که استفاده از Rsync بسیار ساده است اما این استفاده با تنظیمات پیش فرض انجام شد. Rsync گزینه های بسیار زیادی برای تنظیم جوانب خاص خود را دارد و ما می خواهیم در این بخش با آن ها آشنا شویم.
در صورتی که در حال انتقال فایل هایی هستید که از قبل فشرده سازی نشده اند (مثلا فایل های متنی که به صورت عادی در سیستم شما هستند) می توانید با اضافه کردن فلگ z آن ها را فشرده سازی کرده و سپس به سرور مقصد منتقل کنید. این کار باعث می شود حجم کمتری در شبکه منتقل شود بنابراین سرعت بیشتر می شود:
rsync -az source destination
طبیعتا به جای source آدرس مبدا و به جای destination آدرس مقصد را قرار می دهیم (همان چیزی که در بخش قبلی توضیح دادم).
دو فلگ دیگر به نام های progress-- و partial-- نیز وجود دارند. فلگ progress-- یک نوار پیشرفت (progress bar) را در اختیار شما قرار می دهد تا بدانید چه مقدار از داده ها منتقل شده و چه مقدار باقی مانده است. partial-- نیز به شما اجازه می دهد داده ها را به صورت بخش بخش شده منتقل کنید تا اگر در وسط کار اینترنت شما قطع شد، بعدا بتوانید کار را از همان جایی که قطع شده است ادامه بدهید. در صورتی که این فلگ را پاس ندهید و اینترنت شما قطع شده باشید مجبور به انتقال همه چیز از صفر هستید. خوشبختانه فلگ P- هر دوی این فلگ ها را به صورت یکجا جمع آوری کرده است:
rsync -azP source destination
با پاس دادن P مطمئن می شویم که هم نوار پیشرفت را دریافت می کنیم و هم می توانیم انتقال را از بخش قطع شده ادامه بدهیم. با اجرای دستور بالا نتیجه ای شبیه به نتیجه زیر را دریافت می کنیم:
sending incremental file list ./ file1 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101) file10 0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101) file100 0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=97/101) file11 0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=96/101) // دیگر فایل ها
در ضمن اگر دوباره همین دستور را اجرا کنیم نتیجه متفاوتی را می گیریم:
rsync -azP source destination
نتیجه:
sending incremental file list sent 818 bytes received 12 bytes 1660.00 bytes/sec total size is 0 speedup is 0.00
آیا دلیل آن را می دانید؟ همانطور که گفتم الگوریتم Rsync به صورت هوشمند فایل ها را بررسی می کند و فقط فایل های تغییر پیدا کرده را منتقل می کنید. در این مثال هنوز هیچ فایلی تغییر نکرده است بنابراین هیچ دلیلی برای انتقال دوباره فایل ها وجود ندارد.
مسئله بعدی حذف فایل ها است. اگر می گوییم دو پوشه واقعا همگام سازی شده اند یعنی باید تغییرات در یکی باعث تغییرات در دیگری بشود. مثلا اگر یک فایل در یکی حذف شد در دیگری نیز حذف بشود. مسئله اینجاست که Rsync به صورت پیش فرض و از جانب احتیاط هیچ فایلی را حذف نمی کند. شما می توانید این مسئله را با پاس دادن فلگ delete-- حل کنید:
rsync -a --delete source destination
هشدار: همیشه قبل از پاس دادن فلگ delete-- یک دستور dry run (شبیه سازی شده) را اجرا کنید تا به اشتباه فایل های مهم را حذف نکنید.
همچنین اگر می خواهید بعضی از فایل ها یا پوشه ها در فرآیند همگام سازی نادیده گرفته شوند باید از فلگ exclude-- برای مشخص کردن آن ها استفاده کنید:
rsync -a --exclude=pattern_to_exclude source destination
شما باید به جای pattern_to_exclude یک الگو را قرار بدهید که با فایل های نادیده گرفته شده مطابقت داشته باشد. مثلا اگر می خواهید پوشه ای با نام data نادیده گرفته شود دستور بالا را بدین شکل اجرا می کنیم:
rsync -a --exclude=/data source destination
البته در برخی از اوقات این الگو باعث انتخاب فایل هایی می شود که شاید قصد نادیده گرفتنشان را نداشته اید. در این حالت از فلگ include-- استفاده کنید تا فایل هایی که حتما باید در فرآیند همگام سازی باشند را مشخص کنید:
rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination
در نهایت گزینه backup-- را داریم که به شما اجازه می دهد از یک عملیات بکاپ تهیه کنید. هر زمانی که بخواهید از فلگ backup-- استفاده نمایید باید فلگ backup-dir-- را نیز پاس بدهید چرا که این فلگ مشخص می کند فایل بکاپ در چه مسیری قرار بگیرد:
rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination
امیدوارم این مقاله به درک بهتر شما از همگام سازی فایل ها بین سرور و سیستم شخصی تان کمک کرده باشد.
منبع: وب سایت digitalocean
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.