গাইড

rsync: ফাইল ও ব্যাকআপ সিঙ্ক্রোনাইজেশনের উদাহরণ Linux-এ

হালনাগাদ: · Skillaria.Top

rsync ফাইল কপি ও সিঙ্ক করে স্থানীয়ভাবে এবং SSH-এর মাধ্যমে, শুধু পরিবর্তিত অংশ পাঠিয়ে। মৌলিক কমান্ড — rsync -avz উৎস/ user@host:/পথ/: -a অনুমতি ও সময় রাখে, -v ফাইলের তালিকা দেখায়, -z ট্রাফিক সংকুচিত করে; --delete গন্তব্যকে উৎসের হুবহু কপি বানায়, আর -n আগে কোনো পরিবর্তন ছাড়াই ফলাফল যাচাই করতে দেয়।

rsync হলো Linux-এর স্ট্যান্ডার্ড ফাইল কপি ও সিঙ্ক্রোনাইজেশনের টুল: স্থানীয়ভাবে, ডিস্কের মধ্যে এবং SSH-এর মাধ্যমে সার্ভারের মধ্যে। cp ও scp-এর সঙ্গে এর প্রধান পার্থক্য হলো, এটি শুধু যা বদলেছে তাই পাঠায়, তাই বড় ডিরেক্টরির পুনরায় সিঙ্ক কয়েক সেকেন্ডে হয়ে যায়। নিচে সাধারণ কাজের rsync উদাহরণ: প্রজেক্ট সার্ভারে কপি, ডিরেক্টরির মিরর, এক্সক্লুড, স্ন্যাপশটসহ ব্যাকআপ এবং শিডিউলে চালানো।

সিনট্যাক্স ও সবচেয়ে দরকারি ফ্ল্যাগ

কমান্ডের সাধারণ রূপ:

rsync [অপশন] উৎস... গন্তব্য

উৎস ও গন্তব্য হতে পারে স্থানীয় পথ, অথবা user@host:/পথ আকারের দূরবর্তী পথ। দুটির একটি অবশ্যই স্থানীয় হতে হবে: rsync সরাসরি দুটি দূরবর্তী মেশিনের মধ্যে কপি করে না।

ফ্ল্যাগকাজ
-aআর্কাইভ মোড: পুনরাবৃত্তিমূলকভাবে, অনুমতি, মালিক, গ্রুপ, পরিবর্তনের সময় ও সিম্বলিক লিংক বজায় রেখে (এটি -rlptgoD-এর সমান)
-vযে ফাইলগুলো পাঠানো হচ্ছে তার তালিকা দেখানো
-zনেটওয়ার্কে পাঠানোর সময় ডেটা সংকুচিত করা
-hআকার সহজ রূপে (K, M, G)
-P--partial --progress-এর সমান: অগ্রগতি দেখা ও বাধাগ্রস্ত ফাইল পুনরায় শুরু
-n, --dry-runড্রাই রান: কী করা হবে দেখানো, কিছু না বদলিয়ে
--deleteগন্তব্যে এমন ফাইল মুছে ফেলা যা উৎসে নেই
--excludeপ্যাটার্ন মেলে এমন ফাইল কপি না করা
-eদূরবর্তী শেল ঠিক করা, যেমন -e "ssh -p 2222"
-H, -A, -Xহার্ড লিংক, ACL ও বর্ধিত অ্যাট্রিবিউট রাখা (এগুলো -a-এর অংশ নয়)

বাস্তবে দশটির মধ্যে নয়টি ক্ষেত্রে স্থানীয়ভাবে rsync -avh এবং নেটওয়ার্কে rsync -avzh-ই যথেষ্ট।

পথের শেষের স্ল্যাশ: প্রধান ফাঁদ

নতুনদের সবচেয়ে সাধারণ ভুল উৎসের শেষের স্ল্যাশ নিয়ে। এর ওপর নির্ভর করে কপি হবে ডিরেক্টরি নিজে, নাকি শুধু তার ভেতরের জিনিস।

# ডিরেক্টরি project কপি করে /backup-এর ভেতরে → হবে /backup/project/...
rsync -av project /backup/

# project-এর ভেতরের জিনিস কপি করে /backup-এ → ফাইলগুলো সরাসরি /backup/-এ যাবে
rsync -av project/ /backup/

সহজ মনে রাখার উপায়: উৎসের শেষে স্ল্যাশ মানে «এই ডিরেক্টরির ভেতরের জিনিস»। গন্তব্যের স্ল্যাশে কিছু আসে যায় না। সন্দেহ হলে -n যোগ করে দেখুন rsync কোন পথ তৈরি করতে যাচ্ছে।

স্থানীয় কপি

অগ্রগতি দেখিয়ে একটি ডিরেক্টরি বাইরের ডিস্কে কপি করা:

rsync -avhP ~/photos/ /mnt/usb/photos/

একই কমান্ড আবার চালালে সবকিছু নতুন করে কপি হয় না: rsync ফাইলের আকার ও পরিবর্তনের সময় তুলনা করে, শুধু নতুন ও বদলানো ফাইল পাঠায়। শেষে দেখা যায় আসলে কতটুকু ডেটা গেছে:

sending incremental file list
2026/10/IMG_2041.jpg
          4.12M 100%   38.40MB/s    0:00:00 (xfr#1, to-chk=0/1534)

sent 4.13M bytes  received 9.25K bytes  2.76M bytes/sec
total size is 6.82G  speedup is 1,648.21

speedup দেখায়, সম্পূর্ণ কপির তুলনায় কত গুণ কম ডেটা পাঠানো হয়েছে।

SSH-এর মাধ্যমে rsync: সার্ভারে কপি ও ফিরিয়ে আনা

দূরবর্তী পথের জন্য rsync ডিফল্টভাবে SSH ব্যবহার করে, তাই আলাদা কিছু সেটআপ করতে হয় না — শুধু সাধারণ ssh লগইন কাজ করতে হবে। কী (key) দিয়ে সবচেয়ে সুবিধা: তখন পাসওয়ার্ড চাওয়া হয় না এবং কমান্ড cron-এ বসানো যায়।

# সাইট সার্ভারে আপলোড করা
rsync -avz ./site/ deploy@203.0.113.10:/var/www/site/

# সার্ভার থেকে লগ নিজের মেশিনে নামানো
rsync -avz deploy@203.0.113.10:/var/log/nginx/ ./nginx-logs/

# অস্বাভাবিক পোর্টে SSH এবং নির্দিষ্ট কী দিয়ে
rsync -avz -e "ssh -p 2222 -i ~/.ssh/deploy_key" ./site/ deploy@203.0.113.10:/var/www/site/

rsync দুটি মেশিনেই ইনস্টল থাকতে হবে: দূরবর্তী দিকে এটি SSH-এর মাধ্যমে চালু হয়। না থাকলে দেখাবে rsync: command not found — প্যাকেজটি ইনস্টল করুন (sudo apt install rsync বা sudo dnf install rsync)।

হোস্ট ~/.ssh/config-এ নামের সাথে লেখা থাকলে rsync সেটিও বোঝে: rsync -avz ./site/ prod:/var/www/site/।

সার্ভারে root অধিকার লাগলে

গন্তব্যের ফাইলের মালিক root হলে, কিন্তু আপনি সাধারণ ব্যবহারকারী হিসেবে লগইন করেন, দূরবর্তী rsync-কে sudo দিয়ে চালানো যায়:

rsync -avz --rsync-path="sudo rsync" ./conf/ admin@server:/etc/myapp/

এর জন্য সার্ভারে sudoers-এ rsync-এর জন্য পাসওয়ার্ড ছাড়া অনুমতি থাকতে হবে, নইলে কমান্ড ইনপুটের অপেক্ষায় ঝুলে থাকবে।

ডিরেক্টরির মিরর: --delete

ডিফল্টভাবে rsync শুধু যোগ ও আপডেট করে, কিছু মোছে না। গন্তব্যকে উৎসের হুবহু কপি বানাতে --delete দরকার:

rsync -avh --delete ~/projects/ /mnt/backup/projects/

এটি শক্তিশালী ও বিপজ্জনক ফ্ল্যাগ। পথে ভুল (যেমন খালি উৎস বা ভুলে যাওয়া স্ল্যাশ) গন্তব্যের ডেটা মুছে দিতে পারে। তাই নিয়ম একটাই: --delete-সহ যেকোনো কমান্ড প্রথমে -n-সহ চালান।

$ rsync -avhn --delete ~/projects/ /mnt/backup/projects/
sending incremental file list
deleting old-app/README.md
deleting old-app/
app/main.py

sent 1.20K bytes  received 64 bytes  2.53K bytes/sec
total size is 18.4M  speedup is 14,554.39 (DRY RUN)

deleting লাইনগুলো দেখায় কী মুছে যাবে। সব ঠিক থাকলে -n ছাড়া চালান।

কাজের আরও দুটি রূপ: --delete-after ফাইল পাঠানোর পরে মোছে (গন্তব্য বেশি সময় সম্পূর্ণ থাকে), আর --backup --backup-dir=/mnt/backup/deleted-$(date +%F) মোছে না, বরং মুছতে বা বদলাতে হওয়া ফাইলগুলো আলাদা ডিরেক্টরিতে সরিয়ে রাখে।

এক্সক্লুড ও ইনক্লুড: --exclude ও --include

ডেপ্লয় ও ব্যাকআপে অস্থায়ী ফাইল, নির্ভরতা (dependencies) ও গোপন তথ্য বাদ দেওয়া স্বাভাবিক অভ্যাস।

# কয়েকটি প্যাটার্ন
rsync -avz --exclude='.git/' --exclude='node_modules/' --exclude='*.log' ./app/ server:/srv/app/

# প্যাটার্ন একটি ফাইল থেকে
rsync -avz --exclude-from='.rsyncignore' ./app/ server:/srv/app/

.rsyncignore ফাইল হলো সরল তালিকা, প্রতি লাইনে একটি প্যাটার্ন:

.git/
node_modules/
*.log
.env
tmp/

প্যাটার্ন কীভাবে কাজ করে:

  • শুরুতে স্ল্যাশ ছাড়া প্যাটার্ন (*.log) যেকোনো গভীরতায় মেলে।
  • শুরুতে স্ল্যাশ থাকা প্যাটার্ন (/tmp/) স্থানান্তরের মূলে বাঁধা — শুধু উপরের স্তরের tmp বাদ দেয়।
  • শেষে স্ল্যাশ (cache/) মানে «শুধু ডিরেক্টরি»।
  • নিয়মগুলো ক্রমানুসারে পরীক্ষা হয়, প্রথম মেলাটি কার্যকর হয়।

এই নিয়ম থেকেই একটি কৌশল পাওয়া যায় — «শুধু দরকারিটুকু কপি করা»: আগে অনুমতি দিন, তারপর বাকি সবকিছু বাদ দিন।

# শুধু .conf ফাইল কপি, ডিরেক্টরির কাঠামো বজায় রেখে
rsync -av --include='*/' --include='*.conf' --exclude='*' /etc/ ./etc-confs/

এখানে --include='*/' দরকার, যাতে rsync সব সাবডিরেক্টরিতে ঢুকতে পারে। খালি ডিরেক্টরি তৈরি এড়াতে যোগ করুন --prune-empty-dirs (-m)।

rsync দিয়ে ব্যাকআপ

সাধারণ দৈনিক কপি

হোম ডিরেক্টরির সহজ ব্যাকআপ দ্বিতীয় ডিস্কে:

rsync -aH --delete --exclude='.cache/' /home/alice/ /mnt/backup/alice/

এই পদ্ধতির সীমা: শুধু একটি সংস্করণ থাকে। ফাইল ভুলভাবে নষ্ট হলে এবং ব্যাকআপ সেটি ইতিমধ্যে সিঙ্ক করে ফেললে পুরোনো সংস্করণ হারিয়ে যায়।

--link-dest দিয়ে ইনক্রিমেন্টাল স্ন্যাপশট

--link-dest ফ্ল্যাগ এই সমস্যা প্রায় বিনা খরচে সমাধান করে। অপরিবর্তিত ফাইল কপি হয় না, বরং আগের স্ন্যাপশটের ফাইলের হার্ড লিংক হিসেবে তৈরি হয়। প্রতিটি স্ন্যাপশট দেখতে পূর্ণ কপির মতো, কিন্তু জায়গা নেয় শুধু পরিবর্তনগুলো।

#!/bin/bash
set -euo pipefail

SRC="/home/alice/"
DEST="/mnt/backup/snapshots"
TODAY="$(date +%F)"

mkdir -p "$DEST"
rsync -aH --delete \
  --exclude='.cache/' \
  --link-dest="$DEST/latest" \
  "$SRC" "$DEST/$TODAY"

ln -sfn "$DEST/$TODAY" "$DEST/latest"

প্রথমবার চালানোর সময় latest ডিরেক্টরি থাকে না — rsync একটি সতর্কবার্তা দিয়ে পূর্ণ কপি বানাবে, এটি স্বাভাবিক। পুরোনো স্ন্যাপশট সাধারণ rm -rf দিয়ে মোছা যায়: যেসব ফাইলে অন্য স্ন্যাপশট লিংক করে আছে সেগুলো হারাবে না।

৩০ দিনের বেশি পুরোনো স্ন্যাপশট মুছতে:

find /mnt/backup/snapshots -maxdepth 1 -type d -name '20*' -mtime +30 -exec rm -rf {} +

একটি সার্ভারের ব্যাকআপ অন্য মেশিনে

দিকটি বেছে নেওয়া ভালো «ব্যাকআপ সার্ভার থেকে কাজের সার্ভারে»: ব্যাকআপ মেশিন নিজে ডেটা টেনে আনে, আর কাজের সার্ভারের কপিতে প্রবেশাধিকার থাকে না। সেটি হ্যাক হলেও ব্যাকআপ অক্ষত থাকে।

rsync -azH --delete -e "ssh -i /root/.ssh/backup_key" \
  backup@web01:/var/www/ /srv/backups/web01/www/

মনে রাখবেন, ডেটাবেস এভাবে কপি করা যায় না: চালু ডেটাবেসের ফাইল কপির সময় অসংগত থাকে। আগে ডাম্প নিন (mysqldump, pg_dump), আর rsync শুধু তৈরি ডাম্প ফাইলটি স্থানান্তর করুক।

cron দিয়ে শিডিউল

ব্যাকআপ স্ক্রিপ্ট crontab -e দিয়ে cron-এ বসানো হয়:

# প্রতিদিন 03:15-এ, আউটপুট লগে
15 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

cron-এর ব্যাকআপ সত্যিই কাজ করছে কিনা নিশ্চিত করতে যা দেখবেন:

  • স্ক্রিপ্টে পুরো পথ ব্যবহার করুন: cron-এর PATH সীমিত এবং বর্তমান ডিরেক্টরিও আলাদা।
  • SSH কী-তে পাসওয়ার্ড না থাকে, এবং হোস্ট আগে থেকেই known_hosts-এ থাকে — নইলে rsync হোস্টের সত্যতা নিয়ে প্রশ্নে আটকে থাকবে।
  • স্ক্রিপ্ট রিটার্ন কোড যাচাই করুক: rsync সফলে 0 দেয়, কিছু ফাইল না গেলে 23, চলাকালীন ফাইল উধাও হলে 24।
  • একই সময়ে দুটি কপি চালু হওয়া ঠেকায় flock: flock -n /tmp/backup.lock /usr/local/bin/backup.sh।

cron-এর বদলে systemd টাইমারও ব্যবহার করা যায় — তা আউটপুট জার্নালে লেখে, এবং ফলাফল দেখা journalctl দিয়ে সুবিধাজনক।

বড় স্থানান্তরের জন্য উপযোগী অপশন

কাজঅপশন
গতি সীমিত করা, যাতে চ্যানেল ভরে না যায়--bwlimit=5M
বাধার পর বড় ফাইল পুনরায় শুরু করা-P (বা --partial)
ফাইলের তালিকার বদলে সামগ্রিক অগ্রগতি--info=progress2
সময়ের বদলে বিষয়বস্তু (checksum) দিয়ে তুলনা-c (--checksum), ধীর
গন্তব্যের নতুন ফাইল না ছোঁয়া-u (--update)
বিদ্যমান ফাইল না লেখা--ignore-existing
স্থানান্তরের পর উৎসের ফাইল মুছে ফেলা (মুভ)--remove-source-files
শেষে বিস্তারিত পরিসংখ্যান--stats

সাধারণ ত্রুটি ও সমাধান

  • লেখার সময় Permission denied — ব্যবহারকারীর গন্তব্য ডিরেক্টরিতে অনুমতি নেই। ডিরেক্টরির মালিক দেখুন, অথবা --rsync-path="sudo rsync" ব্যবহার করুন।
  • ফাইল প্রতিবার নতুন করে কপি হয় — পরিবর্তনের সময় রাখা হচ্ছে না। নিশ্চিত করুন -a বা -t আছে; FAT/exFAT-এ যোগ করুন --modify-window=2, কারণ এই ফাইল সিস্টেম সময় রাখে দুই সেকেন্ডের নির্ভুলতায়।
  • chown বা chgrp ত্রুটি ফ্ল্যাশ ড্রাইভ বা নেটওয়ার্ক ফোল্ডারে কপির সময় — ফাইল সিস্টেম মালিক সমর্থন করে না। -a-এর বদলে -rlt লিখুন।
  • অতিরিক্ত স্তর /backup/project/project — উৎসের শেষের স্ল্যাশে ভুল হয়েছে।
  • connection unexpectedly closed — SSH-এর সমস্যা, অথবা দূরবর্তী দিকে rsync ইনস্টল নেই। সাধারণ ssh দিয়ে লগইন ও সার্ভারে rsync আছে কিনা দেখুন।

সারসংক্ষেপ

দৈনন্দিন কাজের জন্য কয়েকটি কমান্ড মনে রাখলেই হয়: SSH-এর মাধ্যমে কপির জন্য rsync -avz src/ host:/dst/, মিররের জন্য --delete ও আগে ড্রাই রান -n, অপ্রয়োজনীয় বাদ দিতে --exclude, আর স্ন্যাপশটসহ ব্যাকআপের জন্য --link-dest। উৎসের শেষের স্ল্যাশে নজর রাখুন — তাহলে rsync মেশিনের মধ্যে ফাইল স্থানান্তরের সবচেয়ে নির্ভরযোগ্য উপায় হয়ে উঠবে। সিঙ্ক্রোনাইজেশন ও ব্যাকআপ Linux কোর্সে হাতে-কলমে শেখানো হয়।

সাধারণ প্রশ্ন

rsync কেন scp-এর চেয়ে ভালো?

scp প্রতিবার ফাইল পুরোটা কপি করে, আর rsync শুধু পরিবর্তন পাঠায়, বাধা থেকে পুনরায় শুরু করতে পারে, গন্তব্যের অতিরিক্ত ফাইল মুছতে পারে এবং শর্ত অনুযায়ী ফাইল বাদ দিতে পারে। একটি ফাইল এককালীন কপির ক্ষেত্রে পার্থক্য কম, কিন্তু নিয়মিত সিঙ্কে rsync অনেক দ্রুত।

Windows-এ rsync ব্যবহার করা যায় কি?

হ্যাঁ, WSL-এর মাধ্যমে, যেখানে rsync সাধারণ Linux-এর মতোই ইনস্টল হয়, অথবা Cygwin দিয়ে। Windows মেশিনের ফাইল Linux সার্ভারের সঙ্গে সিঙ্ক করার সবচেয়ে সুবিধাজনক উপায় WSL থেকে।

rsync কি ডেটা এনক্রিপ্ট করে?

rsync নিজে এনক্রিপ্ট করে না, তবে SSH-এর মাধ্যমে কপি করলে সব ট্রাফিক এনক্রিপ্টেড SSH সংযোগের ভেতর দিয়ে যায়। এনক্রিপশন ছাড়া ডেটা যায় শুধু rsync:// ঠিকানার rsync ডেমনের সঙ্গে কাজ করলে।

কপি মূলের সঙ্গে মিলছে কিনা কীভাবে যাচাই করব?

rsync -avnc উৎস/ গন্তব্য/ চালান — -c ফ্ল্যাগ ফাইল চেকসাম দিয়ে তুলনা করে, আর -n কিছু বদলায় না। তালিকা খালি এলে কপি হুবহু এক।

rsync মাঝপথে বন্ধ করলে কী হবে?

যেসব ফাইল ইতিমধ্যে পাঠানো হয়েছে তা থেকে যায়, আর অসম্পূর্ণ ফাইল ডিফল্টভাবে মুছে যায়। একই কমান্ড আবার চালালে সেখান থেকেই চলবে, আর -P দিলে অসম্পূর্ণ ফাইলের অংশও থেকে যায়।

ভিডিওতে বিষয়টি শিখুন

“Linux: с нуля до уверенного администрирования” কোর্সে বিষয়টি অনুশীলনসহ বিস্তারিত শেখানো হয়েছে।

কোর্সে যান