Δημιουργία αντιγράφων ασφαλείας Linux από το Veeam στο Elbrus OS. Αντικατάσταση εισαγωγής ['?' | '.' | '!']

Γεια σε όλους.
Πρόσφατα άρθρα για το Habré Αντικατάσταση εισαγωγών στην πράξη. Μέρος 1. Επιλογές и Η μουσική δεν έπαιζε για πολύ… ή πώς το Elbrus OS δεν έγινε ποτέ δωρεάν δεν με άφησε αδιάφορο. Αποφάσισα να μελετήσω αυτό το θέμα στο πλαίσιο της εργασίας δημιουργίας αντιγράφων ασφαλείας. Επιπλέον, σε Αυτό το άρθρο Αναφέρονται προϊόντα Λογισμικού Veeam, πράγμα που σημαίνει ότι το ζήτημα μπορεί να είναι σχετικό ειδικά στο πλαίσιο της υποκατάστασης εισαγωγής.

Δημιουργία αντιγράφων ασφαλείας Linux από το Veeam στο Elbrus OS. Αντικατάσταση εισαγωγής ['?' | '.' | '!']
αρχική πηγή εικόνας

Πρώτα απ 'όλα, αποφάσισα να κατεβάσω το Elbrus OS, ή μάλλον, μόνο τη διαθέσιμη διανομή για την αρχιτεκτονική x86_64, να δω πώς λειτουργεί και να προσπαθήσω να εγκαταστήσω το Veeam Agent για Linux σε αυτό. Αν θέλετε να μάθετε τι προέκυψε από αυτό, δείτε το Cat.

Μια μικρή παρέκβαση λοιπόν, σε περίπτωση που κάποιος δεν ξέρει. Το «Elbrus» είναι έτσι επεξεργαστή με ένα μάλλον συγκεκριμένο σύστημα εντολών. Εκτός από αυτό, υπάρχει λογισμικό Elbrus OS. Και - αντίθετα με τη δημοφιλή πεποίθηση - για τη λειτουργία του Elbrus OS, δεν είναι απαραίτητο να έχετε ένα σύστημα υλικού βασισμένο στον επεξεργαστή Elbrus. Υπάρχει "PDK "Elbrus" για x86" - στην πραγματικότητα, εμφανίστηκε στον δημόσιο τομέα με τη μορφή δίσκου εγκατάστασης. Παρεμπιπτόντως, υπάρχει μια υποσημείωση "PDK - κιτ ανάπτυξης πλατφόρμας, κιτ προγραμματιστή" - εξαιρετική, αυτό σημαίνει ότι υπάρχει τουλάχιστον ένας μεταγλωττιστής εκεί.

Άλλη μια μικρή αναγκαστική υποχώρηση. Γεγονός είναι ότι κάποτε ασχολήθηκα με εγχώριο λογισμικό, όπως το MSVS και το Baguette RTOS. Είχα εμπειρία εργασίας με οικιακά εξαρτήματα, συμπεριλαμβανομένου ενός επεξεργαστή από την MCST. Ως εκ τούτου, μπορώ να πω με πλήρη ευθύνη ότι υπάρχει μια συγκεκριμένη ιδιαιτερότητα σε αυτόν τον τομέα και θα προσπαθήσω να μην την θίξω στο άρθρο. Όταν το θέλω πραγματικά, θα βάλω την ετικέτα [TBD]. Έτσι θα προσπαθήσουμε να κάνουμε χωρίς ξεκάθαρο τρολάρισμα και μπανάλ γκρίνια. Στο τέλος, η ρωσική αμυντική βιομηχανία και οι κυβερνητικές υπηρεσίες πρέπει να γίνουν κατανοητές. Μεγάλη χώρα - μικρός προϋπολογισμός.. [TBD].

Στάδιο μηδέν - Κατεβάστε. Αξιοσημείωτο είναι ότι η είδηση ​​ότι το Elbrus OS έγινε διαθέσιμο προκάλεσε απήχηση, τόσο που ο διακομιστής διανομής κατέρρευσε. [TBD] Ευχαριστώ τη Yandex και τον μηχανικό που σκέφτηκε να το μεταφέρει εκεί. Άρα η ταχύτητα λήψης είναι καλή.

Το πρώτο στάδιο - εγκατάσταση. Το εγκατέστησα στον πρώτο hypervisor που ήταν διαθέσιμος για δωρεάν χρήση. Διέθεσα δύο πυρήνες, μερικές συναυλίες RAM, 32 MB για βίντεο (θα υπάρχει γραφικό περιβάλλον, σκέφτηκα). Ο δίσκος είναι ως συνήθως - 32 GB.
Ξεκίνησα την εγκατάσταση. Δεν χρησιμοποίησα τις οδηγίες εγκατάστασης, επομένως δεν μπορώ να σχολιάσω. Η διεπαφή εγκατάστασης TUI είναι εξαιρετικά μινιμαλιστική.

Δημιουργία αντιγράφων ασφαλείας Linux από το Veeam στο Elbrus OS. Αντικατάσταση εισαγωγής ['?' | '.' | '!']
Λοιπόν, τέλεια, μπορούμε να κάνουμε χωρίς ποντίκι.

Κατάφερα το επόμενο παράθυρο στη δεύτερη προσπάθεια. Γιατί να μην επιλέξετε την προεπιλεγμένη συσκευή sr0 [TBD] κατά την εγκατάσταση από το δίσκο;
Επιλέξτε την πηγή CD-ROM και προχωρήστε.

Δημιουργία αντιγράφων ασφαλείας Linux από το Veeam στο Elbrus OS. Αντικατάσταση εισαγωγής ['?' | '.' | '!']

Κατά την επιλογή της ζώνης ώρας, ξαφνικά συνειδητοποίησα ότι το σύστημα χρησιμοποιεί τη διαδικασία εκκίνησης εκκίνησης και εργάζομαι από το TTY0.

Δημιουργία αντιγράφων ασφαλείας Linux από το Veeam στο Elbrus OS. Αντικατάσταση εισαγωγής ['?' | '.' | '!']

Εντάξει, τότε ας ταξινομήσουμε το "Elbrus" ως κοινότητα Παλαιοί Πιστοί[TBD]. Κατ 'αρχήν, αυτό είναι καλό: δεν χρειάζεται να ζητήσετε τον πηγαίο κώδικα για να δείτε πώς λειτουργεί η διαδικασία λήψης, καθώς όλα είναι γραμμένα.

Τα υπόλοιπα είναι σχεδόν ασήμαντα: βάζουμε τα πάντα και συμφωνούμε. Στην πορεία, διαπιστώνουμε ότι ο πυρήνας χρησιμοποιείται 3.14.79-13.84. Χμμ, το Debian 7 είχε 3.2 [TBD].

Στη συνέχεια, επιλέξτε την προεπιλεγμένη κατάτμηση δίσκου και... Βλέπουμε μια προειδοποίηση:

Δημιουργία αντιγράφων ασφαλείας Linux από το Veeam στο Elbrus OS. Αντικατάσταση εισαγωγής ['?' | '.' | '!']

Χμμ, κατά κάποιο τρόπο η αυτόματη κατάτμηση δεν αντιμετώπισε καλά έναν δίσκο 32 gig. Δεν άλλαξα το δίσκο, ολοκλήρωσα την αποστολή με χειροκίνητη κατάτμηση δίσκου στο στυλ "όλα σε ένα". Έπρεπε να εγκαταστήσω το ext3, αφού το /boot δεν μπορούσε να είναι στο ext4.
Το σύστημα εμφανίστηκε χωρίς επεισόδια.

Το δεύτερο στάδιο - αναζήτηση εναλλακτικών λύσεων.
Αφού έψαξα τα περιεχόμενα του δεύτερου δίσκου, κατάλαβα ότι πρόκειται για ένα αποθετήριο με πρόσθετο. σε συσκευασίες. Και κοιτάζοντας το /etc/apt/sources.list, συνειδητοποίησα ότι πρέπει να προσαρτηθεί στο /mnt/cdrom. Αλλά δεν βρήκα το /etc/os-release. Αλλά υπάρχει /etc/mcst-έκδοση με τα περιεχόμενα 3.0-rc36. 3.0 είναι μάλλον η έκδοση - φαίνεται να ταιριάζει, αλλά rc36; Γενικά, το λογισμικό τρίτου κατασκευαστή πιθανότατα δεν θα μπορεί να αναγνωρίσει αυτήν τη διανομή με τον κλασικό τρόπο.

Στο ριζικό διαμέρισμα, ο κατάλογος /mcst τραβάει το μάτι μου και εκεί, με μια καρδιά που βυθίζεται, ανακάλυψα το /mcst/backup. Δηλαδή, υπάρχει ένα εργαλείο δημιουργίας αντιγράφων ασφαλείας και είναι ενσωματωμένο στο σύστημα! «Τέλεια», σκέφτηκα, «Ας δούμε πώς λειτουργεί αυτό!»

Αποδείχθηκε ότι υπάρχει ένα σενάριο 4Kb bash /mcst/bin/backup που παρέχει αντιγραφή αρχείων. Από προεπιλογή - στον κατάλογο /mcst/backup. Στον πηγαίο κώδικα περίμενα να δω την εντολή rsync, αλλά δεν είναι στην προεπιλεγμένη διαμόρφωση. Το σενάριο απλώς αντιγράφει αρχεία. Η εντολή μοιάζει κάπως έτσι:

cp -rpdx <file backup> <file>

Ολόκληρο το αρχείο /mcst/bin/backup είναι εδώΣας προειδοποιώ αμέσως ότι αυτό το σενάριο από μόνο του δεν αρκεί για να το κατανοήσετε πλήρως. Τραβάει συναρτήσεις από το /mcst/bin/source, που είναι κάτι σαν βιβλιοθήκη συναρτήσεων. Δεν το συμπεριέλαβα (44KB).

#!/bin/bash

unalias -a

set +vx

source $(dirname $0)/source
[[ $? != 0 ]] && exit 1

OPTIONS="hvcdrRil:L:"

usage()
{
	echo "Usage: $PROG_NAME [-$OPTIONS] [backup]"
	echo "    h            - this help"
	echo "    v vv vvv     - verbose, very verbose, extremly verbose"
	echo "    c            - create backup"
	echo "    d            - diffs backup and system"
	echo "    r            - recovery system"
	echo "    R            - remove backup"
	echo "    i            - prompt before backup removing"
	echo "    l list       - additional backup files list"
	echo "    L list       - global backup files list"
	echo "    backup       - backup directory, default /mcst/backup/backup"
}

init_prog()
{
	typeset flg=0

	while getopts $OPTIONS opt
	do
		case $opt in
		h ) usage; exit 0;;
		v ) (( verbose = verbose + 1 )); set_verbose;;
		c ) flg=1; c_flg=1;;
		d ) flg=1; d_flg=1;;
		r ) flg=1; r_flg=1;;
		R ) flg=1; R_flg=1;;
		i ) i_flg=1;;
		l ) l_flg=1; list_arg="$list_arg $OPTARG";;
		L ) L_flg=1; LIST_arg="$LIST_arg $OPTARG";;
		* ) usage "Invalid option"; exit 1;;
		esac
	done

	set_verbose

	check_su

	init_variables

	shift $((OPTIND-1))

	if (( $# > 1 ))
	then
		echo_fatal "invalid arguments number, exp 0|1, act $#"
		exit 1
	fi

	[[ $# = 1 ]] && BACKUP=$1

	echo "Backup directory is $BACKUP"

	if [[ $L_flg = 1 ]]
	then
		backup_list="$LIST_arg"
	elif [[ $c_flg != 1 && $R_flg != 1 ]]
	then
		get_output_cmd "cat $BACKUP/$BACKUP_LIST_NAME"
		backup_list="$output_cmd"
	else
		get_output_cmd "get_backup_list"
		backup_list="$output_cmd"
	fi

	if [[ $l_flg = 1 ]]
	then
		backup_list="$backup_list $list_arg"
	fi

	if [[ $flg = 0 ]]
	then
		if [[ -d $BACKUP ]]
		then
			ls -laR $BACKUP
		else
			echo_info "Cannot access $BACKUP"	
		fi
		echo "backup_list=$backup_list"
		exit 0
	fi

###	echo "Backup list: $backup_list"
}

create_file()
{
	typeset f=$1 fr=$2
	typeset fb

	[[ -z $fr ]] && fr=$f

	fb=${f#/}

	fb=$BACKUP/$fb

	xcmd="rm -rf $fb"
	set_cmd "$xcmd"
	run_cmd

	xcmd="mkdir -p $fb"
	set_cmd "$xcmd"
	run_cmd

	if [[ -a $fr ]]
	then
		xcmd="cp -rpdx $fr $fb/file"
		set_cmd "$xcmd"
		run_cmd

		xcmd="touch $fb/create"
		set_cmd "$xcmd"
		run_cmd
	else
		xcmd="touch $fb/delete"
		set_cmd "$xcmd"
		run_cmd
	fi
}

diff_file()
{
	typeset f=$1
	typeset fb

	fb=${f#/}

	fb=$BACKUP/$fb

	if [[ -f $fb/delete ]]
	then
		echo_info "$f absent"
	elif [[ -f $fb/create ]]
	then
#		echo "state: create $f"

		if [[ ! -a $f ]]
		then
			echo_info "cannot access $f"
		else
			xcmd="diff -r $f $fb/file"
			echo "$xcmd"
			set_cmd "$xcmd" "" "0 1 2"
			run_cmd
		fi
	else
		echo_fatal "wrong $f backup"
		exit 1
	fi
}

recovery_file()
{
	typeset f=$1
	typeset fb

	fb=${f#/}

	fb=$BACKUP/$fb

	if [[ ! -a $fb ]]
	then
		echo_fatal "cannot access $fb"
		exit 1
	fi

	xcmd="rm -rf $f"
	set_cmd "$xcmd"
	run_cmd

	if [[ -f $fb/delete ]]
	then
		:
	elif [[ -f $fb/create ]]
	then
		xcmd="cp -rpdx $fb/file $f"
		set_cmd "$xcmd"
		run_cmd
	else
		echo_fatal "wrong $fb backup"
		exit 1
	fi
}

remove_backup()
{
	echo "Remove backup"

	if [[ ! -d $BACKUP ]]
	then
		echo_info "Cannot access $BACKUP"
		return
	fi

	if [[ ! -f $BACKUP/$BACKUP_LIST_NAME ]]
	then
		echo_fatal "$BACKUP_LIST_NAME absent, remove backup manually"
		exit 0
	fi

	answer=
	if [[ $i_flg = 1 ]]
	then
		echo -n "Remove $BACKUP directory (yes/...)?"
		read answer
	else
		answer=yes
	fi
	if [[ $answer = yes ]]
	then
		xcmd="rm -rf $BACKUP"
		set_cmd "$xcmd"
		run_cmd
	fi
}

recovery_backup()
{
	echo "Recovery system from $BACKUP" 

	for f in $backup_list
	do
		get_output_cmd "get_mount_point $f"
		mnt=$output_cmd
		get_output_cmd "is_ro_mounted $mnt"
		mnt=$output_cmd
		if [[ ! -z $mnt ]]
		then
			remount_rw_fs $mnt
		fi 
		recovery_file $f
		if [[ ! -z $mnt ]]
		then
			remount_ro_fs $mnt
		fi 
	done

	echo "The system is ready, reboot the system manually" 
}

create_backup()
{
		echo "Create backup"

		xcmd="mkdir -pm0777 $BACKUP"
		set_cmd "$xcmd"
		run_cmd

		for v in $backup_list
		do
			f=${v%%:*}
			backup_list2="$backup_list2 $f"
			fr=${v#*:}
			create_file $f $fr
		done
		echo "$backup_list2" >$BACKUP/$BACKUP_LIST_NAME
}

diff_backup()
{
	echo "Diffs system and backup" 

	if [[ ! -d $BACKUP ]]
	then
		echo_fatal "cannot access $BACKUP"
		exit 1
	fi

	for f in $backup_list
	do
		diff_file $f
	done
}

main()
{
	typeset f mnt mnt_list answer

	if [[ $R_flg = 1 ]]
	then
		remove_backup
	fi

	if [[ $r_flg = 1 ]]
	then
		recovery_backup
	fi

	if [[ $c_flg = 1 ]]
	then
		create_backup
	fi

	if [[ $d_flg = 1 ]]
	then
		diff_backup
	fi
}

init_prog "$@"

main

exit 0

Αν και μήπως δεν κατάλαβα κάτι; Ίσως κάποιος μπορεί να εξηγήσει στα σχόλια: πώς αυτό το σενάριο εξασφαλίζει ασφαλή και αξιόπιστη δημιουργία αντιγράφων ασφαλείας δεδομένων; [TBD]

Το rsync, παρεμπιπτόντως, περιλαμβάνεται στο πρόσθετο. αποθετήρια. Έκδοση 3.1.3. Νομίζω ότι η χρήση του rsync εξακολουθεί να είναι μια καλύτερη εναλλακτική λύση στην εφαρμογή /mcst/bin/backup.

Στη συνέχεια, αποφάσισα να βάλω ένα φρέσκο Veeam Agent για Linux. Θα ρωτήσει κάποιος: «Τι σχέση έχει το Veeam και η αντικατάσταση εισαγωγής;» Ναι, δεν υπάρχει στο μητρώο, αλλά είναι πιστοποιημένο από την FSTEC, που σημαίνει ότι ελλείψει εναλλακτικών μπορεί να χρησιμοποιηθεί. Ξοδεύοντας δεκαπέντε λεπτά σε εναλλακτικές από αρχείο, μπόρεσα να βρω 3 συνδέσμους για τη λέξη "αντίγραφο ασφαλείας" (καμία σχέση με την ερώτησή μου για τη λέξη "κράτηση"). Δεν έχω κάνει μια βαθιά ανάλυση αυτών των προγραμμάτων, επομένως δεν θα προσπαθήσω να κρίνω πόσο κατάλληλα είναι για τη δημιουργία αντιγράφων ασφαλείας μηχανών που τρέχουν Linux. Όποιος το χρειάζεται θα βγάλει το δικό του συμπέρασμα και θα το μοιραστεί στα σχόλια.

το τρίτο στάδιο — εγκατάσταση του Veeam Agent για Linux.
Έτσι, το Veeam Agent για Linux αποτελείται από δύο πακέτα: τη μονάδα πυρήνα veeamsnap (παρεμπιπτόντως, πηγή εδώ) και αποκλειστικό κωδικό χώρου χρήστη με τη μορφή του πακέτου veeam.

Υπήρχε ένα μικρό πρόβλημα με την εγκατάσταση της λειτουργικής μονάδας πυρήνα - το πακέτο dkms που λείπει. Αυτή είναι μια υπηρεσία που σας επιτρέπει να δημιουργήσετε ενότητες πυρήνα από την πηγή. Κατά κανόνα, είναι διαθέσιμο σε όλες τις διανομές deb. Έπρεπε να το κατεβάσω από ένα αποθετήριο deb τρίτου μέρους. Ένα πράγμα που με έκανε χαρούμενο είναι ότι το πακέτο δεν εξαρτάται από την αρχιτεκτονική, άρα ταιριάζει σαν εγγενές. Γιατί δεν συμπεριλήφθηκε στη λίστα των διαθέσιμων πακέτων, ή μάλλον δεν αναπτύχθηκε [TBD]; Ίσως θεωρείται ότι κανείς δεν πρέπει να δημιουργήσει και να εκτελέσει λειτουργικές μονάδες πυρήνα που δεν είναι MCST. Υπάρχει πραγματικά μια ασυμφωνία εδώ - αφού υπάρχουν κεφαλίδες linux. Δηλαδή, η μονάδα, εάν είναι επιθυμητό, ​​μπορεί να συναρμολογηθεί με το χέρι και να εκκινηθεί με ένα σενάριο κατά την εκκίνηση του μηχανήματος. Νομίζω ότι δεν πρέπει να περιμένετε συχνές ενημερώσεις από το MCST [TBD].

«Εντάξει, η μονάδα έχει εγκατασταθεί - το πιο δύσκολο κομμάτι έχει τελειώσει», σκέφτηκα... Το πακέτο veeam για το αποθετήριο deb είναι για την πλατφόρμα amd64 και το Elbrus OS έχει μια πλατφόρμα x86_64 [TBD]. Η διαφορά, φυσικά, έγκειται μόνο στο όνομα, αλλά αυτή η διαφορά καθιστά σχεδόν όλα τα πακέτα από αποθετήρια deb τρίτων μη συμβατά με το Elbrus OS. Αυτή η ενοχλητική παρεξήγηση μπορεί να εξαλειφθεί απλά: απλώς αποσυναρμολογήστε το πακέτο, διορθώστε τις πληροφορίες σχετικά με την αρχιτεκτονική και τοποθετήστε το ξανά μαζί. Πως να το κάνεις Το γκουγκλάρισε στη στιγμή.

mkdir tmp
dpkg-deb -R original.deb tmp
# edit DEBIAN/postinst
dpkg-deb -b tmp fixed.deb

Ένα άλλο πρόβλημα είναι οι εξαρτήσεις. Τα απαραίτητα αρχεία φαίνεται να υπάρχουν, αλλά τα πακέτα δεν είναι. Η εντύπωση ήταν ότι τα ονόματα των συσκευασιών διέφεραν από τα «εισαγόμενα ανάλογα». Ίσως οι βιβλιοθήκες να συσκευάζονται διαφορετικά. Δεν μπήκα σε πολλές λεπτομέρειες, αφαίρεσα σχεδόν όλες τις εξαρτήσεις και η εγκατάσταση προχώρησε.

Στη συνέχεια εμφανίστηκαν προβλήματα με τον κωδικό έναρξης της υπηρεσίας. Το σενάριο /lib/init/vars.sh έλειπε. Για κάποιο λόγο, ο Elbrus τα καταφέρνει χωρίς αυτό, οπότε θα το αφαιρέσουμε κι εμείς. Στη συνέχεια, έπρεπε να αντικαταστήσουμε τη συνάρτηση εξόδου μηνύματος: οι συναρτήσεις log_daemon_msg και log_end_msg έλειπαν. Μετά από ψάξιμο στο αρχείο /lib/lsb/init-functions, βρήκα τη συνάρτηση log_success_msg - θα είναι καλή για εμάς για πειράματα. Παρεμπιπτόντως, στο αρχείο /lib/lsb/init-functions η γραμμή "# Source SuSE`s rc functions" βρίσκεται στην αρχή του αρχείου [TBD].

Μετά από μια τέτοια πρόχειρη επεξεργασία του πακέτου με ένα αρχείο, το αντίγραφο ασφαλείας ολόκληρου του μηχανήματος στο κοινόχρηστο στοιχείο NFS ξεκίνησε με επιτυχία. Η εφεδρική τοποθέτηση ήταν επίσης επιτυχής. Έτσι, πιστεύω ότι για τη δημιουργία αντιγράφων ασφαλείας ενός μηχανήματος με το Elbrus PDK, που έχει ληφθεί "ακριβώς έτσι" χωρίς καμία υποχρέωση, το Veeam Agent για Linux είναι σίγουρα κατάλληλο. Ακόμα και μετά από όλες τις τροποποιήσεις με ένα αρχείο.

Φυσικά, το κιτ διανομής Elbrus OS δεν υποστηρίζεται επίσημα, αφού δεν περιλαμβάνεται στη λίστα των υποστηριζόμενων. Επιπλέον, το Veeam Agent για Linux δεν δοκιμάστηκε σε αυτό από το τμήμα QA, άρα αυτά. δεν υπάρχει υποστήριξη (τουλάχιστον τη στιγμή της δημοσίευσης του άρθρου).

Ελπίζω το άρθρο να είναι χρήσιμο σε όσους προσπαθούν να εφαρμόσουν την εντολή Νο. 334 της 29.06.2017ης Ιουνίου XNUMX. Το δικό μου σε σένα... [TBD].

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο