क्या रास्पबेरी पाई का उपयोग स्वयं का बैकअप बनाने के लिए किया जा सकता है?


78

यह सवाल इस सवाल का जवाब देता है कि मैं अपने आरपीआई का बैकअप बनाने के लिए बाहरी कंप्यूटर का उपयोग कैसे करता हूं।

मैं सोच रहा हूं कि क्या मैं एसडी कार्ड की एक बैकअप छवि बना सकता हूं जो वर्तमान में उपयोग में है, और इसे एक यूएसबी स्टोरेज डिवाइस पर फ़ाइल में कॉपी कर रहा हूं। क्या यह संभव है? यदि नहीं, तो क्या किसी अन्य कंप्यूटर को शामिल किए बिना आरपीआई का बैकअप बनाने का कोई तरीका है?


2
ज़रूर, लेकिन स्किप / tmp, / run, / proc, / sys, / dev, और / mnt। आपको एक छवि बनाने की आवश्यकता नहीं है, आपको एक बैकअप की आवश्यकता है जिससे आप एक छवि बना सकते हैं या अपडेट कर सकते हैं। तो उपयोग न करें dd, में देखें rsync
गोल्डीलॉक्स

1
@goldilocks मुझे अच्छा लगेगा अगर आप इस टिप्पणी को अधिक संपूर्ण उत्तर में समझेंगे, तो बैकअप और पुनर्स्थापना प्रक्रिया को ध्यान में रखते हुए।
एरिक विल्सन

हो गया - खेद है कि मुझे समय खोजने में कुछ दिन लग गए।
गोल्डीलॉक्स

1
यदि आपकी गंतव्य मात्रा काफी बड़ी है, तो केवल-पढ़ने के लिए फाइलसिस्टम को रिमूव करना और ddएक उपयुक्त ब्लॉक आकार के साथ एक कॉपी करना संभवतः "नई" कॉपी के लिए सबसे तेज़ होगा। फ्लैश / एसडी मीडिया के लिए फ़ाइल-दर-फ़ाइल कॉपी करना संभवतः एक बुरा विचार है।
क्रिस स्ट्रैटन

जवाबों:


86

यहां rsyncपाई पर बैक-अप के लिए उपयोग करने का परिचय है । एक बार प्रारंभिक बैक-अप बनने के बाद, इस तरह से इसे बनाए रखना पूरी छवि को लगातार रिप करने की तुलना में बहुत तेज है। आप इसे स्थानीय हार्ड ड्राइव या नेटवर्क पर कर सकते हैं।

आप वास्तव में बैक-अप के रूप में एक रनिंग सिस्टम की पूरी कॉपी नहीं चाहते हैं, क्योंकि फाइल सिस्टम में कुछ सामान केवल रनटाइम पर ही मौजूद होता है। एक बैकअप में इसे शामिल करना और फिर बाद में एक छवि को फिर से बनाने के लिए इसका उपयोग करना आपके लिए समस्याएं पैदा कर सकता है

कुछ अन्य अपवाद भी हैं। को बाहर करने के लिए rsync( ग्लोब ) पैटर्न की एक सूची को स्वीकार कर सकते हैं, और जिन्हें एक फ़ाइल से पढ़ा जा सकता है, इसलिए आइए सबसे पहले इस तरह की फ़ाइल में क्या होना चाहिए। ध्यान दें कि प्रविष्टियाँ फॉर्म की हैं /directory/*और नहीं /directory। ऐसा इसलिए है क्योंकि हम चाहते हैं कि उनका अस्तित्व बना रहे, लेकिन हम उनमें कुछ भी कॉपी नहीं करना चाहते हैं।

/proc/*
/sys/*

ये वास्तव में डिस्क पर मौजूद नहीं हैं। वे कर्नेल के लिए एक इंटरफ़ेस हैं, जो उन्हें स्मृति में बनाता और बनाए रखता है । यदि आप इन्हें कॉपी करते हैं और फिर उन्हें एक सिस्टम में कॉपी करते हैं और इसे बूट करते हैं, तो यह (सबसे अच्छा) व्यर्थ होगा, क्योंकि कर्नेल उन इंटरफेस के लिए माउंट पॉइंट्स के रूप में उपयोग करता है [अगर आप देखना चाहते हैं कि क्या होता है जब आप फाइल सिस्टम विभाजन को माउंट करते हैं इसमें डेटा वाली निर्देशिका पर, प्रयास करें। यह काम करता है और कोई नुकसान नहीं पहुंचाएगा, लेकिन जो सामान निर्देशिका में था वह अब अप्राप्य है।]

ध्यान दें कि यह महत्वपूर्ण है /sysऔर /procमाउंट बिंदु मौजूद हैं। लेकिन उनमें कुछ भी शामिल नहीं होना चाहिए। आगे:

/dev/*

devनिर्देशिका के रूप में काफी एक ही बात नहीं है procऔर sysलेकिन हमारे उद्देश्यों यह है के लिए। यदि आप मानते हैं कि आपको इसे सहेजना चाहिए, तो आपके बैकअप या किसी अन्य चीज़ में समान डिवाइस नोड हो सकते हैं, तो आप गलत हैं । परेशान मत करो। नकल मत करो dev। एक बार बहुत समय पहले लिनक्स ने इस तरह से काम किया था, लेकिन यह अब और नहीं करता है।

/boot/*

यह एक विशेष मामले की तरह है, जिसमें सबसे विशिष्ट (शायद सभी) रास्पियन जैसे विशिष्ट विशिष्ट विकृतियां हैं। यह वास्तव में पहली, vfat, विभाजन के लिए एक आरोह बिंदु है। हम इससे अलग से निपटने जा रहे हैं। आप जो कुछ भी करते हैं, उसे यहां शामिल न करें, क्योंकि फिर से, यह एक माउंट बिंदु है।

/tmp/*
/run/*

/runआम तौर पर या तो डिस्क पर नहीं है, यह मेमोरी में है। शायद /tmpयह भी हो सकता है (यह थोड़ा एसडी कार्ड कार्रवाई को बचाएगा), लेकिन किसी भी मामले में, जैसा कि नाम से पता चलता है, ये लगातार डेटा संग्रहीत करने के लिए जगह नहीं हैं। जो एप्लिकेशन उनका उपयोग करते हैं, वे उम्मीद करते हैं कि उन्हें प्रत्येक बूट पर हटाया जा सकता है।

/mnt/*
/media/*

इन महत्वपूर्ण खासकर यदि आप एक हार्ड ड्राइव या यूएसबी स्टिक को बैकअप लेने के लिए योजना बना रहे हैं कर रहे हैं और डिवाइस में है /mntया /mediaक्योंकि अगर आप फाइल सिस्टम आप में उन लोगों के उपकरणों के स्थान को बाहर नहीं करते, (automounting बाद उपयोग करने के लिए जाता है) ड्राइव की सामग्री का समर्थन करते हुए एक लूप बनाएं, जब तक कि यह अंतरिक्ष से बाहर न चला जाए। मुझे लगता है कि कुछ rsync हो सकता है कि गूंगा हाजिर करने के लिए पर्याप्त होशियार हो सकता है लेकिन आधार का परीक्षण करने से बचने की कोशिश करें।

वास्तविक बैक अप पर: स्थानीय रूप से माउंट किए गए हार्डड्राइव, USB चीज़ आदि का बैकअप लेने के लिए एक निर्देशिका बनाएं - जैसे "pi_backup"। आप वैकल्पिक रूप से एक दूरस्थ स्थान पर ssh(नीचे देखें) या नेटवर्क माउंटेड फाइल सिस्टम का उपयोग करके बैकअप ले सकते हैं , लेकिन यह संभवत: पहली बार होगा।

यदि सूची से बाहर करने वाली फ़ाइल /rsync-exclude.txt1 है और आपका ड्राइव /mnt/usbhdवास्तविक बैकअप करने के लिए है:

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

ध्यान दें कि वहाँ एक अनुगामी स्लैश हैpi_backup/

इसमें थोड़ा समय लगेगा और बहुत अधिक उत्पादन होगा (यदि आप इसके बजाय एक लॉग में जांचना चाहते हैं, तो संलग्न करें > rsync.log)। --deleteपहली बार अर्थहीन है, लेकिन बैकअप अद्यतन रखने के लिए इसका उपयोग करें। यह सुनिश्चित करता है कि आपके द्वारा बाद में पाई पर हटाए गए सामान को भी आपके बैकअप से हटा दिया जाए। aनिर्देशिका में और सेट प्रत्यावर्तन सुनिश्चित करें कि सभी फ़ाइल मैच जिम्मेदार बताते हैं बनाता है। -Hसंरक्षित करने के लिए किया जाता है हार्ड लिंक 2 , v(अन्यथा जिसके कारण आप कुछ आउटपुट प्राप्त वर्बोज़ के लिए है rsyncचुप है)। man 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/

आप इस पर एक नई छवि के साथ एक कार्ड के साथ भी कर सकते हैं (यह मानते हुए कि यह आपकी आधार छवि के समान है) हालांकि यह थोड़ा अक्षम है यदि आपको छवि बनानी है (क्योंकि आप तब इसे अधिलेखित करने जा रहे हैं)। आप USB अडैप्टर के माध्यम से उस पर ऐसी छवि के साथ एक और एसडी कार्ड कनेक्ट कर सकते हैं, और डुप्लिकेट कार्ड को बनाए रखने के लिए उपरोक्त विधि का उपयोग कर सकते हैं।

यदि आपने /boot(जैसे, एक कस्टम कर्नेल) में सामान रखा है /boot/config.txt, तो आप उसे वापस भी चाहते हैं (बहुत सरल - इसके लिए बहुत कुछ नहीं है)। बस इसे अलग से करें, और जब आप पुनर्स्थापित करते हैं, तो वह सामान पहले विभाजन में जाता है।

यहां देखें कि क्या आप एक रिक्त रास्पियन शैली की छवि बनाना चाहते हैं जिसे आप तब बैकअप कर सकते हैं। एक खाली रास्पियन स्टाइल कार्ड बनाने के लिए आप एक समान कार्यप्रणाली का उपयोग कर सकते हैं - सिर्फ एक .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यह स्वचालित रूप से नहीं करता है।


गोल्डीलॉक्स। यह rysync के एक महान उपयोग की तरह दिखता है। हमारे लिए इसे स्क्रिप्ट में रोल करने का कोई मौका?
अधिनायकवादी

इसके बजाय मैन्युअल रूप से सभी माउंटपॉइंट को छोड़कर, क्यों नहीं mkdir /tmp/backupable && mount --bind / /tmp/backupableऔर rsync? यह भी उन स्थानों में संग्रहीत किसी भी डेटा का बैकअप लेने का लाभ है जो वहां घुड़सवार कुछ द्वारा "छाया" कर रहे हैं।
n.st

@ n.st अच्छा विचार (lol)! मैंने सुझाव को प्रश्न में संपादित किया है, हालांकि मुझे अभी भी लगता है कि --exclude-fromयह एक बेहतर विचार है। यदि आपके पास समय है, तो आप इसे एक अलग उत्तर के रूप में लिख सकते हैं, आपके पास मेरा वोट है, और मैं इसका संदर्भ दे सकता हूं। यह उत्तर लंबे समय से पर्याप्त घुमावदार है।
गोल्डीलॉक्स

1
@IgorGanapolsky इरादा एक छवि नहीं बनाना है (पढ़ें "लेकिन पूरी छवि की नकल करना आसान है! इस से परेशान क्यों हो?" भाग)। एक बार बनाए रखने के लिए आसान और तेज़ होने के अलावा, यह विधि आम तौर पर अधिक लचीली होती है। यदि आप इसे बाद में बनाने के लिए उपयोग करना चाहते .imgहैं; यह और यह समझाने में मदद करनी चाहिए कि वे कैसे संरचित हैं और बनाए जा सकते हैं।
गोल्डीलॉक्स

1
शुरू होने वाले पैराग्राफ को देखें, "यह पूरी तरह से बैकअप नहीं है ..." । यह मूल रूप से रिवर्स में एक ही बात है। यह कुछ अवधारणाओं के साथ मदद कर सकता है जो लोग आमतौर पर / के बारे में भ्रमित होते हैं।
गोल्डीलॉक्स

24

रास्पबेरी समुदाय की एक कामकाजी पटकथा वहाँ के एक सदस्य द्वारा बनाई गई है।

आप कोड को पुन: उपयोग और ट्विक कर सकते हैं कि आप कैसे पसंद करते हैं। यह अच्छी तरह से प्रलेखित और आत्म व्याख्यात्मक है।

#!/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
जब वे rsync के साथ चल रहे होते हैं, तो मैं कई डिस्क का बैकअप लेता हूं, और मैं अक्सर इन फाइल बैकअप से वास्तव में वही प्राप्त करने में सक्षम होता हूं जो मुझे चाहिए। हालाँकि, सामान्य रूप से, एक यूनिक्स फाइल सिस्टम को पूरी तरह से कॉपी नहीं किया जा सकता है (फाइल और माउंट में हर बिट के साथ और सही)। सिस्टम को माउंट करते समय की गई एक प्रतिलिपि को कभी-कभी "गंदा कॉपी" कहा जाता है। एक गंदी कॉपी की गुणवत्ता में सुधार करने के लिए कई उपाय किए जा सकते हैं (जैसा कि ऊपर की स्क्रिप्ट में है, क्रोन और मायस्कल को बंद करना) लेकिन यह सही नहीं हो सकता है। चीयर्स! * - मैं इस बारे में गलत हूं, यह फाइल सिस्टम पर निर्भर करता है।
ताई विनीका

1
आप डेबियन अनुशंसित बैकअप उपयोगिताओं को देख सकते हैं और देख सकते हैं कि क्या पीआई का एक पोर्ट है। rsnapshotहोनहार लगता है
कुला

1
@TaiViinikka आपको एक परिपूर्ण प्रतिलिपि की आवश्यकता नहीं है। आप एक की जरूरत है आंशिक प्रतिलिपि कि (जल्दी और आसानी से हो सकते हैं) मूल आधार छवि पर फिर से लगा दिया। rsyncजाने का रास्ता है; जब मेरे पास कल का समय होगा मैं एक जवाब जोड़ दूंगा। rsnapshotजांच के लायक भी है।
गोल्डीलॉक्स

3
उपर्युक्त ppumkins के उत्तर के आधार पर, मैंने मूल थ्रेड में नवीनतम टिप्पणियों के साथ 'dd' स्क्रिप्ट को सिंक किया और अपने आप में कुछ सुधार किए। अंतिम परिणाम यहां उपलब्ध है: < github.com/aweijnitz/pi_backup >। कृपया सुधार जोड़ने और मुझे पुल अनुरोध भेजने में संकोच न करें।
एंडर्सडब्ल्यू

14

मैंने pi पर बैक-अप के लिए rsync पर @goldilocks उत्तर को अनुकूलित किया है। मैं ext4एक HDD पर एक विभाजन का बैकअप देता हूं जो Pi पर मुहिम करता है। यदि HDD माउंट नहीं है, तो rsync माउंट डायरेक्टरी (SD कार्ड पूरा होने तक) में कॉपी हो जाएगा। यदि HDD 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

निम्नलिखित के साथ पुनर्स्थापित करें (या किसी अन्य Pi को अपडेट करें): -

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

मैंने rsync-exclude.txtअनावश्यक फाइलों को खत्म करने के लिए बढ़ाया है ।

पहला समूह @goldilocks https://raspberrypi.stackexchange.com/users/5538/ द्वारा प्रलेखित निर्देशिकाएं हैं

दूसरा समूह ओएस एक्स द्वारा बनाई गई फाइलें और निर्देशिकाएं हैं जब मैं एएफपी (एप्पल फाइलिंग प्रोटोकॉल) का उपयोग करके अपने पाई का उपयोग करता हूं। (ये आमतौर पर ओएस एक्स पर अदृश्य होते हैं, लेकिन रास्पियन पर नहीं। किसी भी घटना में, बैकअप की कोई आवश्यकता नहीं है।) भले ही आप एएफपी का उपयोग कभी न करें, ये कोई नुकसान नहीं करेंगे।

तीसरा समूह ऐसी फाइलें हैं जिनका बैकअप लेने की आवश्यकता नहीं है (और निश्चित रूप से दूसरे पाई की नकल नहीं की जाती है)। उदाहरण नकली -hwclock.data, RPi-Monitor रिपोर्ट। आपके पास शायद दूसरे होंगे।

/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 फ़ाइल बनाने के लिए है ?
इगोरगानापोलस्की

@IgorGanapolsky अच्छी तरह से, सभी आवश्यक फ़ाइलों को देखते हुए (बूट फ़ाइलों को छोड़कर), यह स्पष्ट रूप से संभव है, लेकिन अगर आप चाहते हैं कि एक छवि एक छवि बनाये। आपको नई पोस्ट में कोई भी नया प्रश्न पूछना चाहिए, टिप्पणी नहीं।
मिलिविस

@Milliways को हमें "sudo rsync ..." का उपयोग क्यों नहीं करना चाहिए? कुछ फाइलें होंगी जिन्हें सिंक्रोनाइज़ नहीं किया जा सकता है?
स्मिलिया

6

मेरे पास अपने लोकल नेट में थ्री पीएस चल रहा है और उन्हें उठने और चलने पर क्रोन के साथ नियमित आधार पर बैकअप की आवश्यकता होती है। इसलिए मैंने एक स्क्रिप्ट बनाई जो dd, tar और rsync बैकअप बनाने और उन्हें पुनर्स्थापित करने में सक्षम है। मैं अपने बैकअप के लिए rsync का उपयोग करना पसंद करता हूं, लेकिन अन्य लोग dd या टार पसंद करते हैं। यह पहले से ही बहुत से लोगों द्वारा उपयोग किया जाता है। आशा है कि यह दूसरों के लिए भी उपयोगी है raspibackup - रास्पबेरी स्वयं का बैकअप बनाता है


1
नहीं, खेद: उपयोगकर्ता को चलाने के लिए पूछना (रूट के रूप में!) HTTP पर डाउनलोड की गई एक स्क्रिप्ट गैर जिम्मेदार है। कृपया इस स्क्रिप्ट को एक सुरक्षित चैनल पर वितरित करें।
क्लेमेंट

1
मुझे नहीं लगता कि यह विषय से अलग है, और जड़ या नहीं बहुत मायने नहीं रखता है। मुद्दा यह है कि सॉफ़्टवेयर को एक सुरक्षित चैनल पर वितरित किया जाना चाहिए, और आपका उत्तर खराब सुरक्षा प्रथाओं को प्रोत्साहित कर रहा है।
क्लेमेंट

1
यह एक महान कदम होगा, हाँ :)
क्लेमेंट

2
बस ध्यान दें कि HTTPS पर डिलीवरी किसी भी तरह से इस उदाहरण में कोई सुरक्षा नहीं जोड़ती है! आप अभी भी इंटरनेट से स्क्रिप्ट डाउनलोड कर रहे हैं और चला रहे हैं। सुरक्षित प्रक्रिया स्क्रिप्ट डाउनलोड करने के लिए है (http / https अप्रासंगिक है), एक संपादक में स्क्रिप्ट खोलें और इसे ऊपर से नीचे पढ़ें, विषमताओं और असुरक्षा के लिए इसे देखें। जब आप संतुष्ट हों तभी आपको इसे चलाना चाहिए। फ्रैम्प हम में से किसी के लिए एक हैकर हो सकता है और https पर डिलीवरी केवल उसे उस स्थिति में मुस्कुराहट देगा :) (BTW, कि एक आरोप नहीं है फ्रैम्प!)
जूलियन नाइट

2
मैं आपसे सहमत हुँ। इसलिए स्क्रिप्ट को स्थापित करने के दो तरीके बताए गए हैं: 1. इंस्टॉलरस्क्रिप्ट का उपयोग करें। इसे मैन्युअल रूप से डाउनलोड करें, कोड की जांच करें और फिर इसे मैन्युअल रूप से इंस्टॉल करें
फ्रिज करें।

3

इस तरह के उद्देश्यों के लिए यहां हमारा स्थिर उपकरण है: https://github.com/aktos-io/aktos-dcs-tools

यह उपकरण के लिए लिखा है make sshकनेक्शन, make backup-root, make mount-rootपहली बार में मन में दूरदराज के स्थानों, और उसके बाद स्थानीय सत्र जोड़ रहे हैं से। तो यह स्थानीय बैकअप, डायरेक्ट रिमोट बैकअप, प्रॉक्सी रिमोट बैकअप का समर्थन करता है। बैकअप को वृद्धिशील रूप से लिया जाता है (केवल अंतर को स्थानांतरित किया जाता है) और बैकअप निर्देशिका स्टैंडअलोन होते हैं (बस एक निर्देशिका / संस्करण को पुनर्स्थापित करने के लिए चुनते हैं, किसी भी निर्देशिका का पूर्ण बैकअप होता है)। बेशक, आपके पास संस्करण हैं (backup.last-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

यहां पूरी तरह से अलग दृष्टिकोण है। आप उपयोग कर सकते हैं एलवीएम ( एल 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 को सेटअप करने में केवल एक बार थोड़ा प्रयास करना पड़ता है । कैसे है कि आप देख सकते हैं करने के लिए आसान बैकअप और एलवीएम के साथ एक चल प्रणाली की फोटो


0

मुझे एक बैकअप टूल मिला है जो इंस्टॉल करने योग्य चित्र बनाता है।

इसमें छवियों को माउंट और सिकोड़ने के लिए उपयोगिताओं भी हैं।

यह दूसरों के लिए उपयोगी हो सकता है

इसके साथ आने वाला प्रलेखन बहुत संक्षिप्त है इसलिए मैं निम्नलिखित बातों पर ध्यान देता हूं: -

  1. उपयोगिताओं को किसी भी निर्देशिका में निकालें और स्क्रिप्ट को निष्पादन योग्य बनाएं।
  2. ext4अपने Pi पर /mntया /media(किसी भी प्रारूप में जो बड़ी फ़ाइलों की अनुमति देता है और Pi उदा। ExFAT या एक नेटवर्क ड्राइव द्वारा समर्थित किया जा सकता है) पर एक स्वरूपित विभाजन को माउंट करें ।
  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 / [अपने sd कार्ड का NAME] bs = 1M' टाइप करें।
इसमें कुछ समय लगेगा ताकि आप इसे पृष्ठभूमि में चलाना चाहें।
यह वही सटीक तरीका है जिससे आप लिनक्स में अपने एसडी कार्ड का बैकअप लेते हैं।


यह भी अनावश्यक और अवांछनीय फ़ाइलों का समर्थन करता है।
इगोरगानापोलस्की

3
यह एक असंगत बैकअप बना देगा क्योंकि एक रनिंग सिस्टम पर बैकअप के दौरान चीजें बदल जाती हैं!
इंगो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.