Κεφάλαιο – 11
Δημιουργία αντιγράφων ασφαλείας
Γιατί δημιουργία αντιγράφων ασφαλείας;
“Η πρόληψη είναι πάντα καλύτερη από τη θεραπεία”. Η δημιουργία αντιγράφων ασφαλείας είναι επίσης σημαντικό μέρος της πρόληψης καταστροφής δεδομένων, η οποία μπορεί να μας βοηθήσει να ξεπεράσουμε τη συντριβή του δίσκου ή οποιοδήποτε άλλο είδος απώλειας δεδομένων. Σε αυτό το κεφάλαιο, θα συζητήσουμε πώς μπορούμε να ανακτήσουμε τα δεδομένα ακόμα και μετά από κάποια σοβαρά σφάλματα δίσκου, μόνο με τη βοήθεια αντιγράφων ασφαλείας που έχουν δημιουργηθεί προηγουμένως.
Η ανάκτηση που γίνεται από τα προηγουμένως αποθηκευμένα αντίγραφα ασφαλείας είναι, σχεδόν πάντα, έως και 100 τοις εκατό, ωστόσο ο διάφορος τύπος σφάλματος δίσκου μπορεί να προκαλέσει τη διακύμανση των αποτελεσμάτων ανάκτησης σε ορισμένες συγκεκριμένες περιπτώσεις.
Η ανάκτηση δεδομένων με τη βοήθεια αντιγράφων ασφαλείας είναι αρκετά εύκολη, γρήγορη και αξιόπιστη και μπορεί να δώσει τα καλύτερα αποτελέσματα, ενώ η ανάκτηση δεδομένων χωρίς αντίγραφα ασφαλείας είναι μια δύσκολη, περίπλοκη διαδικασία που μπορεί να απαιτεί πολύ χρόνο και ακόμη και τότε φοβόμαστε ότι δεν λαμβάνετε τα 100 τοις εκατό δεδομένα σε αρκετές περιπτώσεις.
Πότε και τι να δημιουργήσετε αντίγραφα ασφαλείας
Υπάρχουν πολλές διαφορετικές περιοχές στο δίσκο για τις οποίες θα πρέπει να δημιουργηθούν αντίγραφα ασφαλείας μία φορά ή σε διαφορετικά χρονικά διαστήματα. Ο παρακάτω πίνακας δίνει την ιδέα των μέτρων πλήρους δημιουργίας αντιγράφων ασφαλείας και σας βοηθά να μάθετε πότε και τι να δημιουργήσετε αντίγραφα ασφαλείας:
Τι να δημιουργήσετε αντίγραφα ασφαλείας |
Πότε να δημιουργείται αντίγραφο ασφαλείας |
Δημιουργία αντιγράφων ασφαλείας του MBR |
Μία φορά μετά το FDISK. Το MBR δημιουργείται από την εντολή FDISK του DOS. Μπορείτε να δημιουργήσετε αντίγραφα ασφαλείας του MBR Μετά το FDISK, ωστόσο ακόμη και μετά τη ΜΟΡΦΗ των κατατμήσεων που δημιουργήθηκαν από το FDISK, το MBR παραμένει Αμετάβλητο. |
Δημιουργία αντιγράφων ασφαλείας του DBR |
Δημιουργήστε αντίγραφα ασφαλείας των DBR για κάθε λογική μονάδα δίσκου μία φορά, μετά το FORMAT. |
Δημιουργία αντιγράφων ασφαλείας καταχωρήσεων FAT και καταλόγου. |
Οι καταχωρήσεις FAT και καταλόγου αλλάζουν κάθε φορά που δημιουργείτε διαγραφή αρχείων ή καταλόγων. Επομένως, συνιστάται να λαμβάνετε αντίγραφα ασφαλείας καθημερινά. |
Δημιουργία αντιγράφων ασφαλείας δεδομένων χρήστη |
Πρέπει να λαμβάνεται τακτικά. Αυτός ο τύπος δημιουργίας αντιγράφων ασφαλείας προκαλεί την απεικόνιση του δίσκου. Ωστόσο, χρειάζεται χρόνος, ωστόσο οι περισσότερες από τις εταιρείες που έχουν πολύ ευαίσθητα δεδομένα στους δίσκους τους θέλουν να περνούν το χρόνο τους στην απεικόνιση δίσκου, επειδή με αυτόν τον τρόπο μπορούν να δημιουργήσουν αντίγραφα ασφαλείας όλων των πληροφοριών που περιγράφονται παραπάνω. |
Εκτός αυτού, θα πρέπει να δημιουργήσετε μια δισκέτα εκκίνησης έκτακτης ανάγκης για το σύστημα. Εάν υπάρχει οποιοσδήποτε τύπος καταστροφής με τα δεδομένα στον σκληρό σας δίσκο, μπορείτε να εκκινήσετε το σύστημά σας με τη βοήθεια αυτής της δισκέτας και να αναλύσετε το δίσκο για σφάλματα.
Backup του MBR (Master Boot Record) και η χρήση του
Το Master Boot Record (MBR) ή μερικές φορές αναφέρεται ως The master partition table (MPT), περιέχει ένα μικρό πρόγραμμα για τη φόρτωση και εκκίνηση του ενεργού (ή εκκινήσιμου) διαμερίσματος από τη μονάδα σκληρού δίσκου. Η κύρια εγγραφή εκκίνησης περιέχει πληροφορίες και για τα τέσσερα κύρια διαμερίσματα.
Για μια λεπτομερή μελέτη σχετικά με το MBR, ανατρέξτε στο κεφάλαιο "Λογική προσέγγιση σε δίσκους και λειτουργικό σύστημα", που συζητήθηκε νωρίτερα σε αυτό το βιβλίο.
Το MBR βρίσκεται στον Απόλυτο Τομέα 0 ή μπορούμε να πούμε στον κύλινδρο 0, την κεφαλή 0 και τον τομέα1. Δημιουργείται στη μονάδα σκληρού δίσκου εκτελώντας την εντολή FDISK.EXE του DOS.
Γιατί να δημιουργήσετε αντίγραφα ασφαλείας MBR:
Το MBR επιτρέπει στον τομέα εκκίνησης του ενεργού διαμερίσματος να λάβει τον έλεγχο κατά την εκκίνηση του συστήματος.
Μετά τον αυτοέλεγχο κατά την ενεργοποίηση (POST), το BIOS φορτώνει το MBR (Κύρια εγγραφή εκκίνησης) από τον σκληρό δίσκο στη μνήμη και στη συνέχεια το εκτελεί. Πρώτα το MBR ελέγχει τον σκληρό δίσκο για ενεργό διαμέρισμα, μετά φορτώνει το DOS Boot Record (DBR) στη μνήμη και μεταθέτει τον έλεγχο στον κωδικό εκκίνησης του λειτουργικού συστήματος και, στη συνέχεια, ο κωδικός εγγραφής εκκίνησης λειτουργικού συστήματος φορτώνει το υπόλοιπο λειτουργικό σύστημα στο Μνήμη.
Εκεί μπορούμε να πούμε ότι εάν το MBR του δίσκου είναι κατεστραμμένο, ο σκληρός δίσκος είναι σχεδόν νεκρός και το σύστημα δεν μπορεί να εκκινήσει ή να εκτελέσει εντελώς το λειτουργικό σύστημα. Σε μια τέτοια κατάσταση, όλα τα δεδομένα που είναι αποθηκευμένα στον σκληρό δίσκο, καθίστανται απρόσιτα. Γενικά τα Μηνύματα Σφάλματος εμφανίζονται ως εξής:
“Μη έγκυρος πίνακας διαμερισμάτων” “Σφάλμα κατά τη φόρτωση του λειτουργικού συστήματος” “Λείπει λειτουργικό σύστημα»
Τι μπορεί να ανακτηθεί με το αντίγραφο ασφαλείας του MBR;
Το αντίγραφο ασφαλείας του MBR μπορεί να σας βοηθήσει να απαλλαγείτε από τα παραπάνω μηνύματα Σφάλματος. Με το αντίγραφο ασφαλείας, τα ακόλουθα προβλήματα μπορούν να διορθωθούν:
- Σφάλμα κατά τη φόρτωση του λειτουργικού συστήματος, λόγω κατεστραμμένου IPL (Initial Program Loader)
- Χαμένα κύρια διαμερίσματα
- Πληροφορίες κατεστραμμένων διαμερισμάτων
- Μη έγκυρος μαγικός αριθμός
Σύνταξη του προγράμματος για τη δημιουργία αντιγράφων ασφαλείας του MBR:
/* Πρόγραμμα για τη δημιουργία αντιγράφων ασφαλείας του MBR */
#include <bios.h>
#include <stdio.h>
int main(void)
{
struct diskinfo_t dinfo; /* Structure to Hold the
information of disk Parameters */
int result;
int count=0;
char filename[80]; /* Stores the File name given by
User */
static char dbuf[512]; /* Data Buffer of 512 Bytes */
FILE *fp;
dinfo.drive = 0x80; /* drive number for First Hard
Disk */
dinfo.head = 0; /* disk head number */
dinfo.track = 0; /* track number */
dinfo.sector = 1; /* sector number */
dinfo.nsectors = 1; /* sector count */
dinfo.buffer = dbuf; /* data buffer */
printf("\n Enter The Filename and path to store the
Backup of MBR \n ");
gets(filename);
// Ανοίξτε το αρχείο για να αποθηκεύσετε το αντίγραφο ασφαλείας MBR \\
if((fp=fopen(filename,"wb"))==NULL)
{
printf("Could not Create File, Press any key to
Exit...");
getch();
exit(0);
}
printf("Attempting to read from Hard disk drive :\n");
//// Διαβάστε τον Καθορισμένο Τομέα Δίσκου \\\\
result = _bios_disk(_DISK_READ, &dinfo);
if ((result & 0xff00) == 0)
{
printf("Disk read from hard disk drive :
successful.\n");
/// Γράψτε 512 Byte MBR στο Αρχείο \\\\
while(count<512)
{
fprintf(fp,"%c",dbuf[count] & 0xff );
count++;
}
fclose(fp);
}
else
printf("Cannot read Hard Disk drive, status = 0x%02x\n", result);
return 0;
}
Σχόλια σχετικά με την κωδικοποίηση προγράμματος:
Στην κωδικοποίηση προγράμματος που δόθηκε προηγουμένως, βασικά προχωράμε στην εκτέλεση των παρακάτω εργασιών βήμα προς βήμα:
- Το dinfo δείχνει στη δομή diskinfo_t που περιέχει τις πληροφορίες των παραμέτρων που απαιτούνται από τη λειτουργία που εκτελείται από τη συνάρτηση _bios_disk.
- Δεδομένου ότι θέλουμε να διαβάσουμε τον πρώτο τομέα του δίσκου, η θέση του τομέα θα είναι η εξής:
Παράμετρος |
Τι σημαίνει |
dinfo.drive = 0x80 |
It indicates the Physical drive 80H that is the first Hard disk drive. |
dinfo.head = 0 |
It points to head number 0 |
dinfo.track = 0 |
It points to track 0 |
dinfo.sector = 1 |
First sector of the floppy that is sector 1 |
dinfo.sector = 1 |
>Number of sectors to consider for read operation = 1 |
dinfo.buffer = dbuf |
Data buffer for the operation |
- Ανοίξτε μια ροή αρχείου με όνομα αρχείου και διαδρομή που έχει δοθεί από το χρήστη για να αποθηκεύσετε το αντίγραφο ασφαλείας του MBR των 512 byte ακριβώς. Το όνομα του αρχείου και η διαδρομή αποθηκεύονται στο όνομα αρχείου του πίνακα χαρακτήρων.
- _bios_disk(_DISK_READ, &dinfo) διαβάζει τον πρώτο τομέα του σκληρού δίσκου (80H), που καθορίζεται από το dinfo.
- Η κατάσταση που επιστράφηκε, αποθηκεύεται ως αποτέλεσμα που χρησιμοποιείται για την εμφάνιση του μηνύματος για επιτυχή λειτουργία ή για την εμφάνιση μηνύματος σφάλματος στην οθόνη εάν παρουσιαστεί κάποιο σφάλμα.
Πρόγραμμα επαναφοράς του MBR από το Backup:
Εάν το MBR είναι κατεστραμμένο, το πρόγραμμα που δίνεται στη συνέχεια βοηθά στην επαναφορά του MBR Back.
Θα πρέπει πάντα να έχετε κατά νου ότι η παράνομη χρήση ή η χρήση ελλιπούς γνώσης αυτού του προγράμματος μπορεί να καταστρέψει τις πληροφορίες δεδομένων σας στον σκληρό δίσκο και να καταστήσει απρόσιτα όλα τα δεδομένα. Θα πρέπει να είστε σίγουροι για το τι πρόκειται να κάνετε. Διαφορετικά μπορεί να περιπλέκετε περισσότερο το πρόβλημα.
Πρόγραμμα επαναφοράς του MBR από το Backup:
Η κωδικοποίηση του προγράμματος είναι η εξής:
/* Πρόγραμμα για την επαναφορά του αντιγράφου ασφαλείας του MBR από το αρχείο αντιγράφου ασφαλείας */
#include <bios.h>
#include <stdio.h>
int main(void)
{
struct diskinfo_t dinfo;
int result;
int count=0;
char filename[80]; /* Stores the File name given
by User */
static char dbuf[512]; /* Data Buffer of 512 Bytes
*/
FILE *fp;
/* Λάβετε την είσοδο χρήστη για τη διαδρομή αρχείου αντιγράφων ασφαλείας MBR */
printf("\n Enter The Filename and path of Backup File of
MBR \n ");
gets(filename);
if((fp=fopen(filename,"rb"))==NULL)
{
printf("Could not open Backup File, Press any key
to Exit...");
getch();
exit(1);
}
/* Τα δεδομένα MBR πρέπει να είναι Ακριβώς 512 Byte */
while(count<512)
{
fscanf(fp,"%c",&dbuf[count]);
count++;
}
fclose(fp);
printf("Attempting to Write to Hard disk drive :\n");
dinfo.drive = 0x80; /* drive number for First
Hard Disk */
dinfo.head = 0; /* disk head number */
dinfo.track = 0; /* track number */
dinfo.sector = 1; /* sector number */
dinfo.nsectors = 1; /* sector count */
dinfo.buffer = dbuf; /* data buffer */
result = _bios_disk(_DISK_WRITE, &dinfo);
if ((result & 0xff00) == 0)
{
printf("Restoring the Backup of MBR to The Disk
Sector: successful.\n");
}
else
printf("Cannot Write on Hard Disk drive, status =
0x%02x\n", result);
return 0;
}
Σχόλια σχετικά με την κωδικοποίηση προγράμματος:
Στην κωδικοποίηση προγράμματος που δίνεται παραπάνω, βασικά προχωράμε στην εκτέλεση των παρακάτω εργασιών βήμα προς βήμα:
- Το dinfo δείχνει στη δομή diskinfo_t που περιέχει τις πληροφορίες των παραμέτρων που απαιτούνται από τη λειτουργία που εκτελείται από τη συνάρτηση _bios_disk.
- Δεδομένου ότι θέλουμε να γράψουμε στον πρώτο τομέα του δίσκου, η θέση του τομέα θα είναι η εξής:
Παράμετρος |
Τι σημαίνει |
dinfo.drive = 0x80 |
It indicates the Physical drive 80H that is the first Hard disk drive. |
dinfo.head = 0 |
It points to head number 0 |
dinfo.track = 0 |
It points to track 0 |
dinfo.sector = 1 |
First sector of the floppy that is sector 1 |
dinfo.sector = 1 |
Number of sectors to consider for read operation = 1 |
dinfo.buffer = dbuf |
Data buffer for the operation |
- Το όνομα αρχείου και η διαδρομή του Backup of MBR, που δίνονται από τον χρήστη, αποθηκεύονται στο όνομα αρχείου του πίνακα χαρακτήρων. Θα πρέπει να έχετε κατά νου ότι οι πληροφορίες MBR πρέπει να είναι Ακριβώς 512 byte.
- Το _bios_disk(_DISK_WRITE, &dinfo) εγγράφει τα δεδομένα στον πρώτο τομέα του σκληρού δίσκου (80H), που καθορίζεται από το dinfo.
- Η κατάσταση που επιστράφηκε, αποθηκεύεται ως αποτέλεσμα που χρησιμοποιείται για την εμφάνιση του μηνύματος για επιτυχή λειτουργία ή για την εμφάνιση ενός μηνύματος σφάλματος στην οθόνη εάν παρουσιαστεί κάποιο σφάλμα.
Backup του DBR (DOS Boot Record) και η χρήση του
Μετά τον πίνακα διαμερισμάτων, το DOS Boot Record (DBR) ή μερικές φορές ονομάζεται DOS Boot Sector είναι η δεύτερη πιο σημαντική πληροφορία στον σκληρό σας δίσκο.
Για μια λεπτομερή μελέτη σχετικά με το DBR, ανατρέξτε στο κεφάλαιο “Λογική προσέγγιση σε δίσκους και λειτουργικό σύστημα”, που συζητήθηκε νωρίτερα σε αυτό το βιβλίο.
Ο πρώτος λογικός τομέας κάθε διαμερίσματος DOS θα περιέχει ένα DOS Boot Record (DBR) ή DOS Boot Sector. Η δουλειά του DBR είναι να φορτώσει το λειτουργικό σύστημα από τη μονάδα σκληρού δίσκου στην κύρια μνήμη του υπολογιστή και να δώσει τον έλεγχο του συστήματος στο φορτωμένο πρόγραμμα.
Το DOS Boot Record (DBR) για το πρώτο διαμέρισμα σε έναν σκληρό δίσκο βρίσκεται συνήθως στον Absolute Sector 63 (ο 64ος τομέας στη μονάδα δίσκου) ή σε μορφή CHS μπορούμε να πούμε C–H–S = 0–1&ndash ;1 για τις περισσότερες μονάδες δίσκου.
Ωστόσο, αυτή η τοποθεσία μπορεί να διαφέρει ανάλογα με το SPT (Τομείς ανά ίχνος) του Drive. Για παράδειγμα, σε μια παλιά μονάδα δίσκου 245 MB με μόνο 31 SPT, η εγγραφή εκκίνησης βρισκόταν στον 32ο τομέα (Absolute Sector 31).
Το DBR δημιουργείται με την εντολή FORMAT του DOS, αφού γίνει η κατάτμηση χρησιμοποιώντας την εντολή FDISK. Ο τομέας στον οποίο βρίσκεται το DBR γίνεται λογικός τομέας 1 αυτού του συγκεκριμένου διαμερίσματος για το DOS. Ο αριθμός τομέα που χρησιμοποιείται από το DOS ξεκινά από τον φυσικό τομέα στον οποίο βρίσκεται το DBR.
Το DBR περιέχει ένα μικρό πρόγραμμα το οποίο εκτελείται από το εκτελέσιμο πρόγραμμα Master Boot Record (MBR). Όλα τα διαμερίσματα του DOS περιέχουν τον κωδικό προγράμματος για την εκκίνηση του μηχανήματος, δηλαδή τη φόρτωση του λειτουργικού συστήματος, αλλά μόνο σε αυτό το διαμέρισμα δίνεται ο έλεγχος από το Master Boot Record, το οποίο όπως ορίζεται ως ενεργό διαμέρισμα, στην καταχώρηση του πίνακα κατατμήσεων.
Γιατί να δημιουργήσετε αντίγραφα ασφαλείας DBR:
Το DBR περιέχει ορισμένες σημαντικές πληροφορίες σχετικά με τη γεωμετρία του δίσκου. Αυτές οι πληροφορίες βρίσκονται στον πρώτο τομέα κάθε διαμερίσματος, όπως:
- Κωδικός μετάβασης + NOP
- Όνομα και έκδοση OEM
- Byte ανά τομέα
- Τομείς ανά σύμπλεγμα
- Δεσμευμένοι τομείς
- Αριθμός αντιγράφων FAT
- Μέγιστες καταχωρήσεις καταλόγου ρίζας (αλλά δεν είναι διαθέσιμες για το FAT32)
- Αριθμός τομέων σε διαμέρισμα μικρότερο από 32 MB (επομένως δεν είναι διαθέσιμο για FAT32)
- Περιγραφέας πολυμέσων (F8H για σκληρούς δίσκους)
- Τομείς ανά FAT (σε παλαιότερα συστήματα FAT και δεν είναι διαθέσιμοι για FAT32)
- Τομείς ανά κομμάτι
- Αριθμός κεφαλαίων
- Αριθμός κρυφών τομέων στο διαμέρισμα
- Αριθμός τομέων σε κατάτμηση
- Αριθμός τομέων ανά FAT
- Σημαίες περιγραφής πληροφοριών FAT
- Έκδοση της μονάδας δίσκου FAT32
- Αριθμός συμπλέγματος για την έναρξη του καταλόγου ρίζας
- Αριθμός τομέα του τομέα πληροφοριών συστήματος αρχείων
- Αριθμός τομέα του τομέα εκκίνησης αντιγράφων ασφαλείας
- Με κράτηση
- Λογικός αριθμός διαμερίσματος μονάδας δίσκου
- Εκτεταμένη υπογραφή (29H)
- Σειριακός αριθμός διαμερίσματος
- Όνομα τόμου του διαμερίσματος
- Όνομα FAT
- Εκτελέσιμος κώδικας
- Εκτελέσιμος δείκτης ή μαγικός αριθμός (AAH 55H)
Γενικά, τα ακόλουθα μηνύματα σφάλματος εμφανίζονται στην οθόνη:
“Αποτυχία εκκίνησης δίσκου”
“Σφάλμα εκτός συστήματος δίσκου ή δίσκου”
“Μη έγκυρος δίσκος συστήματος ή σφάλμα εισόδου/εξόδου δίσκου”
“Αντικαταστήστε το δίσκο και, στη συνέχεια, πατήστε οποιοδήποτε πλήκτρο…”
Τι μπορεί να ανακτηθεί με το Backup του DBR;
Το αντίγραφο ασφαλείας του DBR μπορεί να σας βοηθήσει να απαλλαγείτε από τα παραπάνω μηνύματα Σφάλματος. Αυτά τα μηνύματα λάθους Στην οθόνη περιμένετε να τοποθετήσει ο χρήστης έναν δίσκο εκκίνησης με τα προαναφερθέντα προγράμματα στη μονάδα δισκέτας και να πατήσει ένα πλήκτρο.
Η μονάδα δίσκου θα πρέπει να είναι προσβάσιμη εάν εκκινήσετε το σύστημα από τη δισκέτα ή το CD με δυνατότητα εκκίνησης. Παρόλο που ο σκληρός δίσκος δεν είναι εκκινήσιμος, αλλά γενικά αυτό δεν πρέπει να επηρεάζει την πρόσβαση στα δεδομένα της μονάδας δίσκου. Μετά την εκκίνηση του συστήματος με τον εκκινήσιμο δίσκο, μπορείτε να αποκτήσετε πρόσβαση στα δεδομένα.
Με την επαναφορά του αντιγράφου ασφαλείας του DBR, μπορείτε να ξεπεράσετε τα προβλήματα που δημιουργούνται, όπως αναφέρθηκε παραπάνω.
Προγράμματα για δημιουργία και επαναφορά αντιγράφων ασφαλείας του DBR:
Τα προγράμματα για τη δημιουργία αντιγράφων ασφαλείας των DBR και την επαναφορά τους είναι σχεδόν παρόμοια με τα προγράμματα του MBR backup και για επαναφορά.
Για παράδειγμα, εάν πρόκειται να γράψετε τα προγράμματα για τη δημιουργία αντιγράφων ασφαλείας του DBR της Πρώτης λογικής μονάδας δίσκου και να την επαναφέρετε, οι παράμετροι που καθορίζονται από τη δομή dinfo θα αλλάξουν ως εξής:
Παράμετρος |
Τι σημαίνει |
dinfo.drive = 0x80 |
It indicates the Physical drive 80H that is the first Hard disk drive> |
dinfo.head = 1 |
It points to head number 1 |
dinfo.track = 0 |
It points to track 0 |
dinfo.sector = 1 |
First sector of the floppy that is sector 1 |
dinfo.sector = 1 |
Number of sectors to consider for read operation = 1 |
dinfo.buffer = dbuf |
Data buffer for the operation |
Εδώ βλέπουμε ότι αλλάζει μόνο η θέση του τομέα ανάγνωσης/εγγραφής. Εδώ το C-H-S δίνεται ως 0-1-1 καθώς το DBR της πρώτης λογικής μονάδας είναι αποθηκευμένο εδώ.
Ολοκληρωμένη απεικόνιση δίσκου
Αυτός ο τύπος δημιουργίας αντιγράφων ασφαλείας γίνεται όλο και πιο δημοφιλής σήμερα και προτιμάται περισσότερο από τέτοιους οργανισμούς που έχουν πολύ ευαίσθητα δεδομένα στα συστήματά τους. Αυτοί οι άνθρωποι δεν μπορούν να πάρουν καμία πιθανότητα ούτε ένα τοις εκατό απώλειας δεδομένων.
Τέτοιοι οργανισμοί λαμβάνουν τακτικά τα αντίγραφα ασφαλείας τους ως ολόκληρη εικόνα δίσκου. Αν και χρειάζεται λίγος χρόνος, αλλά σας δίνει τη βεβαιότητα ότι δεν θα χάσετε τίποτα. Λόγω της αυξανόμενης δημοτικότητάς του, οι προγραμματιστές προσπάθησαν να κάνουν το λογισμικό απεικόνισης δίσκου όλο και πιο γρήγορο για να ελαχιστοποιήσουν τη χρονική περίοδο που απαιτείται από τη διαδικασία απεικόνισης.
Η απεικόνιση δίσκου είναι μια καλή ιδέα, γιατί απλώς αφιερώνοντας μερικές δεκάδες λεπτά μπορείτε να έχετε το μυαλό σας ότι έχετε αντίγραφο ασφαλείας των πάντων στην τσέπη σας. Όλοι οι παράγοντες όπως MBR, BDR, FATs, Root Directories αντιγράφονται στο δίσκο προορισμού ως έχει.
Αυτό που χρειαζόμαστε για την απεικόνιση δίσκου είναι ένας Πανομοιότυπος (ή σχεδόν Πανομοιότυπος) σκληρός δίσκος προορισμού, με τον σκληρό δίσκο προέλευσης στον οποίο έχουμε τα πολύτιμα δεδομένα μας. Ένα πράγμα λαμβάνεται πάντα υπόψη ότι ο δίσκος προορισμού δεν πρέπει να είναι μικρότερος από τον δίσκο προέλευσης.
Μετά τη λήψη της πλήρους εικόνας, εάν εκκινήσετε το σύστημα με τον δίσκο προορισμού, στον οποίο έχετε τραβήξει την εικόνα του δίσκου, γενικά θα λάβετε όλα τα δεδομένα ως έχουν.
Σύνταξη του προγράμματος για πλήρη απεικόνιση δίσκου
Το πρόγραμμα για την απεικόνιση δίσκου έχει δοθεί στη συνέχεια. Το Πρόγραμμα χρησιμοποιεί τις επεκτάσεις INT 13H, επομένως μπορεί να υποστηρίξει και μεγάλους δίσκους.
Το πρόγραμμα μεταφέρει την εικόνα της πρώτης φυσικής μονάδας σκληρού δίσκου (0x80) στη δεύτερη φυσική μονάδα σκληρού δίσκου (0x81), επομένως, πριν δημιουργήσετε το αντίγραφο ασφαλείας, θα πρέπει να έχετε υπόψη σας ότι όλα τα δεδομένα στον δίσκο προορισμού (0x81) θα να αντικατασταθεί από τα δεδομένα του δίσκου προέλευσης (0x80) ανά μοτίβο τομέα.
Η κωδικοποίηση του προγράμματος έχει δοθεί στη συνέχεια:
/* Πρόγραμμα για τη δημιουργία της εικόνας του πρώτου σκληρού δίσκου (0x80) στον δεύτερο σκληρό δίσκο (0x81) */
#include<stdio.h>
#include<dos.h>
#include<conio.h>
/* Δομή που θα χρησιμοποιηθεί από τη συνάρτηση getdrivegeometry χρησιμοποιώντας την επέκταση INT 13H, Αριθμός συνάρτησης 0x48. */
struct geometry
{
unsigned int size ; /* (call) size of Buffer */
unsigned int flags ; /* Information Flags */
unsigned long cyl ; /* Number of Physical
Cylinders on Drive */
unsigned long heads ;/* Number of Physical
Heads on Drive */
unsigned long spt ; /* Number of Physical
Sectors Per Track */
unsigned long sectors[2] ; /* Total Number of
Sectors on Drive */
unsigned int bps ; /* Bytes Per Sector */
} ;
/* Δομή της μορφής πακέτου διεύθυνσης δίσκου, για χρήση από τις συναρτήσεις, readabsolutesectors και writeabsolutesectors */
struct diskaddrpacket
{
char packetsize ; /* Size of Packet, generally 10H */
char reserved ; /* Reserved (0) */
int blockcount ; /* Number of Blocks to Transfer */
char far *bufferaddress ; /* address to Transfer
Buffer */
unsigned long blocknumber[2] ; /* Starting Absolute
Block Number */
} ;
///// Λειτουργία λήψης παραμέτρων μονάδας δίσκου \\\\\
unsigned long getdrivegeometry (int drive)
{
union REGS i, o ;
struct SREGS s ;
struct geometry g = { 26, 0, 0, 0, 0, 0, 0, 0 } ;
i.h.ah = 0x48 ; /* Function Number 0x48 of INT 13H
Extensions See the Comments
Below */
i.h.dl = drive; /* Drive Number */
i.x.si = FP_OFF ( (void far*)&g ) ;
s.ds = FP_SEG ( (void far*)&g ) ;
/* Επικαλέστε τον καθορισμένο αριθμό συνάρτησης της επέκτασης INT 13H με Τιμές καταχώρησης τμήματος */
int86x ( 0x13, &i, &o, &s ) ;
printf("\n Head = %lu, Sectors Per Track = %lu, Cylinder =
%lu\n", g.heads, g.spt, g.cyl);
/* Εάν η λειτουργία λήψης μονάδας γεωμετρίας αποτύχει, εμφανίστε το μήνυμα σφάλματος και πραγματοποιήστε έξοδο */
if(g.spt==0)
{
printf("\n Get Drive Geometry Function Fails....");
printf("\n Extensions Not Supported, Press any Key to
Exit...");
getch();
exit(1);
}
return *g.sectors; /* Return The Number of Sectors
on Drive */
}
//////Έναρξη του Main \\\\\\
void main()
{
unsigned long loop=0, Sectors_in_HDD1=0, Sectors_in_HDD2=0;
unsigned char buffer[61440]; /* Data buffer of 61440
Bytes to Read/Write 120 Sectors of 512 Bytes at a time to save time. */
char choice;
clrscr();
/* Εάν συνολικά όχι. των συνδεδεμένων σκληρών δίσκων είναι λιγότερο από δύο Εμφάνιση Μήνυμα Σφάλματος και Έξοδος. */
if(((char)peekb(0x0040, 0x0075))<2)
{
printf("\n\n You Must Have At least Two Hard Disks
Attached to your Computer To Run This");
printf("\n Program. Press any Key to Exit... ");
getch();
exit(1);
}
/// Λήψη παραμέτρων του πρώτου σκληρού δίσκου (0x80) \\\
Sectors_in_HDD1 = getdrivegeometry (0x80);
printf(" Total Sectors in First Hard Disk = %lu\n\n",
Sectors_in_HDD1);
/// Λήψη παραμέτρων του δεύτερου δίσκου Hsrd (0x81) \\\
Sectors_in_HDD2 = getdrivegeometry (0x81);
printf(" Total Sectors in Second Hard Disk = %lu\n\n",
Sectors_in_HDD2);
/// Πρώτα επιβεβαιώστε και μετά προχωρήστε \\\
printf("\n All The Data in Second Hard Disk will be
lost !!!");
printf("\n Press \'Y\' to Continue, Else any key to
Exit... ");
choice = getche();
switch(choice)
{
case 'y':
case 'Y':
break;
default:
exit(0);
}
/* Ο προορισμός δεν πρέπει να είναι μικρότερος από την πηγή */
if(Sectors_in_HDD2<Sectors_in_HDD1)
{
printf("\n\n Destination Disk should not be Smaller
than Source Disk");
printf("\n Press any Key to Exit...");
getch();
exit(0);
}
/* Εάν όλα είναι εντάξει, αντιγράψτε όλους τους τομείς του δίσκου προέλευσης στον σκληρό δίσκο προορισμού */
gotoxy(10,15);printf("Copying Absolute Sector: ");
for(loop=0;loop< =Sectors_in_HDD1;loop=loop+120)
{
readabsolutesectors ( 0x80, loop, 120, buffer );
writeabsolutesectors ( 0x81, loop, 120, buffer );
gotoxy(36,15); printf("%ld",loop);
if(kbhit())
{
exit(0);
}
}
//// Εμφάνιση του μηνύματος ολοκλήρωσης \\\
printf("\n\n Disk Imaging is Now Completed, Press any Key
To Exit...");
getch();
}
//// Τέλος κύριας
Σχόλια σχετικά με την κωδικοποίηση:
Στην κωδικοποίηση του προγράμματος που δόθηκε προηγουμένως, για την απεικόνιση δίσκου Προχωράμε εκτελώντας τις ακόλουθες εργασίες:
- Το Structure, geometry χρησιμοποιείται από τη συνάρτηση getdrivegeometry χρησιμοποιώντας την επέκταση INT 13H, Αριθμός συνάρτησης 0x48. Για μια λεπτομερή περιγραφή των επεκτάσεων INT 13H, ανατρέξτε στο κεφάλαιο “Χειρισμός μεγάλων σκληρών δίσκων”, που συζητήθηκε νωρίτερα σε αυτό το βιβλίο.
Οι τύποι δεδομένων που αντιπροσωπεύουν πολλές παραμέτρους του δίσκου έχουν τις ακόλουθες έννοιες:
Τύπος δεδομένων |
Μέγεθος σε Byte |
Περιγραφή |
unsigned int size |
2 Bytes |
Size of Buffer |
unsigned int flags |
2 Bytes |
Information Flags |
unsigned long cyl |
4 Bytes |
Number of Physical Cylinders on Drive |
unsigned long heads |
4 Bytes |
Number of Physical Heads on Drive |
unsigned long spt |
4 Bytes |
Number of Physical Sectors Per Track |
unsigned long sectors[2] |
8 Bytes |
Total Number of Sectors on Drive |
unsigned int bps |
2 Bytes |
Bytes Per Sector |
- Η δομή diskaddrpacket χρησιμοποιείται από τις συναρτήσεις readabsolutesectors και writeabsolutesectors. Η μορφή του πακέτου διευθύνσεων δίσκου έχει δοθεί στον ακόλουθο πίνακα:
Τύπος δεδομένων |
Μέγεθος σε Byte |
Περιγραφή |
char packetsize |
1 Byte |
Size of Packet, generally 10H |
char reserved |
1 Byte |
Reserved (0) |
int blockcount |
2 Bytes |
Number of Blocks to Transfer |
char far *bufferaddress |
4 Bytes |
address to Transfer Buffer |
unsigned long blocknumber[2] |
4 Bytes |
Starting Absolute Block Number |
- Η συνάρτηση getdrivegeometry χρησιμοποιείται για τη λήψη των παραμέτρων της καθορισμένης μονάδας δίσκου. Η συνάρτηση getdrivegeometry χρησιμοποιεί τον αριθμό συνάρτησης 0x48 των επεκτάσεων INT 13H.
Η σημασία των παραμέτρων έχει περιγραφεί στον παρακάτω πίνακα:
Παράμετρος |
Τι σημαίνει |
i.h.ah = 0x48 |
Function Number 0x48 of INT 13H Extensions |
i.h.dl = drive |
Drive Number |
i.x.si = FP_OFF ( (void far*)&g ) |
ds:si address to buffer for drive parameters as discussed earlier |
s.ds = FP_SEG ( (void far*)&g ) |
ds:si address to buffer for drive parameters as discussed earlier |
The int86x(0x13, &i, &o, &s) function invokes the interrupt 13H with segment register Values. The getdrivegeometry function returns the total number on drive.
- Στη συνάρτηση main(), (char)peekb(0x0040, 0x0075); (η συνάρτηση peekb ορίζεται στο DOS.H) επιστρέφει τον αριθμό των σκληρών δίσκων που είναι συνδεδεμένοι στο σύστημα.
Ο αριθμός των σκληρών δίσκων που είναι συνδεδεμένοι στο σύστημα αντιπροσωπεύεται από το byte που είναι αποθηκευμένο στη θέση μνήμης 0040H:0075H (Τμήμα 0040H: Offset 0075H). Εάν ο αριθμός των σκληρών δίσκων που είναι συνδεδεμένοι στο σύστημα είναι μικρότερος, τότε δύο προγράμματα εμφανίζουν το μήνυμα σφάλματος και εξέρχονται.
Sectors_in_HDD1 = getdrivegeometry (0x80); παίρνει τις παραμέτρους του πρώτου σκληρού δίσκου (0x80) και επιστρέφει τον συνολικό αριθμό τομέων στον πρώτο σκληρό δίσκο.
Παρομοίως Sectors_in_HDD2 = getdrivegeometry (0x81); λαμβάνει τις παραμέτρους του δεύτερου σκληρού δίσκου (0x81) και επιστρέφει τον συνολικό αριθμό τομέων στον δεύτερο σκληρό δίσκο.
Μετά την επιβεβαίωση από τον χρήστη ότι θα συνεχίσει με την απεικόνιση, ελέγξτε πρώτα την προϋπόθεση ότι το μέγεθος του σκληρού δίσκου προέλευσης δεν πρέπει να είναι μεγαλύτερο από το μέγεθος του σκληρού δίσκου προορισμού. Εάν ο προορισμός είναι μικρότερος, εμφανίστε το μήνυμα σφάλματος και βγείτε.
Εάν όλα πάνε σωστά, αντιγράψτε τους τομείς του δίσκου προέλευσης στον δίσκο προορισμού. Εδώ διαβάζουμε και γράφουμε 61440 Byte (120 τομείς με καθένα από τα 512 Byte) κάθε φορά για να κάνουμε τη διαδικασία απεικόνισης πιο γρήγορη.
Εάν θέλετε να χρησιμοποιήσετε περισσότερους τομείς ταυτόχρονα, ακόμη και πέρα από το όριο των 64K, μπορείτε να το κάνετε χρησιμοποιώντας το “τεράστιο δείκτη” σε μοντέλο μεγάλης μνήμης. Το Παράδειγμα Προδιαγραφών είναι το εξής:
char τεράστια συστοιχία[100000L];
- Η συνάρτηση, readabsolutesectors ( 0x80, βρόχος, 120, buffer ); διαβάζει τους 120 τομείς του πρώτου σκληρού δίσκου (0x80), ξεκινώντας από τον αριθμό τομέα που καθορίζεται από τον ανυπόγραφο μακρύ βρόχο ακέραιου αριθμού και αποθηκεύει τα δεδομένα στην προσωρινή μνήμη δεδομένων.
- Η συνάρτηση, writeabsolutesectors ( 0x81, βρόχος, 120, buffer ); εγγράφει τα δεδομένα της προσωρινής μνήμης δεδομένων σε 120 τομείς του δεύτερου σκληρού δίσκου (0x81), ξεκινώντας από τον αριθμό τομέα που καθορίζεται από τον βρόχο μακρύ ακέραιο ανυπόγραφο.
Η κωδικοποίηση των συναρτήσεων readabsolutesectors ( ) και writeabsolutesectors ( ) έχει δοθεί στη συνέχεια:
//// Λειτουργία ανάγνωσης απόλυτων τομέων \\\\
int readabsolutesectors ( int drive,
unsigned long sectornumber,
int numofsectors,
void *buffer )
{
union REGS i, o ;
struct SREGS s ;
struct diskaddrpacket pp ;
pp.packetsize = 16 ; /* packet size = 10H */
pp.reserved = 0 ; /* Reserved = 0 */
pp.blockcount = numofsectors ; /* Number of sectors
to read */
/* για την προσωρινή μνήμη δεδομένων */
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void
far*)buffer), FP_OFF((void far*)buffer));
pp.blocknumber[0] = sectornumber ; /* Sector number
to read */
pp.blocknumber[1] = 0 ; /* Block number */
i.h.ah = 0x42 ; /* Function Number*/
i.h.dl = drive ; /* Physical Drive Number */
i.x.si = FP_OFF ( (void far*)&pp ) ; /* ds:si for
buffer Parameters */
s.ds = FP_SEG ( (void far*)&pp ) ; /* ds:si for
buffer Parameters */
/* Επικαλέστε την καθορισμένη συνάρτηση του INT 13H με τιμές καταχωρητή τμημάτων */
int86x ( 0x13, &i, &o, &s ) ;
if ( o.x.cflag==1)
return 0 ; /*failure */
else
return 1 ; /* success */
}
//// Συνάρτηση για τη γραφή απόλυτων τομέων \\\\
int writeabsolutesectors ( int drive,
unsigned long sectornumber,
int numofsectors,
void *buffer )
{
union REGS i, o ;
struct SREGS s ;
struct diskaddrpacket pp ;
pp.packetsize = 16 ; /* Packet Size = 10H */
pp.reserved = 0 ; /* Reserved = 0 */
pp.blockcount = numofsectors ; /* Number of Sectors
to be written */
/* για την προσωρινή μνήμη δεδομένων */
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void
far*)buffer), FP_OFF((void far*)buffer));
pp.blocknumber[0] = sectornumber ;/* Sector number
to be written */
pp.blocknumber[1] = 0 ; /* Block number = 0 */
i.h.ah = 0x43 ; /* Function Number */
i.h.al = 0x00 ; /* Write Flags, see
comments */
i.h.dl = drive ; /* Physical Drive number*/
/* ds:si for buffer Parameters */
i.x.si = FP_OFF ( (void far*)&pp ) ;
/* ds:si for buffer Parameters */
s.ds = FP_SEG ( (void far*)&pp ) ;
/* Επικαλέστε την καθορισμένη συνάρτηση του INT 13H με τιμές καταχωρητή τμημάτων */
int86x ( 0x13, &i, &o, &s ) ;
if ( o.x.cflag==1)
return 0 ; /* failure */
else
return 1 ; /* success */
}
Σχόλια σχετικά με την κωδικοποίηση:
Οι παράμετροι που χρησιμοποιούνται και από τις δύο συναρτήσεις έχουν τις ακόλουθες έννοιες:
Παράμετρος |
Μέγεθος σε Byte |
Περιγραφή |
pp.packetsize = 16 ; |
1 Byte |
Size of packet = 10H |
pp.reserved = 0 ; |
1 Byte |
Reserved = 0 |
pp.blockcount = numofsectors ; |
2 Bytes |
Number of sectors to read |
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void far*)buffer), FP_OFF((void far*)buffer)); |
----- |
for Data buffer or Transfer Buffer |
pp.blocknumber[0] = sectornumber ; |
4 Bytes |
Sector number to read/write (generally, we need only this). Only alone This can support up to 2.1 Terabytes. |
pp.blocknumber[1] = 0 ; |
4 Bytes |
Block number. Use this, If accessing the disk of greater then 2.1 Terabytes in size. |
i.h.ah = 0x42 ; or i.h.ah = 0x43 ; |
2 Bytes |
Function Number of INT 13H Extensions |
i.h.al = 0x00 ; |
1 Byte |
Write Flags used in write function only,00H, 01H are used for Write Without Verify and 02H is used for write with verify |
i.h.dl = drive ; |
2 Bytes |
Physical Drive Number |
i.x.si = FP_OFF ( (void far*)&pp ) ; |
------ |
ds:si for buffer Parameters |
s.ds = FP_SEG ( (void far*)&pp ) ; |
------ |
ds:si for buffer Parameters |
int86x ( 0x13, &i, &o, &s ) ; |
------ |
Invoke the specified Function of INT 13H with segment register values |
Σελίδα Τροποποιήθηκε στις: 15/01/2022