همگام‌سازی فایل‌های سیستم شخصی با سرور سایت (Rsync)

?What is Rsync

30 آبان 1400
همگام سازی فایل های سیستم شخصی با سرور سایت (Rsync)

زمانی که در حال توسعه سایت خود هستیم، روی سیستم شخصی خودمان کار می کنیم اما نیاز است پس از تایید کدها آن ها را روی سرور شخصی خودمان قرار بدهیم. راه های مختلفی برای انجام این کار وجود دارد؛ به طور مثال FileZilla از نرم افزارهای مشهوری است که به شما اجازه می دهد انتقال فایل ها به سرور را به صورت دستی انجام بدهید اما استفاده از برنامه Rsync بسیار راحت تر و هوشمندانه تر است.

Rsync مخفف remote sync یا همگام سازی از راه دور است. این برنامه از الگوریتمی استفاده می کند که میزان داده های منتقل شده بین سیستم شما و سرور را تا حد ممکن کاهش می دهد. چطور؟ این برنامه فقط فایل هایی را که تغییر کرده اند منتقل می کند و با فایل هایی که دست نخورده اند کاری ندارد.

نصب Rsync برای کاربران ویندوز

این برنامه به صورت پیش فرض برای اکثر کاربران لینوکس نصب شده است بنابراین اگر از کاربران لینوکس هستید مستقیما به بخش «ساختار دستورات 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 (فروشگاه ماکروسافت) بروید.

محیط Microsoft store
محیط Microsoft store

در مرحله بعدی از فروشگاه ماکروسافت یک distro از لینوکس را انتخاب کنید. من نسخه ۲۰ از Ubuntu را پیشنهاد می کنم.

نصب ubuntu از Microsoft Store
نصب ubuntu از Microsoft Store

پس از کلیک روی دکمه get و شروع نصب، یک ترمینال برایتان باز می شود و از شما چند سوال ساده می پرسد. مثلا از شما می خواهد یک username و password انتخاب کنید.

به روز رسانی به WSL 2

حالا شما به عنوان کاربر ویندوز نسخه ۱ از 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

ساختار دستورات 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 برای همگام سازی ریموت است.

برای اجرای همگام سازی ریموت به دو چیز نیاز داریم:

  • دسترسی SSH به سرور مقصد
  • نصب بودن Rsync روی هر دو ماشین مبدا (srouce) و مقصد (destination)

پس از آنکه دسترسی به هر دو را به دست آوردید باید به فکر همگام سازی باشیم. اگر بخواهیم پوشه 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 بسیار ساده است اما این استفاده با تنظیمات پیش فرض انجام شد. 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

نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.