একটি রাস্পবেরি পাই নিজেই একটি ব্যাকআপ তৈরি করতে ব্যবহার করা যেতে পারে?


78

এই আরপিআইয়ের একটি ব্যাকআপ তৈরি করতে আমি কীভাবে একটি বাহ্যিক কম্পিউটার ব্যবহার করি সেই প্রশ্নের উত্তর এই প্রশ্নের উত্তর দেয়।

আমি ভাবছি যে আমি বর্তমানে ব্যবহৃত এসডি কার্ডের একটি ব্যাকআপ চিত্র তৈরি করতে পারি এবং এটি USB স্টোরেজ ডিভাইসে কোনও ফাইলে অনুলিপি করতে পারি কিনা। এটা কি সম্ভব? যদি তা না হয়, অন্য কম্পিউটার জড়িত না করে কোনও আরপিআইয়ের ব্যাকআপ তৈরি করার কোনও উপায় আছে কি?


2
অবশ্যই, তবে এড়িয়ে যান / টিএমপি, / রান, / প্রো,, সিস, / দেব, এবং / এমএনটি আপনার কোনও চিত্র তৈরি করার দরকার নেই, আপনার একটি ব্যাকআপ দরকার যা থেকে আপনি কোনও চিত্র তৈরি বা আপডেট করতে পারেন। সুতরাং ব্যবহার করবেন না dd, দেখুন rsync
স্বর্ণিলোকস

1
@ গোল্ডিলোকস যদি আপনি এই মন্তব্যে আরও সম্পূর্ণ উত্তরের উত্তর দিতে চান তবে আপনার মনে রাখা ব্যাকআপ এবং পুনঃস্থাপনের প্রক্রিয়াটি ব্যাখ্যা করে আমি এটি পছন্দ করব।
এরিক উইলসন

হয়ে গেল - দুঃখিত সময়টি পেতে আমার কয়েক দিন লেগেছে।
স্বর্ণিলকস

1
যদি আপনার গন্তব্য ভলিউম যথেষ্ট পরিমাণে বড় হয় তবে কেবলমাত্র ফাইল সিস্টেমে পঠনযোগ্য পুনরায় গণনা করা এবং ddএকটি উপযুক্ত ব্লকের আকারের সাথে একটি অনুলিপি করা সম্ভবত "নতুন" অনুলিপিটির জন্য দ্রুততম হবে। ফ্ল্যাশ / এসডি মিডিয়াতে ফাইল-ফাইল-ফাইল অনুলিপি করা খুব খারাপ ধারণা।
ক্রিস স্ট্রাটন

উত্তর:


86

rsyncপাইতে ব্যাক-আপ ব্যবহারের জন্য এখানে একটি ভূমিকা রয়েছে । প্রাথমিক ব্যাক-আপটি তৈরি হয়ে গেলে, পুরো চিত্রটি ক্রমাগত ছিঁড়ে ফেলার চেয়ে এই উপায়ে আপ টু ডেট রাখা আরও দ্রুত। আপনি এটি স্থানীয় হার্ড ড্রাইভে বা কোনও নেটওয়ার্কের মাধ্যমে করতে পারেন।

আপনি আসলে কোনও ব্যাক-আপ হিসাবে চলমান সিস্টেমের সম্পূর্ণ অনুলিপি চান না, কারণ ফাইল সিস্টেমের কিছু উপাদান কেবল রানটাইমেই উপস্থিত থাকে। এটি ব্যাকআপে অন্তর্ভুক্ত করা এবং পরে এটি কোনও চিত্র পুনরায় তৈরি করতে ব্যবহার করা আপনার সমস্যার সৃষ্টি করতে পারে।

এছাড়াও কিছু অন্যান্য ব্যতিক্রম আছে। বাদ দেওয়ার rsyncজন্য ( গ্লোব ) নিদর্শনগুলির একটি তালিকা গ্রহণ করতে পারে এবং সেগুলি একটি ফাইল থেকে পড়তে পারে, তাই প্রথমে আসুন এই ধরণের ফাইলের মধ্যে কী হওয়া উচিত। দ্রষ্টব্য যে এন্ট্রিগুলি ফর্মের /directory/*এবং নাও /directory। এটি হ'ল কারণ আমরা তাদের বিদ্যমান থাকতে চাই, তবে আমরা সেগুলিতে কোনও কিছু অনুলিপি করতে চাই না।

/proc/*
/sys/*

এগুলি সত্যই ডিস্কে বিদ্যমান নেই। এগুলি কার্নেলের একটি ইন্টারফেস, যা তাদের স্মৃতিতে তৈরি করে এবং বজায় রাখে । যদি আপনি এগুলি অনুলিপি করেন এবং এগুলি আবার কোনও সিস্টেমে অনুলিপি করে এটি বুট করেন তবে এটি (সর্বোত্তম) অর্থহীন হবে কারণ কার্নেলটি ইন্টারফেসের জন্য মাউন্ট পয়েন্ট হিসাবে ব্যবহার করে [আপনি যদি ফাইল-সিস্টেম পার্টিশন মাউন্ট করার পরে কী ঘটে তা দেখতে চান এটিতে ডেটা ডিরেক্টরিতে চেষ্টা করুন। এটি কাজ করে এবং কোনও ক্ষতি করে না, তবে ডিরেক্টরিতে থাকা স্টাফটি এখন অ্যাক্সেসযোগ্য]]

মনে রাখবেন যে মাউন্ট পয়েন্টগুলি বিদ্যমান /sysএবং এটি গুরুত্বপূর্ণ /proc তবে তাদের কিছু থাকতে হবে না। পরবর্তী:

/dev/*

devডিরেক্টরি যেমন পুরোপুরি একই জিনিস না procএবং sysকিন্তু আমাদের উদ্দেশ্য এটা জন্য। আপনি যদি মনে করেন যে আপনি এই সংরক্ষণ করা উচিত, যাতে আপনি আপনার ব্যাকআপ বা কিছু একই ডিভাইস নোড আছে করতে পারেন, আপনি ভুল প্রমাণিত হন । বিরক্ত করবেন না। কপি করবেন না dev। অনেক দিন আগে লিনাক্স সেভাবে কাজ করেছিল, তবে এটি আর হয় না।

/boot/*

এটি রাস্প্বিয়ান যেমন পাই নির্দিষ্ট ডিস্ট্রোসের সর্বাধিক (সম্ভবত সমস্ত) সাথে একটি বিশেষ ক্ষেত্রে সাজানো। এটি আসলে প্রথম, ভিফ্যাট, বিভাজনের জন্য একটি মাউন্ট পয়েন্ট। আমরা আলাদাভাবে এটি মোকাবেলা করতে যাচ্ছি। আপনি যা-ই করুন না কেন এটি এখানে অন্তর্ভুক্ত করবেন না, কারণ এটি আবার একটি মাউন্ট পয়েন্ট।

/tmp/*
/run/*

/runসাধারণত ডিস্কে হয় না, এটি স্মৃতিতে থাকে। সম্ভবত /tmpখুব বেশি হতে পারে (এটি এসডি কার্ডের কিছুটা ক্রিয়াকলাপ সাশ্রয় করতে পারে), তবে কোনও ক্ষেত্রেই নামগুলি বোঝায় যে এগুলি স্থির ডেটা সংরক্ষণের জন্য স্থান নয়। অ্যাপ্লিকেশনগুলি যা তারা ব্যবহার করে তারা প্রতিটি বুটে মুছে ফেলা হতে পারে expect

/mnt/*
/media/*

এগুলি বিশেষত যদি আপনি হার্ড ড্রাইভ বা ইউএসবি স্টিকের ব্যাকআপ নেওয়ার পরিকল্পনা করছেন এবং ডিভাইসটি রয়েছে /mntবা /media(স্বতঃস্ফূর্তটি পরে ব্যবহার করবে), কারণ আপনি যদি ফাইল সিস্টেমে devices ডিভাইসের অবস্থান বাদ না দেন তবে ড্রাইভের সামগ্রীটি নিজের থেকে সরিয়ে না নেওয়া পর্যন্ত একটি লুপ তৈরি করুন it আমি মনে করি যে বোবা এমন কিছু স্পট করতে যথেষ্ট স্মার্ট rsync হতে পারে তবে অনুমানের পরীক্ষাটি এড়াতে চেষ্টা করুন।

আসল ব্যাক আপ করার জন্য: স্থানীয়ভাবে মাউন্ট করা হার্ডড্রাইভ, ইউএসবি জিনিস ইত্যাদিতে ব্যাক আপ রাখতে একটি ডিরেক্টরি তৈরি করুন - যেমন "পাই_ব্যাকআপ"। আপনি বিকল্পভাবে কোনও দূরবর্তী অবস্থানে ব্যাকআপ নিতে পারেন ssh(নীচে দেখুন) বা একটি নেটওয়ার্ক মাউন্ট করা ফাইল সিস্টেম ব্যবহার করে তবে এটি সম্ভবত প্রথমবারের মধ্যে নেবে।

বাদ দিতে তালিকার ফাইলটি যদি /rsync-exclude.txt1 হয় এবং আপনার ড্রাইভটি /mnt/usbhdপ্রকৃত ব্যাকআপ করতে হয়:

rsync -aHv --delete --exclude-from=/rsync-exclude.txt / /mnt/usbhd/pi_backup/

লক্ষ্য করুন যে সেখানে একটি পিছনে স্ল্যাশ রয়েছেpi_backup/

এটি কিছুক্ষণ সময় নেবে এবং প্রচুর আউটপুট উত্পন্ন করবে (আপনি যদি লগের পরিবর্তে এটি পরীক্ষা করতে চান তবে সংযোজন করুন > rsync.log)। --deleteপ্রথমবার অর্থহীন, তবে ব্যাকআপটি আপডেট রাখার জন্য এটি ব্যবহার করুন। এটি নিশ্চিত করে যে আপনি পাইতে মুছে ফেলা জিনিসগুলি পরে আপনার ব্যাকআপ থেকেও সরিয়ে দেওয়া হবে। aডিরেক্টরি মধ্যে এবং সেট পুনরাবৃত্তির নিশ্চিন্ত হন যে সমস্ত ফাইল ম্যাচ বৈশিষ্ট্যাবলী করে তোলে। হার্ড লিঙ্ক 2-H সংরক্ষণ করা হয় , ভার্বোজের জন্য যার কারণে আপনি কিছু আউটপুট পান (অন্যথায় শান্ত)। আরও জন্য দেখুন।vrsyncman rsync

একটি শর্টকাট রয়েছে যার মাধ্যমে আপনি --exclude-fromফাইলটি এড়িয়ে যেতে পারেন । আপনি যদি নিশ্চিত হন যে আপনি অনুলিপি করতে চান না এমন সমস্ত জিনিস ( /tmpইত্যাদি) আলাদা ফাইল সিস্টেমে থাকে তবে আপনি কেবল ব্যবহার করতে পারেন:

rsync -axHv --delete-during / /mnt/usbhd/pi_backup/

-x.োকানো হয়েছে। এটির সংক্ষিপ্ত রূপ --one-file-systemযা rsyncফাইল সিস্টেমের সীমানা অতিক্রম না করতে বলে । ব্যক্তিগতভাবে আমি পছন্দ করি --exclude-fromতবে উদাহরণস্বরূপ, ডিফল্ট রস্পবিয়ান, --one-file-systemভাল কাজ করবে। -xট্র্যাশ যত্নবান হতে চাইলে আপনি উভয়ই ব্যবহার করতে পারেন : ডি

এটি পুরোপুরি ব্যাকআপ নয়। আপনি যদি কিছু না রেখে থাকেন bootএবং কম্পিউটারে কার্ড স্টিক করে চালিয়ে কেবল সিস্টেমটি পুনরুদ্ধার করতে ব্যাক আপ ব্যবহার করে আপনার পক্ষে ভাল তবে এটি যথেষ্ট :

rsync -av --delete-during /mnt/usbhd/pi_backup/ /mnt/sdcard_partition2/

আপনি এটিতে কোনও নতুন চিত্রযুক্ত কার্ড দিয়ে এটি করতেও পারেন (ধরে নেওয়া এটি আপনার বেস ইমেজের মতোই) যদিও আপনাকে যদি চিত্রটি তৈরি করতে হয় তবে এটি কিছুটা অক্ষম (কারণ আপনি এরপরে এটি বেশিরভাগে ওভাররাইট করতে যাচ্ছেন)। আপনি অন্য কোনও এসডি কার্ডের কোনও ইউএসবি অ্যাডাপ্টারের মাধ্যমে এটিতে থাকা কোনও চিত্রের সাথে সংযুক্ত করতে পারেন এবং ডুপ্লিকেট কার্ড বজায় রাখতে উপরের পদ্ধতিটি ব্যবহার করতে পারেন।

যদি আপনি স্টাফ রাখেন /boot(যেমন, একটি কাস্টম কার্নেল) সহ /boot/config.txt, আপনি এটিও ব্যাক আপ করতে চান (বেশ সহজ - এটির তেমন কিছুই নেই)। এটি আলাদাভাবে করুন, এবং আপনি পুনরুদ্ধার করার সময়, স্টাফটি প্রথম পার্টিশনে যায়।

আপনি যদি ফাঁকা রাস্পবিয়ান স্টাইলের চিত্র তৈরি করতে চান তবে এখানে ব্যাকআপ নিতে পারেন See খালি রাস্পবিয়ান স্টাইল কার্ড তৈরি করতে আপনি অনুরূপ পদ্ধতিটি ব্যবহার করতে পারেন - কোনও .imgফাইলের সাথে ডিল করার পরিবর্তে আপনি একটি আসল ডিভাইস (উদাহরণস্বরূপ /dev/sdb) নিয়ে কাজ করবেন, যার অর্থ আপনাকে যা করতে হবে তার সাথে পার্টিশন টেবিলটি তৈরি করা fdiskএবং তারপরে বিন্যাস /dev/sdb1এবং sdb2(বা যাই হোক না কেন) এর সাথে mkfs

তবে পুরো চিত্রটি অনুলিপি করা সহজ! কেন এ নিয়ে বিরক্ত করবেন?

এটা এত কঠিন নয়; আমি 10 মিনিটে একটি ফাঁকা কার্ডে (সেই শেষ লিঙ্ক অনুসারে ফর্ম্যাট করা) পুনরুদ্ধার করেছি। হ্যাঁ, ddপুরো জিনিসটি ব্যবহার করা সহজতর (যদি আপনি শব্দগুলির মতো বিভ্রান্তিকর শব্দগুলি খুঁজে পান ...), তবে প্রতিবার আপনার ব্যাকআপটি আপডেট করতে চাইলে এটি বেশ খানিকটা সময় নেয় কারণ আপনাকে অবশ্যই প্রতিবার এটির 100% কাজ করতে হবে। ব্যবহার rsync, একবার একটি ব্যাকআপ বিদ্যমান, এটা আপডেট করার অনেক অনেক দ্রুত, তাই আপনি এই ক্রন মাধ্যমে থাকুন দৈনন্দিন ঘটতে সেট করতে পারেন আপ করুন। এমনকি একটি নেটওয়ার্ক জুড়ে। প্রতি ছয় ঘন্টা। আপনি যত বেশি সময় এটি করেন, কম সময় লাগবে।

rsync মাধ্যমে ssh

এখানে একটি উদাহরণ:

rsync [options] --rsh="ssh [ssh options]" root@[the pi ip]:/ /backup/rpi/

"বিকল্পগুলি" যেমন, উদাহরণস্বরূপ -av --delete --exclude-from=/rsync-exclude.txtএবং "ssh বিকল্পগুলি" হ'ল আপনি সাধারণত যা ব্যবহার করেন (যদি কিছু থাকে)। এর মাধ্যমে আপনাকে রুট অ্যাক্সেস থাকতে হবে sshএকটি সিস্টেম ব্যাকআপ উদ্দেশ্যে (সেট এই কাজ করতে PermitRootLogin=yesমধ্যে /etc/ssh/sshd_configএবং সার্ভার পুনরায় আরম্ভ)।


1 আপনার এই ফাইলটি রাখা উচিত। আপনি এটিতে #বা এর সাথে শুরু করে লাইনে মন্তব্য রাখতে পারেন ;rsyncএটিতে আসল কমান্ড অন্তর্ভুক্ত থাকতে পারে , যা পরে অনুলিপি করা যায় যাতে আপনার এটি প্রতিবার মনে রাখতে হবে না।

2 ক্রিসকে নির্দেশ করার জন্য ধন্যবাদ rsyncএটি স্বয়ংক্রিয়ভাবে করে না।


স্বর্ণকেশ। এটি রিস্কের দুর্দান্ত ব্যবহারের মতো দেখাচ্ছে। এটি আমাদের জন্য কোনও স্ক্রিপ্টে রোল করার কোনও সুযোগ?
সর্বগ্রাসী

ম্যানুয়ালি সমস্ত মাউন্টপয়েন্টগুলি বাদ দেওয়ার পরিবর্তে, কেন mkdir /tmp/backupable && mount --bind / /tmp/backupableএবং এটির সিএসএন করবেন না ? এটির যে জায়গাগুলি "ছায়াময়" রয়েছে সেখানে স্থানগুলিতে সঞ্চিত কোনও ডেটা ব্যাক আপ করার সুবিধাও রয়েছে।
n.st

@ n.st ভাল ধারণা (LOL)! আমি পরামর্শটিতে পরামর্শটি সম্পাদনা করেছি, যদিও আমি এখনও মনে করি এটি ব্যবহার --exclude-fromকরা ভাল ধারণা। আপনার যদি সময় থাকে তবে আপনি এটি আলাদা উত্তর হিসাবে লিখতে পারতেন, আপনার আমার ভোট আছে, এবং আমি এটি উল্লেখ করতে পারি। এই উত্তর যথেষ্ট বায়ুযুক্ত।
স্বর্ণিলকস

1
@ ইগোরগানাপলস্কি উদ্দেশ্যটি কোনও চিত্র তৈরি না করা ( "পড়ুন তবে পুরো চিত্রটি অনুলিপি করা সহজ! এটি কেন বিরক্ত করবেন?" অংশ)। একবার তৈরি করা বজায় রাখা সহজ এবং দ্রুত হওয়া ছাড়াও, এই পদ্ধতিটি সাধারণত আরও নমনীয়। আপনি যদি এটি তৈরি করতে পরে এটি ব্যবহার করতে চান তবে .img; এটি এবং এটি কীভাবে তারা কাঠামোগত হয় এবং কীভাবে তৈরি করা যায় তা বোঝাতে সহায়তা করা উচিত।
স্বর্ণকেশ

1
শুরু হওয়া অনুচ্ছেদটি দেখুন, "এটি পুরোপুরি সম্পূর্ণ ব্যাকআপ নয় ..." । এটি মূলত বিপরীতে ঠিক একই জিনিস। এটি এমন কিছু ধারণাগুলির সাথে সহায়তা করতে পারে যা লোকেরা প্রায়শই প্রায় / বিভ্রান্ত হয়।
স্বর্ণলোকস

24

সেখানে একজন সদস্য দ্বারা তৈরি রাস্পবেরি সম্প্রদায়ের একটি কার্যনির্বাহী স্ক্রিপ্ট।

আপনি নিজের পছন্দ মতো কোডটি পুনঃব্যবহার করতে পারেন এবং টুইট করতে পারেন t এটি ভাল নথিভুক্ত এবং স্ব-বর্ণনামূলক।

#!/bin/bash

# Setting up directories
SUBDIR=raspberrypi_backups
DIR=/hdd/$SUBDIR

echo "Starting RaspberryPI backup process!"

# First check if pv package is installed, if not, install it first
PACKAGESTATUS=`dpkg -s pv | grep Status`;

if [[ $PACKAGESTATUS == S* ]]
   then
      echo "Package 'pv' is installed."
   else
      echo "Package 'pv' is NOT installed."
      echo "Installing package 'pv'. Please wait..."
      apt-get -y install pv
fi

# Check if backup directory exists
if [ ! -d "$DIR" ];
   then
      echo "Backup directory $DIR doesn't exist, creating it now!"
      mkdir $DIR
fi

# Create a filename with datestamp for our current backup (without .img suffix)
OFILE="$DIR/backup_$(date +%Y%m%d_%H%M%S)"

# Create final filename, with suffix
OFILEFINAL=$OFILE.img

# First sync disks
sync; sync

# Shut down some services before starting backup process
echo "Stopping some services before backup."
service apache2 stop
service mysql stop
service cron stop

# Begin the backup process, should take about 1 hour from 8Gb SD card to HDD
echo "Backing up SD card to USB HDD."
echo "This will take some time depending on your SD card size and read performance. Please wait..."
SDSIZE=`blockdev --getsize64 /dev/mmcblk0`;
pv -tpreb /dev/mmcblk0 -s $SDSIZE | dd of=$OFILE bs=1M conv=sync,noerror iflag=fullblock

# Wait for DD to finish and catch result
RESULT=$?

# Start services again that where shutdown before backup process
echo "Start the stopped services again."
service apache2 start
service mysql start
service cron start

# If command has completed successfully, delete previous backups and exit
if [ $RESULT = 0 ];
   then
      echo "Successful backup, previous backup files will be deleted."
      rm -f $DIR/backup_*.tar.gz
      mv $OFILE $OFILEFINAL
      echo "Backup is being tarred. Please wait..."
      tar zcf $OFILEFINAL.tar.gz $OFILEFINAL
      rm -rf $OFILEFINAL
      echo "RaspberryPI backup process completed! FILE: $OFILEFINAL.tar.gz"
      exit 0
# Else remove attempted backup file
   else
      echo "Backup failed! Previous backup files untouched."
      echo "Please check there is sufficient space on the HDD."
      rm -f $OFILE
      echo "RaspberryPI backup process failed!"
      exit 1
fi

মূল ফোরামে মন্তব্য যুক্ত করার বিষয়টি বিবেচনা করুন বা সামগ্রীটিকে পরিপক্ক করতে আপনার নিজস্ব সংস্করণ পোস্ট করুন। খানিকটা একটু দাও।

* এবং অ্যান্ডারসডাব্লু ফিরিয়ে দেওয়ার জন্য আপনাকে ধন্যবাদ (জিআইটি স্ক্রিপ্টের জন্য ক্লিক করুন)


2
পিআই ব্যাকআপ নেওয়ার সময় যদি ফাইল সিস্টেম (ফাইল মুছে ফেলা, নতুন ফাইল যুক্ত) পরিবর্তন হয়?
কেইকি

2
আমি বেশ কয়েকটি ডিস্ক ব্যাক আপ করি যখন তারা আরএসআইএনসি নিয়ে চলতে থাকে এবং আমি প্রায়শই এই ফাইল ব্যাকআপগুলি থেকে আমার যা প্রয়োজন তা পেতে সক্ষম হয়েছি। তবে, সাধারণভাবে, ইউনিক্স ফাইল সিস্টেমটি ফাইল সিস্টেম মাউন্ট করার সময় (যথাযথভাবে প্রতিটি জায়গায় এবং সঠিকভাবে) অনুলিপি করা যায় না। সিস্টেমটি মাউন্ট করার সময় তৈরি একটি অনুলিপি কখনও কখনও "নোংরা অনুলিপি" নামে পরিচিত। নোংরা অনুলিপিটির মান উন্নত করতে বিভিন্ন ব্যবস্থা নেওয়া যেতে পারে (উপরের লিপিটি ক্রোন এবং মাইএসকিএল বন্ধ করে দিলেও) এটি নিখুঁত হতে পারে না। চিয়ার্স! * - আমি এই সম্পর্কে ভুল, এটি ফাইল সিস্টেমের উপর নির্ভর করে।
তাই ভাইনিকিকা

1
আপনি দেবিয়ান প্রস্তাবিত ব্যাকআপ ইউটিলিটিগুলি দেখতে এবং পাই এর কোনও বন্দর আছে কিনা তা দেখতে পারেন। rsnapshotশোনাচ্ছে শোনাচ্ছে
কুলা

1
@টাইভিনিকিকা আপনার নিখুঁত অনুলিপি লাগবে না আপনার একটি আংশিক অনুলিপি প্রয়োজন যা মূল বেস চিত্রটিতে পুনরায় চাপিয়ে দেওয়া (দ্রুত এবং সহজেই) হতে পারে। rsyncযাবার উপায়; কাল আমার কাছে সময় থাকলে আমি একটি উত্তর যুক্ত করব। rsnapshotতদন্তও মূল্যবান।
স্বর্ণিলোকস

3
উপরের পিপমকিন্স উত্তরের ভিত্তিতে, আমি মূল থ্রেডের সর্বশেষ মন্তব্যের সাথে 'ডিডি' স্ক্রিপ্টটি সিঙ্ক করেছি এবং নিজেই কিছু ছোটখাটো উন্নতি যুক্ত করেছি। শেষ ফলাফলটি এখানে পাওয়া যায়: < github.com/aweijnitz/pi_backup >। উন্নতি যোগ করতে এবং আমাকে টান অনুরোধগুলি প্রেরণে দ্বিধা করবেন না।
অ্যান্ডারসডাব্লু 4'13

14

পাইতে ব্যাক-আপ করার জন্য আমি @ গ্রোল্ডিলকস উত্তরটি আরএসসিএন-তে গ্রহণ করেছি। আমি ext4পাইতে লাগানো একটি এইচডিডি বিভাজনে ব্যাকআপ করি । যদি এইচডিডি মাউন্ট করা না থাকে তবে আরএসসিএনএইচটি মাউন্ট ডিরেক্টরিতে অনুলিপি করে (এসডি কার্ডটি পূর্ণ না হওয়া পর্যন্ত)। যদি এইচডিডি rwমোডে মাউন্ট না করা হয় তবে প্রচুর ত্রুটি বার্তাগুলি উত্পন্ন হয়। এগুলির কোনওটিই কাম্য নয়, তাই আমি পরীক্ষা করে দেখছি যে আমার পার্টিশনটি rwএগিয়ে যাওয়ার আগে মোডে মাউন্ট করা হয়েছে ।

নোট 2015-03-03 হার্ডলিঙ্কগুলি সঠিকভাবে অনুলিপি করতে আমি আমার উত্তরটি পরিবর্তন করেছি। আসলটি কাজ করেছে, তবে অনেক হার্ডলিঙ্কগুলিকে ফাইলে রূপান্তর করেছে। স্থান নষ্ট করার পাশাপাশি, এটি অনেকগুলি ব্যবহারের সাথে আপস করে যা হার্ডলিংকগুলি তার জায়গায় রয়েছে বলে ধরে নেয়। (আমার বর্তমান চিত্রটির 869 টি লিঙ্ক রয়েছে, যার অনেকগুলি রাস্পবিয়ানেই রয়েছে))

আমার স্ক্রিপ্ট এটি করতে। (আমার পার্টিশনটি PiData, মাউন্ট করা আছে)/mnt/PiData

#!/bin/bash
# script to synchronise Pi files to backup
BACKUP_MOUNTED=$(mount | awk '/PiData/ {print $6}' | grep "rw")
if [ $BACKUP_MOUNTED ]; then
    echo $BACKUP_MOUNTED
    echo "Commencing Backup"
    rsync -avH --delete-during --delete-excluded --exclude-from=/usr/bin/rsync-exclude.txt / /mnt/PiData/PiBackup/
else
    echo "Backup drive not available or not writable"
fi

নিম্নলিখিতগুলির সাথে পুনরুদ্ধার করুন (বা অন্য পাই আপডেট করুন):

sudo rsync -avH /mnt/PiData/PiBackup/ /

rsync-exclude.txtঅপ্রয়োজনীয় ফাইলগুলি মুছে ফেলার জন্য আমি উন্নত করেছি ।

প্রথম গোষ্ঠীটি হ'ল @goldilocks https: //raspberrypi.stackex بدل.com/users/5538/ দ্বারা নথিভুক্ত ডিরেক্টরিগুলি

দ্বিতীয় গ্রুপটি হ'ল এএসপি (অ্যাপল ফাইলিং প্রোটোকল) ব্যবহার করে আমার পাই অ্যাক্সেস করার পরে ওএস এক্স দ্বারা নির্মিত ফাইল এবং ডিরেক্টরি। (এগুলি সাধারণত ওএস এক্স-তে অদৃশ্য হয় তবে রাস্পবিয়ানে নয় any কোনও ইভেন্টে ব্যাকআপ নেওয়ার দরকার নেই)) আপনি যদি কখনও এএফপি ব্যবহার না করেন তবে এগুলি কোনও ক্ষতি করবে না।

তৃতীয় গ্রুপটি এমন ফাইল যা ব্যাক আপ করার দরকার নেই (এবং অবশ্যই অন্য পাইতে অনুলিপি করা হয়নি)। উদাহরণস্বরূপ নকল- hwॉक.data, আরপিআই-মনিটরের রিপোর্ট। আপনার সম্ভবত অন্যরা থাকবে।

/proc/*
/sys/*
/dev/*
/boot/*
/tmp/*
/run/*
/mnt/*

.Trashes
._.Trashes
.fseventsd
.Spotlight-V100
.DS_Store
.AppleDesktop
.AppleDB
Network Trash Folder
Temporary Items

.bash_history
/etc/fake-hwclock.data
/var/lib/rpimonitor/stat/

1
সেই আউটপুটটিকে .img ফাইল করার কোনও উপায় আছে ?
ইগোরগানাপলস্কি

@ ইগোরগানাপলস্কি ওয়েল, সমস্ত প্রয়োজনীয় ফাইল রয়েছে বলে দেখে (বুট ফাইল বাদে) সম্ভবত এটি সম্ভব, তবে আপনি যদি কোনও চিত্র চান তবে একটি চিত্র তৈরি করুন। আপনার নতুন পোস্টে কোনও নতুন প্রশ্ন জিজ্ঞাসা করা উচিত, মন্তব্য নয়।
মিলিওয়েজ

@ মিলিওয়েজ কেন আমাদের "sudo rsync ..." ব্যবহার করা উচিত নয়? কিছু ফাইল রয়েছে যা সংহত হতে পারে না?
স্মিলিয়া

6

আমার স্থানীয় নেটটিতে আমার তিনটি পিআইস চলছে এবং তারা যখন চলতে থাকবে তখন ক্রোন দিয়ে নিয়মিত বেসে তাদের ব্যাকআপ নিতে হবে। এজন্য আমি একটি স্ক্রিপ্ট তৈরি করেছি যা ডিডি, টার এবং আরএসসিএন ব্যাকআপ তৈরি করতে এবং সেগুলি পুনরুদ্ধার করতে সক্ষম। আমি আমার ব্যাকআপগুলির জন্য আরএসআইএনসি ব্যবহার করতে পছন্দ করি তবে অন্যান্য লোকেরা ডিডি বা টার পছন্দ করে। এটি ইতিমধ্যে অনেক লোক ব্যবহার করে। আশা করি এটি অন্যদের জন্যও কার্যকর :-) রাস্পিব্যাকআপ - রাস্পবেরি নিজেই ব্যাকআপ তৈরি করে


1
না, দুঃখিত: HTTP- র মাধ্যমে ডাউনলোড করা স্ক্রিপ্টটি (রুট হিসাবে!) চালানোর জন্য ব্যবহারকারীকে দায়িত্বজ্ঞানহীন। নিরাপদ চ্যানেলের মাধ্যমে এই স্ক্রিপ্টটি বিতরণ করুন।
ক্লাইমেন্ট

1
আমি মনে করি না যে এটি বিষয়বস্তু থেকে দূরে আছে, এবং মূল বা খুব বেশি কিছু যায় আসে না। মুল বক্তব্যটি হ'ল সফ্টওয়্যারটি কোনও সুরক্ষিত চ্যানেলের মাধ্যমে বিতরণ করা উচিত এবং আপনার উত্তরটি খারাপ সুরক্ষা অনুশীলনগুলিকে উত্সাহিত করে।
ক্লিমেট

1
হ্যাঁ :)
ক্লিমেট

2
কেবল লক্ষ্য করুন যে এইচটিটিপিএসের মাধ্যমে বিতরণ কোনওভাবেই এই পরিস্থিতিতে কোনও সুরক্ষা যুক্ত করে না! আপনি এখনও ইন্টারনেট থেকে একটি স্ক্রিপ্ট ডাউনলোড এবং চালাচ্ছেন। সুরক্ষিত প্রক্রিয়াটি হ'ল স্ক্রিপ্টটি ডাউনলোড করা (HTTP / https অপ্রাসঙ্গিক), একটি সম্পাদকে স্ক্রিপ্টটি খুলুন এবং উপরে থেকে নীচে পড়ুন, অদ্ভুততা এবং নিরাপত্তাহীনতার জন্য এটি পরীক্ষা করুন। আপনি সন্তুষ্ট হলেই এটি চালানো উচিত। ফ্রেম আমাদের সবার জানা ও হ্যাকার হতে পারে https- র মাধ্যমে ডেলিভারি কেবল সেই ক্ষেত্রে তাকে হাসিয়ে দেবে :) (বিটিডাব্লু, এটি কোনও অভিযোগ ফ্রেম নয়!)
জুলিয়ান নাইট

2
আমি আপনার সাথে একমত. এই কারণেই স্ক্রিপ্টটি ইনস্টল করার জন্য দুটি উপায় বর্ণিত রয়েছে: ১. ইনস্টলারস্ক্রিপ্টটি ব্যবহার করুন ২. এটি ম্যানুয়ালি ডাউনলোড করুন, কোডটি চেক করুন এবং তারপরে নিজেই ইনস্টল করুন
ফ্রেমপ

3

এই জাতীয় উদ্দেশ্যে এখানে আমাদের স্থিতিশীল সরঞ্জাম: https://github.com/aktos-io/aktos-dcs-tools

এই সরঞ্জামে লেখা আছে make sshসংযোগ, make backup-root, make mount-rootপ্রথমে মনে দূরবর্তী স্থান এবং পরে স্থানীয় সেশন যোগ করা হয় না। সুতরাং এটি স্থানীয় ব্যাকআপ, সরাসরি রিমোট ব্যাকআপ, প্রক্সি রিমোট ব্যাকআপ সমর্থন করে। ব্যাকআপগুলি ক্রমবর্ধমানভাবে নেওয়া হয় (কেবলমাত্র ডিফগুলি স্থানান্তরিত হয়) এবং ব্যাকআপ ডিরেক্টরিগুলি এককভাবে (পুনরুদ্ধার করার জন্য কেবল একটি ডিরেক্টরি / সংস্করণ চয়ন করুন, যে কোনও ডিরেক্টরিতে পুরো ব্যাকআপ থাকে)। অবশ্যই, আপনার সংস্করণ রয়েছে (ব্যাকআপ.লাস্ট -0 নতুনটি নতুন)। আপনি যে কোনও সময় ব্যাকআপ প্রক্রিয়াটিতে বাধা দিতে পারেন এবং পরে চালিয়ে যেতে পারেন।

আপনার নির্দিষ্ট সমস্যার জন্য এখানে নির্দেশাবলী:

 ssh to-your-raspberry
 cd /mnt/usb0/my-rpi-backups
 git clone https://github.com/ceremcem/aktos-dcs-tools backup-tools
 ln -s backup-tools/Makefile .

 ./backup-tools/configure # you do not need to make any settings for local sessions, just save the default 

 # just for the first time
 make set-local-session  # a flag file is created
 make init               # snapshots directory is created

 # anytime you want to back up
 make backup-root        # backup with rsync

সম্পাদনা

এখন একটি নতুন লক্ষ্য যুক্ত হয়েছে: আপনি আপনার ব্যাকআপগুলি থেকে একটি কমান্ড দিয়ে একটি শারীরিক এসডি কার্ড তৈরি করতে পারেন:

make create-disk-from-last-backup

নির্দেশাবলী অনুসরণ করুন, আপনার এসডি কার্ড তৈরি করুন, এই নতুন তৈরি হওয়া এসডি কার্ডটি দিয়ে রাস্পবেরি বুট করুন।


1

এখানে একটি সম্পূর্ণ ভিন্ন পদ্ধতির। আপনি ব্যবহার করতে পারেন , LVM ( এল ogical ভী olume এম সামঞ্জস্যপূর্ণ ব্যাকআপগুলি তৈরি করার জন্য anager)। অন্যান্য সংযোজনগুলির পাশাপাশি সহজ সংযোজন, সঞ্চয়স্থান হ্রাস করা বা হ্রাস করা বা অপারেটিং সিস্টেমটিকে একটি স্ন্যাপশট থেকে পূর্বের স্থিতিতে পুনরুদ্ধার করুন আপনি ব্যাকআপও করতে পারেন। ব্যাকআপের সময় ডায়নামিক পরিবর্তিত ফাইলগুলি নিয়ে কেবল আপনার কেবল চিন্তার দরকার নেই, কেবলমাত্র ফাইল সিস্টেম পড়ার জন্য সেট করা, নির্দিষ্ট ডিরেক্টরি বা অন্য কিছু বাদ দিন। সঙ্গে LVM- র আপনি কেবল একটি স্ন্যাপশট তৈরি এই স্ন্যাপশট এবং এটি ব্যাকআপ পদ্ধতি আপনি পছন্দ সঙ্গে মাউন্ট। আপনি এর সাথে একটি অনুলিপি তৈরি করতে পারেন cp -a, সাথে একটি আয়না rsyncতৈরি করতে পারেন, একটি সংরক্ষণাগার tarতৈরি করতে বা এর সাথে একটি চিত্র তৈরি করতে পারেনdd। ধরে নিই যে আপনি একটি ব্যাকআপ ডিভাইস মাউন্ট করেছেন /mnt/usbhd/pi_backup/আপনি উদাহরণস্বরূপ এটি করতে পারেন:

rpi ~$ sudo lvcreate --snapshot --name rpi_snap --size 1G rpi_vg/root_lv
rpi ~$ sudo mkdir /mnt/snapshot
rpi ~$ sudo mount /dev/mapper/rpi_vg-rpi_snap /mnt/snapshot

# make backups
rpi ~$ sudo cp -a /mnt/snapshot/ /mnt/usbhd/pi_backup/
rpi ~$ sudo rsync -aH --delete /mnt/snapshot/ /mnt/usbhd/pi_backup/
rpi ~$ sudo tar -czf /mnt/usbhd/pi_backup/backup.tar.gz -V "Backup of my Raspberry Pi" -C /mnt/snapshot/ ./
rpi ~$ sudo dd if=/mnt/snapshot/ of=/mnt/usbhd/pi_backup/backup.img bs=4M

rpi ~$ sudo umount /mnt/snapshot/
rpi ~$ sudo lvremove rpi_vg/rpi_snap

LVM সেট আপ করতে এটির জন্য কেবলমাত্র একবার সময় লাগবে । কিভাবে যে আপনি তাকান করতে করতে সহজ ব্যাকআপ এবং LVM- র সঙ্গে একটি চলমান সিস্টেমের স্ন্যাপশট


0

আমি একটি ব্যাকআপ সরঞ্জাম পেয়েছি যা ইনস্টলযোগ্য চিত্র তৈরি করে।

ইমেজগুলি মাউন্ট এবং সঙ্কুচিত করার জন্য এটিরও ইউটিলিটি রয়েছে।

এটি অন্যের জন্য দরকারী হতে পারে

এটির সাথে আসা ডকুমেন্টেশনগুলি খুব সংক্ষিপ্ত তাই আমি নিম্নলিখিতগুলি নোট করি: -

  1. কোনও ডিরেক্টরিতে ইউটিলিটিগুলি বের করুন এবং স্ক্রিপ্টগুলি কার্যকরযোগ্য করে তুলুন make
  2. ext4আপনার পাই তে /mntবা একটি ফর্ম্যাটেড পার্টিশন মাউন্ট করুন /media(যে কোনও ফর্ম্যাট যা বড় ফাইলগুলিকে মঞ্জুরি দেয় এবং পাই দ্বারা সমর্থিত যেমন উদাহরণস্বরূপ বা নেটওয়ার্ক ড্রাইভ ব্যবহার করা যেতে পারে)।
  3. প্রাথমিক রানের জন্য আপনাকে ব্যাকআপ ইমেজ নাম যেমন অনুরোধ করা হবে /mnt/Image/BusterBackup.img
  4. আপনাকে একটি চিত্রের মূল ফাইল ফাইল আকারের (এমবিতে) জন্য অনুরোধ করা হবে, এটি সর্বনিম্ন সম্ভাব্যতার জন্য 0 বা সম্পূর্ণ ব্যাকআপের জন্য ফাঁকা হতে পারে।
  5. পরবর্তী রানগুলি ক্রমবর্ধমান আপডেট করতে ব্যাকআপ চিত্রের প্রবেশ করান।
An example of the commands I used:-
# Mount USB
sudo mount /dev/sda1 /mnt/Image/
# Update backup
sudo image-utils/image-backup /mnt/Image/BusterBackup.img
# Mount backup
sudo image-utils/image-mount /mnt/Image/BusterBackup.img  MountedImages
When done, run:
sudo umount MountedImages; sudo losetup -d /dev/loop0
# Compress backup
sudo sh -c "gzip -9c /mnt/Image/BusterBackup.img  > Images/BusterBackup.img.gz"

পার্টিশন অফসেট এবং মাপগুলি সঠিকভাবে গণনা করতে এবং কয়েকটি মন্তব্য যুক্ত করেছি, আমি আসলটি (মাউন্টপয়েন্টগুলি অনুলিপি করতে) কিছুটা পরিবর্তন করেছি।

#!/bin/bash
# Original https://raspberrypi.org/forums/viewtopic.php?p=1528736
# 2019-09-26    Modified to set size of boot sector

trap '{ stty sane; echo ""; errexit "Aborted"; }' SIGINT SIGTERM

ADDBLK=0

# Set BOOT_SIZE_MB to the Desired boot sector size (in MB) - should be multiple of 4MB
BOOT_SIZE_MB=256
BOOTSIZEM=$BOOT_SIZE_MB'M'

BOOTBEG=8192
BOOT_SIZE="$((BOOT_SIZE_MB * 1024 * 1024))"
ROUND_SIZE="$((4 * 1024 * 1024))"
# Ensure root sector starts on an Erase Block Boundary (4MB)
ROOTBEG=$(((BOOT_SIZE + ROUND_SIZE -1) / ROUND_SIZE * ROUND_SIZE / 512 + BOOTBEG))

MNTPATH="/tmp/img-backup-mnt"

ONEMB=$((1024 * 1024))

# create BOOT loop device
mkloop1()
{
  local INFO1=""
  local SIZE1=0
  local START1=0

  sync
  INFO1="$(sfdisk -d "${IMGFILE}")"
  START1=$(grep type=c <<< "${INFO1}" | sed -n 's|^.*start=\s\+\([0-9]\+\).*$|\1|p')
  SIZE1=$(grep type=c <<< "${INFO1}" | sed -n 's|^.*size=\s\+\([0-9]\+\).*$|\1|p')
  LOOP1="$(losetup -f --show -o $((${START1} * 512)) --sizelimit $((${SIZE1} * 512)) "${IMGFILE}")"
  if [ $? -ne 0 ]; then
    errexit "Unable to create BOOT loop device"
  fi
}

rmloop1()
{
  if [ "${LOOP1}" != "" ]; then
    sync
    losetup -d "${LOOP1}"
    LOOP1=""
 fi
}

# create ROOT loop device
mkloop2()
{
  local INFO2=""
  local SIZE2=0
  local START2=0

  sync
  INFO2="$(sfdisk -d "${IMGFILE}")"
  START2=$(grep type=83 <<< "${INFO2}" | sed -n 's|^.*start=\s\+\([0-9]\+\).*$|\1|p')
  SIZE2=$(grep type=83 <<< "${INFO2}" | sed -n 's|^.*size=\s\+\([0-9]\+\).*$|\1|p')
  LOOP2="$(losetup -f --show -o $((${START2} * 512)) --sizelimit $((${SIZE2} * 512)) "${IMGFILE}")"
  if [ $? -ne 0 ]; then
    errexit "Unable to create ROOT loop device"
  fi
}

rmloop2()
{
  if [ "${LOOP2}" != "" ]; then
    sync
    losetup -d "${LOOP2}"
    LOOP2=""
  fi
}

# Mount Image partitions
mntimg()
{
  MNTED=TRUE
  if [ ! -d "${MNTPATH}/" ]; then
    mkdir "${MNTPATH}/"
    if [ $? -ne 0 ]; then
      errexit "Unable to make ROOT partition mount point"
    fi
  fi
  mkloop2
  mount "${LOOP2}" "${MNTPATH}/"
  if [ $? -ne 0 ]; then
    errexit "Unable to mount image ROOT partition"
  fi
  if [ ! -d "${MNTPATH}/boot/" ]; then
    mkdir -p "${MNTPATH}/boot/"
    if [ $? -ne 0 ]; then
      errexit "Unable to make BOOT partition mount point"
    fi
  fi
  mkloop1
  mount "${LOOP1}" "${MNTPATH}/boot/"
  if [ $? -ne 0 ]; then
    errexit "Unable to mount image BOOT partition"
  fi
}

umntimg()
{
  umount "${MNTPATH}/boot/"
  if [ $? -ne 0 ]; then
    errexit "Unable to unmount image BOOT partition"
  fi
  rmloop1
  umount "${MNTPATH}/"
  if [ $? -ne 0 ]; then
    errexit "Unable to unmount image ROOT partition"
  fi
  rmloop2
  rm -r "${MNTPATH}/"
  MNTED=FALSE
}

errexit()
{
  echo ""
  echo "$1"
  echo ""
  if [ "${MNTED}" = "TRUE" ]; then
    umount "${MNTPATH}/boot/" &> /dev/null
    umount "${MNTPATH}/" &> /dev/null
    rm -rf "${MNTPATH}/" &> /dev/null
  fi
  rmloop1
  rmloop2
  exit 1
}

LOOP1=""
LOOP2=""
MNTED=FALSE

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

if [ $(id -u) -ne 0 ]; then
  errexit "$0 must be run as root user"
fi

PGMNAME="$(basename $0)"
for PID in $(pidof -x -o %PPID "${PGMNAME}"); do
  if [ ${PID} -ne $$ ]; then
    errexit "${PGMNAME} is already running"
  fi
done

rsync --version &> /dev/null
if [ $? -ne 0 ]; then
  errexit "rsync not installed (run: apt-get install rsync)"
fi

if command -v systemctl > /dev/null && systemctl | grep -q '\-\.mount'; then
  SYSTEMD=1
elif [ -f /etc/init.d/cron ] && [ ! -h /etc/init.d/cron ]; then
  SYSTEMD=0
else
  errexit "Unrecognized init system"
fi

if [ ${SYSTEMD} -eq 1 ]; then
  ROOT_PART="$(mount | sed -n 's|^/dev/\(.*\) on / .*|\1|p')"
else
  if [ ! -h /dev/root ]; then
    errexit "/dev/root does not exist or is not a symlink"
  fi
  ROOT_PART="$(readlink /dev/root)"
fi

ROOT_TYPE=$(blkid "/dev/${ROOT_PART}" | sed -n 's|^.*TYPE="\(\S\+\)".*|\1|p')

ROOT_DEV="${ROOT_PART:0:(${#ROOT_PART} - 1)}"
if [ "${ROOT_DEV}" = "mmcblk0p" ]; then
  ROOT_DEV="${ROOT_DEV:0:(${#ROOT_DEV} - 1)}"
fi

PTUUID="$(blkid "/dev/${ROOT_DEV}" | sed -n 's|^.*PTUUID="\(\S\+\)".*|\1|p')"

DEVSIZE=$(blockdev --getsize64 "/dev/${ROOT_PART}")
BLKSIZE=$(blockdev --getbsz "/dev/${ROOT_PART}")
BLKCNT=$((${DEVSIZE} / ${BLKSIZE}))
INFO="$(df | grep /dev/root)"
DFKSIZE=$(awk '{print $2}' <<< "${INFO}")
DFKFREE=$(awk '{print $4}' <<< "${INFO}")
ROOTSIZE=$((${BLKCNT} * ${BLKSIZE}))
ROOTUSED=$(((${DFKSIZE} - ${DFKFREE}) * 1024))
IRFSMIN=$(((${ROOTUSED} + (${ADDBLK} * ${BLKSIZE}) + (${ONEMB} - 1)) / ${ONEMB}))
IRFSMAX=$(((${ROOTSIZE} + (${ONEMB} - 1)) / ${ONEMB}))

IMGFILE="$1"
if [ "${IMGFILE}" = "" ]; then
# Create Image file
  while :
  do
    echo ""
    read -r -e -i "${IMGFILE}" -p "Image file to create? " IMGFILE
    if [ "${IMGFILE}" = "" ]; then
      continue
    elif [[ ! "${IMGFILE}" =~ ^/mnt/.*$ && ! "${IMGFILE}" =~ ^/media/.*$ ]]; then
      echo ""
      echo "${IMGFILE} does not begin with /mnt/ or /media/"
      continue
    fi
    if [ -d "${IMGFILE}" ]; then
      echo ""
      echo "${IMGFILE} is a directory"
    elif [ -f "${IMGFILE}" ]; then
      echo ""
      echo -n "${IMGFILE} already exists, Ok to delete (y/n)? "
      while read -r -n 1 -s answer; do
        if [[ "${answer}" = [yYnN] ]]; then
          echo "${answer}"
          if [[ "${answer}" = [yY] ]]; then
            break 2
          else
            break 1
          fi
        fi
      done
    else
      break
    fi
  done
  IRFSSIZE=""
  while :
  do
    echo ""
    read -r -e -i "${IRFSSIZE}" -p "Image ROOT filesystem size (MB) [${IRFSMAX}]? " IRFSSIZE
    if [ "${IRFSSIZE}" = "" ]; then
      IRFSSIZE=${IRFSMAX}
      break
    elif [ ${IRFSSIZE} -ge ${IRFSMIN} ]; then
      break
    else
      echo ""
      echo "Requested image ROOT filesystem size (${IRFSSIZE}) is too small (Minimum = ${IRFSMIN})"
      IRFSSIZE=${IRFSMIN}
    fi
  done
  echo ""
  echo -n "Create ${IMGFILE} [${IRFSSIZE} MB] (y/n)? "
  while read -r -n 1 -s answer; do
    if [[ "${answer}" = [yYnN] ]]; then
      echo "${answer}"
      if [[ "${answer}" = [yY] ]]; then
        break
      else
        errexit "Aborted"
      fi
    fi
  done
  if [ -f "${IMGFILE}" ]; then
    rm "${IMGFILE}"
    if [ $? -ne 0 ]; then
      errexit "Unable to delete existing image file"
    fi
  fi
  ROOTEND=$((${ROOTBEG} + ((${IRFSSIZE} * ${ONEMB}) / 512) - 1))
  truncate -s $(((${ROOTEND} + 1) * 512)) "${IMGFILE}"
  if [ $? -ne 0 ]; then
    errexit "Unable to create image file"
  fi
# create image/partitions
  sync
  fdisk "${IMGFILE}" <<EOF > /dev/null
p
n
p
1
${BOOTBEG}
+${BOOTSIZEM}
t
c
p
n
p
2
${ROOTBEG}
${ROOTEND}
p
w
EOF

  mkloop1
  mkloop2
  mkfs.vfat "${LOOP1}" > /dev/null
  if [ $? -ne 0 ]; then
    errexit "Unable to create image BOOT filesystem"
  fi
  dosfsck "${LOOP1}" > /dev/null
  if [ $? -ne 0 ]; then
    errexit "Image BOOT filesystem appears corrupted"
  fi
  if [ "${ROOT_TYPE}" = "f2fs" ]; then
    mkfs.f2fs "${LOOP2}" > /dev/null
  else
    mkfs.ext4 -q -b ${BLKSIZE} "${LOOP2}" > /dev/null
  fi
  if [ $? -ne 0 ]; then
    errexit "Unable to create image ROOT filesystem"
  fi
  rmloop2
  rmloop1
# Initialise image PARTUUID
  fdisk "${IMGFILE}" <<EOF > /dev/null
p
x
i
0x${PTUUID}
r
p
w
EOF
# Create empty directories in image root partition
  mntimg
  mkdir "${MNTPATH}/dev/" "${MNTPATH}/media/" "${MNTPATH}/mnt/" "${MNTPATH}/proc/" "${MNTPATH}/run/" "${MNTPATH}/sys/" "${MNTPATH}/tmp/"
  if [ $? -ne 0 ]; then
    errexit "Unable to create image directories"
  fi
  chmod a+rwxt "${MNTPATH}/tmp/"
  umntimg
  echo ""
  echo "Starting full backup (for incremental backups, run: $0 ${IMGFILE})"
# END of create image/partitions
else

# Check existing Image
  if [[ ! "${IMGFILE}" =~ ^/mnt/.*$ && ! "${IMGFILE}" =~ ^/media/.*$ ]]; then
    errexit "${IMGFILE} does not begin with /mnt/ or /media/"
  fi
  if [ -d "${IMGFILE}" ]; then
    errexit "${IMGFILE} is a directory"
  elif [ ! -f "${IMGFILE}" ]; then
    errexit "${IMGFILE} not found"
  fi
  echo "Starting incremental backup to ${IMGFILE}"
fi

# rsync root partition
mntimg
sync
rsync -aDH --partial --numeric-ids --delete --force --exclude "${MNTPATH}" --exclude '/dev' --exclude '/media' --exclude '/mnt/*/*' --exclude '/proc' --exclude '/run' --exclude '/sys' \
--exclude '/tmp' --exclude 'lost\+found' --exclude '/etc/udev/rules.d/70-persistent-net.rules' --exclude '/var/lib/asterisk/astdb.sqlite3-journal' / "${MNTPATH}/"
if [[ $? -ne 0 && $? -ne 24 ]]; then
  errexit "Unable to create backup"
fi
sync
umntimg

-1

টার্মিনালটি খুলুন এবং 'lsblk -f' টাইপ করুন।
এটি সমস্ত সংযুক্ত স্টোরেজ ডিভাইসগুলি দেখানো উচিত।
তারপরে 'dd if = / dev / [আপনার এসডি কার্ডের নাম] বিএস = 1 এম' টাইপ করুন।
এটি কিছুক্ষণ সময় নেবে তাই আপনি পটভূমিতে এটি চালাতে চাইতে পারেন।
আপনি লিনাক্সে আপনার এসডি কার্ডটি ব্যাকআপ করার একই পদ্ধতি।


এটি সমস্ত কিছু, এমনকি অপ্রয়োজনীয় এবং অযাচিত ফাইলগুলি ব্যাক আপ করে।
ইগোরগানাপলস্কি

3
এটি একটি বেমানান ব্যাকআপ তৈরি করবে কারণ ব্যাকআপ চলাকালীন চলমান সিস্টেমে জিনিসগুলি বদলে গেছে!
ইঙ্গো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.