Linux-Backup von Veeam auf Elbrus OS. Substitution importieren ['?' | '.' | '!']

Hallo.
Aktuelle Artikel über Habré Importsubstitution in der Praxis. Teil 1. Optionen и Die Musik wurde lange Zeit nicht abgespielt ... oder wie das Elbrus-Betriebssystem nicht kostenlos wurde hat mich nicht gleichgültig gelassen. Ich habe beschlossen, dieses Problem im Zusammenhang mit der Sicherungsaufgabe zu untersuchen. Darüber hinaus in Dieser Artikel Veeam-Softwareprodukte werden erwähnt, was bedeutet, dass das Problem insbesondere im Zusammenhang mit der Importsubstitution relevant sein kann.

Linux-Backup von Veeam auf Elbrus OS. Substitution importieren ['?' | '.' | '!']
Originalbildquelle

Zunächst habe ich beschlossen, das Elbrus-Betriebssystem bzw. nur die verfügbare Distribution für die x86_64-Architektur herunterzuladen, zu sehen, wie es funktioniert, und zu versuchen, Veeam Agent für Linux darauf zu installieren. Wenn Sie wissen möchten, was dabei herausgekommen ist, schauen Sie sich bitte die Seite cat an.

Also ein kleiner Exkurs, falls es jemand nicht weiß. „Elbrus“ ist so Prozessor mit einem ziemlich spezifischen Befehlssystem. Darüber hinaus gibt es die Elbrus OS-Software. Und – entgegen der landläufigen Meinung – ist für den Betrieb des Elbrus-Betriebssystems kein Hardwaresystem erforderlich, das auf dem Elbrus-Prozessor basiert. Es gibt „PDK „Elbrus“ für x86“ – tatsächlich erschien es gemeinfrei in Form einer Installationsdiskette. Übrigens gibt es eine Fußnote „PDK – Platform Development Kit, Developer Kit“ – toll, das heißt, da ist zumindest ein Compiler dabei.

Ein weiterer kleiner erzwungener Rückzug. Tatsache ist, dass ich mich einmal mit heimischer Software wie MSVS und Baguette RTOS beschäftigt habe. Ich hatte Erfahrung im Umgang mit inländischen Komponenten, darunter einem Prozessor von MCST. Daher kann ich mit voller Verantwortung sagen, dass es in diesem Bereich eine gewisse Besonderheit gibt und ich werde versuchen, sie im Artikel nicht anzusprechen. Wenn ich es wirklich möchte, füge ich das Tag [TBD] hinzu. Deshalb werden wir versuchen, auf regelrechtes Trollen und banales Gejammer zu verzichten. Am Ende müssen die russische Verteidigungsindustrie und die russischen Behörden verstanden werden. Großes Land – kleines Budget. [TBD].

Nullstufe - herunterladen. Bemerkenswert ist, dass die Nachricht, dass das Elbrus-Betriebssystem verfügbar ist, so viel Aufsehen erregte, dass der Verteilungsserver ausfiel. [TBD] Vielen Dank an Yandex und den Ingenieur, der daran gedacht hat, es dorthin zu verschieben. Die Download-Geschwindigkeit ist also gut.

Die erste Stufe - Installation. Ich habe es auf dem ersten Hypervisor installiert, der zur kostenlosen Nutzung verfügbar war. Ich habe zwei Kerne, ein paar GB RAM und 32 MB für Video zugewiesen (ich dachte, es wird eine grafische Oberfläche geben). Die Festplatte ist wie üblich 32 GB groß.
Ich habe mit der Installation begonnen. Ich habe die Installationsanleitung nicht verwendet und kann daher nichts dazu sagen. Die TUI-Installationsoberfläche ist stark minimalistisch.

Linux-Backup von Veeam auf Elbrus OS. Substitution importieren ['?' | '.' | '!']
Na toll, auf eine Maus können wir verzichten.

Beim zweiten Versuch gelang mir das nächste Fenster. Warum wählen Sie bei der Installation von der Festplatte nicht das Standardgerät sr0 [TBD] aus?
Wählen Sie die CD-ROM-Quelle aus und fahren Sie fort.

Linux-Backup von Veeam auf Elbrus OS. Substitution importieren ['?' | '.' | '!']

Bei der Auswahl der Zeitzone wurde mir plötzlich klar, dass das System den Init-Boot-Prozess verwendet und ich von TTY0 aus arbeite.

Linux-Backup von Veeam auf Elbrus OS. Substitution importieren ['?' | '.' | '!']

Okay, dann klassifizieren wir „Elbrus“ als Gemeinschaft Altgläubige[TBD]. Im Prinzip ist das gut: Sie müssen nicht nach dem Quellcode fragen, um zu sehen, wie der Download-Vorgang funktioniert, da alles skriptgesteuert ist.

Der Rest ist fast unwichtig: Wir legen alles fest und sind uns einig. Unterwegs stellen wir fest, dass der Kernel 3.14.79-13.84 verwendet wird. Hmm, Debian 7 hatte 3.2 [TBD].

Wählen Sie als Nächstes die Standard-Festplattenpartitionierung aus und... Wir sehen eine Warnung:

Linux-Backup von Veeam auf Elbrus OS. Substitution importieren ['?' | '.' | '!']

Hmm, irgendwie kam die automatische Partitionierung mit einer 32-GB-Festplatte nicht zurecht. Ich habe die Festplatte nicht gewechselt; ich habe die Quest mit manueller Festplattenpartitionierung im „All-in-One“-Stil abgeschlossen. Ich musste ext3 installieren, da /boot nicht in ext4 sein konnte.
Das System lief ohne Zwischenfälle hoch.

Die zweite Stufe - Suche nach Alternativen.
Nachdem ich den Inhalt der zweiten Diskette durchgesehen hatte, wurde mir klar, dass es sich um ein Repository mit zusätzlichen Datenträgern handelte. in Paketen. Und als ich mir /etc/apt/sources.list ansah, wurde mir klar, dass es in /mnt/cdrom gemountet werden muss. Aber ich habe /etc/os-release nicht gefunden. Aber es gibt /etc/mcst-version mit dem Inhalt 3.0-rc36. 3.0 ist wohl die Version - scheint zu passen, aber rc36? Im Allgemeinen wird Software von Drittanbietern diese Distribution höchstwahrscheinlich nicht auf klassische Weise erkennen können.

In der Root-Partition fällt mir das Verzeichnis /mcst ins Auge, und dort entdeckte ich mit sinkendem Herzen /mcst/backup. Das heißt, es gibt ein Backup-Tool, und es ist in das System integriert! „Super“, dachte ich, „Mal sehen, wie das funktioniert!“

Es stellte sich heraus, dass es ein 4-KB-Bash-Skript /mcst/bin/backup gibt, das das Kopieren von Dateien ermöglicht. Standardmäßig – in das Verzeichnis /mcst/backup. Im Quellcode habe ich erwartet, den Befehl rsync zu sehen, aber er ist nicht in der Standardkonfiguration enthalten. Das Skript kopiert einfach Dateien. Der Befehl sieht in etwa so aus:

cp -rpdx <file backup> <file>

Die gesamte Datei /mcst/bin/backup befindet sich hierIch warne Sie sofort, dass dieses Skript allein nicht ausreicht, um es vollständig zu verstehen. Es ruft Funktionen aus /mcst/bin/source ab, was so etwas wie eine Funktionsbibliothek ist. Ich habe es nicht eingefügt (44 KB).

#!/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

Aber vielleicht habe ich etwas nicht verstanden? Vielleicht kann jemand in den Kommentaren erklären: Wie sorgt dieses Skript für eine sichere und zuverlässige Datensicherung? [TBD]

rsync ist übrigens im Add-on enthalten. Repositories. Version 3.1.3. Ich denke, dass die Verwendung von rsync immer noch eine bessere Alternative zur Anwendung /mcst/bin/backup ist.

Als nächstes beschloss ich, ein neues zu verwenden Veeam Agent für Linux. Jemand wird fragen: „Was haben Veeam und Importsubstitution damit zu tun?“ Ja, es ist nicht im Register, aber es ist von FSTEC zertifiziert, was bedeutet, dass es mangels Alternativen verwendet werden kann. Verbringen Sie fünfzehn Minuten mit Alternativen von RegistryIch konnte 3 Links für das Wort „Backup“ finden (keiner bezog sich auf meine Frage zum Wort „Reserve“). Ich habe diese Programme nicht eingehend analysiert und werde daher nicht versuchen, zu beurteilen, wie geeignet sie für die Sicherung von Linux-Rechnern sind. Wer es braucht, wird sein eigenes Fazit ziehen und es in den Kommentaren teilen.

Die dritte Stufe — Installation von Veeam Agent für Linux.
Veeam Agent für Linux besteht also aus zwei Paketen: dem Veeamsnap-Kernelmodul (übrigens Quelle hier) und proprietären User-Space-Code in Form des Veeam-Pakets.

Es gab ein kleines Problem bei der Installation des Kernelmoduls – das fehlende dkms-Paket. Dies ist ein Dienst, der es Ihnen ermöglicht, Kernel-Module aus dem Quellcode zu erstellen. In der Regel ist es auf allen Deb-Distributionen verfügbar. Ich musste es von einem Deb-Repository eines Drittanbieters herunterladen. Eine Sache, die mich gefreut hat, ist, dass das Paket nicht von der Architektur abhängt und daher wie ein natives Paket passt. Warum wurde es nicht in die Liste der verfügbaren Pakete aufgenommen bzw. wurde es nicht entwickelt [TBD]? Möglicherweise wird davon ausgegangen, dass niemand Nicht-MCST-Kernelmodule erstellen und ausführen sollte. Hier gibt es tatsächlich eine Diskrepanz, da es Linux-Header gibt. Das heißt, das Modul kann bei Bedarf manuell zusammengestellt und beim Start der Maschine per Skript gestartet werden. Ich denke, Sie sollten keine häufigen Updates von MCST erwarten [TBD].

„Okay, das Modul ist installiert – der schwierigste Teil ist vorbei“, dachte ich ... Das Veeam-Paket für das Deb-Repository ist für die amd64-Plattform und das Elbrus-Betriebssystem verfügt über eine x86_64-Plattform [TBD]. Der Unterschied liegt natürlich nur im Namen, aber dieser Unterschied führt dazu, dass fast alle Pakete aus Deb-Repositories von Drittanbietern mit dem Elbrus-Betriebssystem nicht kompatibel sind. Dieses lästige Missverständnis lässt sich ganz einfach beseitigen: Einfach das Paket zerlegen, die Angaben zur Architektur korrigieren und wieder zusammenbauen. Wie kann man das machen Habe es gegoogelt sofort.

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

Ein weiteres Problem sind Abhängigkeiten. Die notwendigen Dateien scheinen vorhanden zu sein, die Pakete jedoch nicht. Es entstand der Eindruck, dass sich die Namen der Pakete von ihren „importierten Gegenstücken“ unterschieden. Möglicherweise sind die Bibliotheken anders verpackt. Ich ging nicht zu sehr ins Detail, entfernte fast alle Abhängigkeiten und die Installation ging weiter.

Dann traten Probleme mit dem Dienst-Startcode auf. Das Skript /lib/init/vars.sh fehlte. Aus irgendeinem Grund kommt Elbrus ohne aus, deshalb werden wir es auch entfernen. Als nächstes mussten wir die Nachrichtenausgabefunktion ersetzen: Die Funktionen log_daemon_msg und log_end_msg fehlten. Nachdem ich in der Datei /lib/lsb/init-functions herumgestöbert habe, habe ich die Funktion log_success_msg gefunden – sie wird uns für Experimente gut geeignet sein. Übrigens steht in der Datei /lib/lsb/init-functions die Zeile „# Source SuSE`s rc Functions“ am Anfang der Datei [TBD].

Nach solch grober Verarbeitung des Pakets mit einer Datei wurde die Sicherung der gesamten Maschine auf der NFS-Freigabe erfolgreich gestartet. Auch der Backup-Mount war erfolgreich. Daher glaube ich, dass für die Sicherung einer Maschine mit dem Elbrus PDK, das man „einfach so“ unverbindlich herunterlädt, der Veeam Agent für Linux auf jeden Fall geeignet ist. Auch nach all den Änderungen mit einer Datei.

Natürlich wird das Elbrus OS-Distributionskit nicht offiziell unterstützt, da es nicht in der Liste der unterstützten Versionen enthalten ist. Darüber hinaus wurde der Veeam Agent für Linux von der QA-Abteilung darauf nicht getestet, also diejenigen. Es gibt keinen Support (zumindest zum Zeitpunkt der Veröffentlichung des Artikels).

Ich hoffe, dass der Artikel denjenigen nützlich sein wird, die versuchen, die Verordnung Nr. 334 vom 29.06.2017. Juni XNUMX umzusetzen. Meins für dich... [TBD].

Source: habr.com

Kommentar hinzufügen